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

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缓存登录态:

  1. 先把触发自动登录、生成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');
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:42:52