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

如何在多个Cypress测试文件间共享变量(如认证令牌)?

跨Cypress测试文件共享认证令牌的解决方案

你遇到的问题是因为Cypress每个测试文件会独立初始化运行环境,通过Cypress.env()设置的变量无法跨文件持久保留。下面是几个实用的解决办法:

方法1:读写本地文件持久化令牌

在第一个测试文件中将令牌写入本地文件,其他文件读取该文件获取令牌:

file1.js 修改后:

before(() => {
  cy.request({
    method: "POST",
    url: "rest/v1/auth/...",
    headers: Cypress.env("headers"),
    body: {
      // 你的认证参数
    },
  }).then((res) => {
    // 将令牌写入fixtures目录的JSON文件
    cy.writeFile("cypress/fixtures/auth_token.json", {
      token: res.body.token
    });
  });
});

describe("01_authentication", () => {
  it("Should login", () => {
    cy.fixture("auth_token.json").then((tokenData) => {
      cy.request({
        method: "POST",
        url: "rest/v1/...",
        headers: Object.assign(Cypress.env("headers"), {
          Authorization: `Bearer ${tokenData.token}`,
        }),
        body: {
          email: Cypress.env("email"),
          password: Cypress.env("password"),
        },
      }).then((res) => {
        expect(res.status).to.equal(200);
      });
    });
  });
});

file2.js 修改后:

describe("02_submit", () => {
  it("Should submit", () => {
    cy.fixture("auth_token.json").then((tokenData) => {
      cy.request({
        method: "POST",
        url: "rest/v1/submit/...",
        headers: Object.assign(Cypress.env("headers"), {
          Authorization: `Bearer ${tokenData.token}`,
        }),
        body: {
          email: Cypress.env("email"),
          password: Cypress.env("password"),
        },
      }).then((res) => {
        expect(res.status).to.equal(200);
      });
    });
  });
});

方法2:用Cypress会话(Cypress 12+推荐)

Cypress的会话功能支持跨测试文件缓存登录状态,无需手动处理令牌存储:

先在cypress/support/e2e.js中启用跨文件会话缓存:

Cypress.session.defaults({
  cacheAcrossSpecs: true, // 开启跨文件状态缓存
});

file1.js 修改后:

before(() => {
  cy.session("auth", () => {
    cy.request({
      method: "POST",
      url: "rest/v1/auth/...",
      headers: Cypress.env("headers"),
      body: {
        // 你的认证参数
      },
    }).then((res) => {
      Cypress.env("auth_token", res.body.token);
    });
  });
});

describe("01_authentication", () => {
  it("Should login", () => {
    cy.request({
      method: "POST",
      url: "rest/v1/...",
      headers: Object.assign(Cypress.env("headers"), {
        Authorization: `Bearer ${Cypress.env("auth_token")}`,
      }),
      body: {
        email: Cypress.env("email"),
        password: Cypress.env("password"),
      },
    }).then((res) => {
      expect(res.status).to.equal(200);
    });
  });
});

file2.js 无需额外修改,直接使用Cypress.env("auth_token")即可获取令牌,会话会自动跨文件保留状态。

方法3:全局前置钩子(所有测试共享登录)

如果所有测试都需要该认证令牌,可以将登录逻辑放到全局前置钩子中,在所有测试文件执行前完成登录:

在cypress/support/e2e.js中添加:

before(() => {
  cy.request({
    method: "POST",
    url: "rest/v1/auth/...",
    headers: Cypress.env("headers"),
    body: {
      // 你的认证参数
    },
  }).then((res) => {
    Cypress.env("auth_token", res.body.token);
  });
});

之后所有测试文件中都能直接使用Cypress.env("auth_token")获取令牌。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:01:25