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

如何在Cypress测试间保留登录状态并跨Spec文件共享数据

Cypress跨Spec文件共享数据的解决方案

方案1:通过Fixture文件读写(持久化存储)

Fixture文件是Cypress默认支持的持久化文件,适合需要长期保存或跨测试会话复用的数据。创建用户后将ID写入fixture,后续测试文件直接读取即可。

写入数据(test-user.cy.ts)

// 创建用户请求
cy.request('POST', '/api/users', { name: 'Test User', email: 'test@example.com' })
  .then((response) => {
    const userId = response.body.id;
    // 将ID写入fixture文件,路径默认在cypress/fixtures下
    cy.writeFile('cypress/fixtures/shared-test-data.json', { userId });
  });

读取数据(test-company.cy.ts)

// 读取fixture中的用户ID
cy.fixture('shared-test-data.json').then((data) => {
  const userId = data.userId;
  // 使用ID创建关联公司
  cy.request('POST', '/api/companies', {
    name: 'Test Company',
    ownerId: userId
  });
});

注意:如果需要存储多个数据,可通过扩展对象的方式写入,避免覆盖原有内容:

cy.readFile('cypress/fixtures/shared-test-data.json').then((existingData) => {
  cy.writeFile('cypress/fixtures/shared-test-data.json', {
    ...existingData,
    newUserId: response.body.id
  });
});

方案2:通过Node端Task共享(串行测试推荐)

Cypress的cy.task可以在Node环境中执行代码,而Node环境在串行测试时是持续运行的,因此可以在Node端维护一个全局变量存储共享数据。之前你尝试cy.task未解决,大概率是没正确在Node端维护存储变量。

配置Task(cypress.config.ts)

import { defineConfig } from 'cypress';

// Node端全局变量,用于存储跨Spec数据
let sharedTestData: Record<string, any> = {};

export default defineConfig({
  e2e: {
    setupNodeEvents(on) {
      on('task', {
        // 存储数据的Task
        setSharedData: (data) => {
          sharedTestData = { ...sharedTestData, ...data };
          return null;
        },
        // 获取数据的Task,可指定key或返回全部数据
        getSharedData: (key?: string) => {
          return key ? sharedTestData[key] : sharedTestData;
        }
      });
    }
  }
});

存储数据(test-user.cy.ts)

cy.request('POST', '/api/users', { name: 'Test User' })
  .then((response) => {
    cy.task('setSharedData', { userId: response.body.id });
  });

读取数据(test-company.cy.ts)

cy.task('getSharedData', 'userId').then((userId) => {
  cy.request('POST', '/api/companies', { name: 'Test Co', userId });
});

注意:此方案仅适用于串行测试,如果开启并行测试,每个测试进程的Node环境独立,数据无法共享。


方案3:利用cy.session的跨Spec缓存(Cypress 12+)

你已经在使用cy.session维持登录状态,Cypress 12+支持cacheAcrossSpecs选项,开启后session数据会在所有Spec文件中共享,可将用户ID存入session。

配置带缓存的Session(commands.ts)

Cypress.Commands.add('login', (credentials) => {
  cy.session('user-auth', () => {
    cy.request('POST', '/api/login', credentials)
      .then((response) => {
        const userId = response.body.userId;
        // 将ID存入session的内部存储
        Cypress.session.currentSession?.set('userId', userId);
        // 设置登录凭证(如token)到localStorage
        window.localStorage.setItem('authToken', response.body.token);
      });
  }, {
    cacheAcrossSpecs: true // 开启跨Spec缓存
  });
});

存储/读取数据

test-user.cy.ts(创建新用户并更新session)

cy.login(Cypress.env('testCredentials'));
// 创建新用户并将ID存入session
cy.request('POST', '/api/users', { name: 'New Test User' })
  .then((response) => {
    Cypress.session.currentSession?.set('newUserId', response.body.id);
  });

test-company.cy.ts(读取session中的ID)

cy.login(Cypress.env('testCredentials')); // 因session缓存,不会重复执行登录逻辑
const newUserId = Cypress.session.currentSession?.get('newUserId');
// 使用ID创建公司
cy.request('POST', '/api/companies', { name: 'Test Co', userId: newUserId });

方案4:修改全局环境变量(临时场景)

Cypress的Cypress.env()默认是会话级的,跨Spec会重置,但通过Cypress.config('env')修改全局环境变量,可实现跨Spec共享(仅串行有效)。

存储数据(test-user.cy.ts)

cy.request('POST', '/api/users', { name: 'Test User' })
  .then((response) => {
    // 更新全局环境变量
    Cypress.config('env', {
      ...Cypress.config('env'),
      userId: response.body.id
    });
  });

读取数据(test-company.cy.ts)

const userId = Cypress.env('userId');
cy.request('POST', '/api/companies', { name: 'Test Co', userId });

注意:此方案不推荐用于长期场景,因为环境变量会随测试会话结束重置,且并行测试无效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:22:08