如何在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
相关产品推荐
相关产品推荐

