Cypress 测试隔离和数据管理怎么做?
Cypress 默认每个 it 块前会重置浏览器状态(清 cookie、localStorage、sessionStorage),Cypress 12+ 开启 testIsolation: true 后更强——每次测试前自动 cy.visit() 恢复初始页面。数据管理分三层:fixtures 管理静态数据、cy.request() + 自定义命令做动态数据创建、cy.task() 操作数据库清理。核心原则:测试不依赖执行顺序,每个测试自给自足。
追问
cy.session() 怎么用?和 beforeEach 中登录有什么区别? cy.session() 缓存登录后的 cookie 和 localStorage,同一 spec 内重复使用时不重新登录,显著加速测试。而 beforeEach 每次都执行完整登录流程。session 在 spec 间不共享(Cypress 12+ 的限制),跨 spec 需配合 cy.request 预置状态。
testIsolation: true 和 false 各适合什么场景? true(默认)适合功能测试,保证每个用例干净状态;false 适合需要跨测试保持状态的端到端流程测试(如多步向导),但需手动在 beforeEach 中清理关键状态。
fixtures 和 cy.task() 生成数据怎么选? fixtures 适合不变的测试输入(表单数据、API 响应模板);cy.task() 适合需要与后端交互的动态数据(创建测试用户、插入数据库记录),task 在 Node 环境执行,能直连数据库。
如何保证并行执行时测试数据不冲突?
用唯一标识生成数据:Date.now() 或 Cypress._.random(),避免固定用户名。测试结束在 afterEach 中通过 cy.request 或 cy.task 清理自己创建的数据,不依赖全局 reset。
写段代码
javascript// cy.session 加速登录 + fixtures 管理数据 Cypress.Commands.add('login', (role) => { cy.session(role, () => { cy.fixture('users').then((u) => { cy.request('POST', '/api/login', u[role]); }); }); });