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

Cypress测试中如何在多个测试用例间保持动态变量不重置

Cypress测试共享单次生成的随机变量方案

你遇到的问题原因如下:

  1. 直接在describe块内定义const变量时,Cypress运行测试时每次解析测试用例都会重新执行describe回调内的变量初始化逻辑,导致每个it拿到的都是新生成的值。
  2. 放在before钩子中不生效,是因为你把变量定义在了before的局部作用域内,外部的it测试用例无法访问。

可行解决方案

下面提供3种常用的实现方式,按需选择即可:

方案1:顶层声明变量+before钩子赋值

最直观的写法,不需要调整函数声明规则:

// 随机数生成函数保留
function getRandomArbitrary(min, max, decimals) {
  return (Math.random() * (max - min) + min).toFixed(decimals);
}

describe('Reflect changes from X to the Y', () => {
  // 先在describe顶层声明变量
  let termCap, termCapFee;

  // before钩子在所有测试用例执行前仅运行1次,在这里完成赋值
  before(() => {
    termCap = getRandomArbitrary(0.01, 0.3, 2);
    termCapFee = getRandomArbitrary(0.01, 0.3, 2);
  });

  it('填写随机数值', () => {
    // 直接访问已经赋值的变量即可
    cy.get('#term-cap-input').type(termCap);
    cy.get('#term-cap-fee-input').type(termCapFee);
    cy.get('#submit-btn').click();
  });

  it('跳转页面校验数值', () => {
    cy.get('#show-term-cap').should('have.text', termCap);
    cy.get('#show-term-cap-fee').should('have.text', termCapFee);
  });
});

方案2:挂载到测试上下文this

适合需要在多个钩子间共享数据的场景,注意要使用普通函数替代箭头函数:

describe('Reflect changes from X to the Y', function() { // 这里不能用箭头函数
  before(function() {
    this.termCap = getRandomArbitrary(0.01, 0.3, 2);
    this.termCapFee = getRandomArbitrary(0.01, 0.3, 2);
  });

  it('填写随机数值', function() { // 这里不能用箭头函数
    cy.get('#term-cap-input').type(this.termCap);
  });

  it('跳转页面校验数值', function() { // 这里不能用箭头函数
    cy.get('#show-term-cap').should('have.text', this.termCap);
  });
});

方案3:存储到Cypress环境变量

适合跨describe、甚至跨测试文件共享变量的场景:

describe('Reflect changes from X to the Y', () => {
  before(() => {
    Cypress.env('termCap', getRandomArbitrary(0.01, 0.3, 2));
    Cypress.env('termCapFee', getRandomArbitrary(0.01, 0.3, 2));
  });

  it('填写随机数值', () => {
    cy.get('#term-cap-input').type(Cypress.env('termCap'));
  });

  it('跳转页面校验数值', () => {
    cy.get('#show-term-cap').should('have.text', Cypress.env('termCap'));
  });
});

额外注意事项

如果你使用Cypress 12及以上版本,默认开启了testIsolation配置,每个it执行后会自动清空页面上下文、刷新页面,如果你需要测试用例间保留页面操作状态,可以在describe级别关闭该配置:

describe('Reflect changes from X to the Y', { testIsolation: false }, () => {
  // 测试逻辑
});

内容的提问来源于stack exchange,提问作者Ton Borrell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:54:10