如何在Cypress中保持状态?实现账户信息跨测试共享
复用测试账户的几种可行方案
1. 使用 cy.session() 官方推荐(Cypress 12+)
这是Cypress官方提供的会话复用功能,专门用来保存登录状态或账户信息,从根源避免重复创建账户的耗时操作。
步骤:
- 在
cypress/support/e2e.js(或你的项目支持文件)中配置全局会话,或直接在测试文件的全局钩子中使用:
before(() => { cy.session('reusable-account', () => { // 仅执行一次的账户创建+登录逻辑 cy.request({ method: 'POST', url: '/api/accounts', // 替换为你的账户创建API地址 body: { email: 'test-reuse@example.com', password: 'test123' } }).then((response) => { // 将账户信息存入Cypress环境变量,方便后续测试调用 Cypress.env('REUSABLE_ACCOUNT', response.body); }); // 如果需要前端登录,在此执行登录步骤 cy.visit('/login'); cy.get('#email').type(Cypress.env('REUSABLE_ACCOUNT').email); cy.get('#password').type('test123'); cy.get('button[type="submit"]').click(); cy.url().should('include', '/dashboard'); // 确认登录状态生效 }); });
- 后续测试用例直接复用会话或调用环境变量中的账户信息:
it('测试账户资料页', () => { cy.session('reusable-account'); // 恢复已保存的会话,无需重复创建账户 cy.visit('/profile'); cy.get('#email-display').should('have.text', Cypress.env('REUSABLE_ACCOUNT').email); });
注意:cy.session()会自动保存cookie、localStorage等状态,确保后续测试处于已登录状态,同时账户信息存在环境变量中可随时调用。
2. 全局钩子 + Cypress环境变量(兼容低版本Cypress)
如果你的Cypress版本低于12,可以用全局before()钩子在所有测试启动前创建一次账户,并存入环境变量:
// 在cypress/support/e2e.js中添加全局钩子 before(() => { // 仅在所有测试开始前执行一次账户创建 cy.request({ method: 'POST', url: '/api/accounts', body: { email: 'test-reuse@example.com', password: 'test123' } }).then(res => { Cypress.env('REUSABLE_ACCOUNT', res.body); // 可选:提前执行登录,保存登录状态 cy.login(Cypress.env('REUSABLE_ACCOUNT').email, 'test123'); // 假设你有自定义登录命令 }); });
之后在任意测试文件中,直接通过Cypress.env('REUSABLE_ACCOUNT')获取账户信息即可,默认情况下Cypress会保留cookie状态,无需重复登录。
3. 自定义命令 + 缓存判断
也可以编写自定义命令,自动判断账户是否已存在,不存在才执行创建逻辑:
// 在cypress/support/commands.js中添加自定义命令 Cypress.Commands.add('getReusableAccount', () => { if (Cypress.env('REUSABLE_ACCOUNT')) { // 账户已存在,直接返回 return cy.wrap(Cypress.env('REUSABLE_ACCOUNT')); } else { // 账户不存在,创建后存入环境变量 return cy.request({ method: 'POST', url: '/api/accounts', body: { email: 'test-reuse@example.com', password: 'test123' } }).then(res => { Cypress.env('REUSABLE_ACCOUNT', res.body); return cy.wrap(res.body); }); } });
在测试中调用该命令:
it('测试购物车功能', () => { cy.getReusableAccount().then(account => { cy.login(account.email, 'test123'); // 执行具体测试逻辑 }); });
为什么cy.state()不可行?
cy.state()是Cypress的内部私有API,仅用于访问框架自身的内部状态(比如当前测试上下文、DOM状态等),并不是用来存储自定义测试数据的接口。它的结构和行为会随Cypress版本迭代发生变化,官方明确不推荐在业务测试中使用,因此用它保存账户信息必然不稳定。
内容的提问来源于stack exchange,提问作者anichols
相关产品推荐
相关产品推荐

