如何在多个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
相关产品推荐
相关产品推荐

