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

如何拆分长Cypress测试?使用it导致页面刷新丢失表单数据

拆分多表单Cypress测试用例的解决方案

当然可以拆分,核心是解决Cypress每个it块默认重置上下文导致表单数据丢失的问题,以下是几种可行方案:

方案1:使用cy.session()持久化会话与前置状态

Cypress 12+ 提供的cy.session()可以保存会话状态(比如登录态),同时你可以在会话初始化时完成前序表单的填充,后续it块复用这个会话:

describe('多表单组测试', () => {
  beforeEach(() => {
    cy.session('pre-filled-forms', () => {
      // 1. 完成登录(如果需要)
      cy.login('username', 'password');
      // 2. 填充前序需要保留的表单(比如第1到第n-1个表单)
      cy.fillForm1();
      cy.fillForm2();
      // ... 直到当前it块需要的前置表单
    });
    // 每次it块开始时,跳转到表单组页面(会话会恢复之前的状态)
    cy.visit('/form-group');
  });

  it('测试表单3的提交验证', () => {
    cy.fillForm3();
    cy.submitForm3();
    cy.verifyForm3Success();
  });

  it('测试表单4的字段校验', () => {
    cy.fillForm4WithInvalidData();
    cy.verifyForm4ErrorMessages();
  });

  // 剩下的表单测试同理
});

注意:cy.session()会在会话过期或状态变化时重新执行回调,确保前序表单状态正确。

方案2:封装表单填充逻辑,在每个it块复用前置步骤

如果不想依赖会话功能,可以把每个表单的填充逻辑封装成自定义命令,每个it块开始时先完成所有前序表单的填充,再专注当前表单的测试:

// 在cypress/support/commands.js中定义自定义命令
Cypress.Commands.add('fillAllPreviousForms', (upToFormIndex) => {
  switch(upToFormIndex) {
    case 3:
      cy.fillForm1();
      cy.fillForm2();
      break;
    case 4:
      cy.fillForm1();
      cy.fillForm2();
      cy.fillForm3();
      break;
    // 其他情况同理
  }
});

// 测试文件
describe('多表单组测试', () => {
  beforeEach(() => {
    cy.login();
    cy.visit('/form-group');
  });

  it('测试表单1的必填字段', () => {
    cy.submitForm1WithoutRequiredFields();
    cy.verifyForm1RequiredErrors();
  });

  it('测试表单2的格式校验', () => {
    cy.fillForm1();
    cy.fillForm2WithInvalidFormat();
    cy.verifyForm2FormatErrors();
  });

  it('测试表单3的提交成功', () => {
    cy.fillAllPreviousForms(3);
    cy.fillForm3();
    cy.submitForm3();
    cy.verifyForm3Redirect();
  });
});

这种方式虽然会重复执行前序步骤,但每个it块完全独立,符合测试隔离原则,适合对测试独立性要求高的场景。

方案3:禁用Cypress的默认状态清除(不推荐)

可以在cypress.config.js中修改配置,禁止每个it块后清除cookie、localStorage或重置页面,但这会导致测试之间产生依赖,一旦某个测试失败,后续测试可能受影响:

// cypress.config.js
module.exports = {
  e2e: {
    setupNodeEvents(on, config) {
      on('before:browser:launch', (browser = {}, launchOptions) => {
        // 禁用页面重置(仅针对Chrome/Edge)
        if (browser.family === 'chromium') {
          launchOptions.args.push('--disable-site-isolation-trials');
        }
        return launchOptions;
      });
    },
    // 禁用自动清除cookie
    experimentalSessionAndOrigin: true,
    preserveOnce: true
  }
};

这种方式仅适合临时调试,不建议用于正式测试套件,因为破坏了测试的独立性。

方案4:单it块内拆分测试步骤(折中方案)

如果以上方案都不适用,可以在单个it块内用自定义命令或cy.log()标记每个表单的测试步骤,既保持逻辑清晰,又避免页面重置:

it('完成所有表单组测试', () => {
  cy.log('=== 测试表单1 ===');
  cy.fillForm1();
  cy.submitForm1();
  cy.verifyForm1Success();

  cy.log('=== 测试表单2 ===');
  cy.fillForm2();
  cy.submitForm2();
  cy.verifyForm2Success();

  // 剩下的表单测试同理
});

这种方式虽然是单个it块,但通过日志和步骤拆分,依然能清晰区分每个表单的测试逻辑,适合表单之间依赖极强的场景。

内容的提问来源于stack exchange,提问作者Reinaldo Burgos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:06:22