You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 12:35:16