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

如何在Cypress BDD场景间维持登录会话?

在Cypress跨场景维持登录会话的最优方案

针对你提出的每个场景重复登录的问题,以下是几个实用的解决方案,按推荐优先级排序:

1. 使用cy.session()缓存登录会话(官方推荐)

Cypress提供的cy.session()命令专门用来跨测试用例缓存会话状态,它会存储登录后的Cookie、LocalStorage等数据,后续用例无需重复执行登录流程,直接恢复会话即可,同时还能保证每个用例的初始状态干净,不会互相污染。

步骤:

  • 先在cypress/support/commands.js中封装带会话缓存的登录命令:
Cypress.Commands.add('login', () => {
  cy.session('user-authentication', () => {
    // 执行实际登录流程
    cy.visit('/login');
    cy.get('#username').type('你的测试账号');
    cy.get('#password').type('你的测试密码');
    cy.get('[type="submit"]').click();
    // 验证登录成功,确保会话有效
    cy.url().should('contain', '/dashboard');
  });
});
  • 在测试文件中,每个用例执行前调用该命令:
describe('站点操作测试', () => {
  beforeEach(() => {
    cy.login(); // 首次执行会登录,后续直接复用缓存会话
    cy.visit('/'); // 进入应用首页
  });

  it('Scenario1: 点击站点通知', () => {
    cy.get('[data-testid="site-notice"]').click();
  });

  it('Scenario2: 点击删除按钮', () => {
    cy.get('[data-testid="delete-button"]').click();
  });
});

2. 全局前置钩子before()一次性登录

如果所有测试场景都基于已登录状态,且不会修改登录状态(比如不会执行登出操作),可以用before()钩子在整个测试套件开始前只执行一次登录。

代码示例:

describe('站点操作测试', () => {
  before(() => {
    // 仅在整个测试套件开始时登录一次
    cy.visit('/login');
    cy.get('#username').type('你的测试账号');
    cy.get('#password').type('你的测试密码');
    cy.get('[type="submit"]').click();
    cy.url().should('contain', '/dashboard');
  });

  it('Scenario1: 点击站点通知', () => {
    cy.visit('/');
    cy.get('[data-testid="site-notice"]').click();
  });

  it('Scenario2: 点击删除按钮', () => {
    cy.visit('/');
    cy.get('[data-testid="delete-button"]').click();
  });
});

注意:如果某个用例执行了登出或修改登录状态的操作,后续用例会因为未登录而失败,所以仅适合无状态变更的场景。

3. 禁用默认状态清除(不推荐)

可以通过配置让Cypress保留特定Cookie或LocalStorage,但这会破坏测试用例的独立性,导致用例间状态互相污染,仅在特殊场景下临时使用。

配置示例(cypress.config.js):

const { defineConfig } = require('cypress');

module.exports = defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      // 保留所有包含"session"的Cookie
      Cypress.Cookies.defaults({
        preserve: /session/
      });
    },
  },
});

不推荐原因:测试用例的执行顺序会影响结果,比如前一个用例删除了数据,后一个用例可能会读取到修改后的状态,导致测试结果不可靠。


内容的提问来源于stack exchange,提问作者Manish B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:22:41