Cypress 10如何跨所有测试用例持久化存储会话状态
问题根因
Cypress 10 及以上版本默认开启测试隔离机制,每个it测试块执行前会自动清空所有Cookie、localStorage、sessionStorage,重置页面上下文,这就是你观察到每个测试块跑完Cookie就丢失的核心原因,和代码里有没有写cy.visit没有关系。
方案1:全流程共享会话(无需改动现有测试逻辑)
如果你不需要每个测试用例完全独立,只是想让整个Suite下的所有测试步骤从头到尾共享同一份登录状态,直接关闭测试隔离即可,改造成本为0:
- 在测试Suite/Describe的配置项里加
testIsolation: false,原有代码逻辑完全不用动
// 只需要给Suite加第二个配置参数,其余代码原封不动 Suite('My First Test', { testIsolation: false }, () => { before(() => { prepare(); cy.visit('https://barrythrill.com'); cy.get('.start-from-zero').should('be.visible').click(); // ... 你原来的逻辑 }); Scenario('My first test cases', () => { Given('we are on the webpage'); When('we save the list', () => { // 原有逻辑不变 }); Then('we are able to open all-list and close it', () => { // 原有逻辑不变 }); When('we remove the list through API', () => { // 原有逻辑不变 }); Then('we should still be logged in', () => { // 原有逻辑不变,登录态会全程保留 }); }); });
关闭测试隔离后,before钩子只会在整个Suite开始时执行一次,所有测试步骤共享同一个页面上下文、Cookie和本地存储,不会在每个测试块前重置状态,完全匹配你要的全程保持登录的需求。
方案2:用cy.session持久化会话(官方推荐方案)
如果你想保留默认的测试隔离能力(避免不同用例的状态互相污染),又不想每个it块重复走登录流程,就用cy.session缓存登录态:
- 先把触发自动登录、生成BAR Cookie的逻辑抽成独立方法
const doAutoLogin = () => { cy.visit('https://barrythrill.com'); cy.get('.start-from-zero').should('be.visible').click(); // 放入你原来save list触发自动登录的全部逻辑 // ... // 校验BAR Cookie存在,确认登录成功 cy.getCookie('BAR').should('exist'); }
- 在
beforeEach钩子里用cy.session缓存并自动恢复会话,不需要每个测试块重复写登录逻辑,也不用每个块都调用cy.visit
Suite('My First Test', () => { beforeEach(() => { // 用唯一id标记登录会话,第一次执行后会自动缓存所有Cookie、存储数据 cy.session('barrythrill-auto-login', () => { doAutoLogin(); }, { // 会话有效性校验:每次恢复缓存前检查BAR Cookie是否存在,失效就自动重新登录 validate: () => { cy.getCookie('BAR').should('exist'); } }) // 统一在这里处理页面跳转,所有测试块执行前都会自动打开目标页,不需要重复写visit cy.visit('https://barrythrill.com'); }) // 你原来的所有Scenario、Given/When/Then逻辑完全保留,不需要额外修改 Scenario('My first test cases', () => { Given('we are on the webpage'); When('we save the list', () => { // 原有逻辑 }); Then('we are able to open all-list and close it', () => { // 原有逻辑 }); When('we remove the list through API', () => { // 原有逻辑 }); Then('we should still be logged in', () => { // session会自动恢复缓存的BAR Cookie,登录态全程有效 }); }); });
这个方案的优势是既保留了测试隔离的安全性,不会出现上个用例的状态污染下个用例的问题,又能复用登录态减少重复操作。就算BAR Cookie是动态生成的也不影响,session会完整缓存第一次登录拿到的Cookie值,后续测试块直接复用即可。
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

