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

Cypress自定义测试执行顺序及独立测试场景优化咨询

结论:当前的导入方案不可行,会完全破坏测试的独立性,必须优化

你的核心需求是让「连接应用」「连接聊天」「发送消息」三个步骤既能独立测试,又能在全局运行时按预期顺序执行,但目前通过导入前置文件的方式,导致单个测试文件被运行时会连带执行所有依赖的前置测试,这完全违背了“独立测试”的设计初衷,而且后续维护成本极高——比如修改chat_app_connect.spec.js的任何测试,都会影响另外两个文件的执行结果。

下面是几种针对性的优化方案,按推荐程度排序:


1. 抽离前置步骤为可复用的Cypress命令(最推荐)

把重复的前置操作封装成自定义命令,放在cypress/support/commands.js中(这个文件会自动被Cypress加载),这样每个测试文件可以按需调用,既保证独立性,又避免代码重复。

步骤1:封装自定义命令
在cypress/support/commands.js中添加:

// 封装连接聊天应用的完整流程
Cypress.Commands.add('connectChatApp', () => {
  cy.visit('https://chat.page..');
  cy.contains('Live Support');
  cy.contains('Hello, Stranger');
  cy.url().should('include', '/hello');
  cy.get('circle').should('have.class', 'positive');
});

// 封装连接聊天会话的完整流程
Cypress.Commands.add('connectChat', () => {
  cy.get('input').clear().type('E2E Test');
  cy.get('.submit-button').click();
  cy.url().should('equal', 'https://client.dev.octopus.chat/');
  cy.get('circle', { timeout: 5000 }).should('have.class', 'positive');
});

步骤2:修改测试文件,实现独立测试

  • chat_app_connect.spec.js(仅测试连接应用):
describe('Server Connecting Test', () => {
  it('Successfully connects to the chat app server', () => {
    cy.connectChatApp();
  });
});
  • chat_connect.spec.js(依赖连接应用,可独立运行):
describe('Chat Connecting Test', () => {
  // 每个测试用例执行前先完成应用连接
  beforeEach(() => {
    cy.connectChatApp();
  });

  it('Successfully initiates a chat session', () => {
    cy.connectChat();
  });
});
  • chatting.spec.js(依赖前两步,可独立运行):
describe('Chatting Tests', () => {
  beforeEach(() => {
    cy.connectChatApp();
    cy.connectChat();
  });

  it('Sends and displays a message correctly', () => {
    cy.get('#chat-message')
      .clear()
      .type('Hey I\'m a test message{enter}');
    cy.get('.message-list')
      .should('contain', 'Hey I\'m a test message');
  });
});

这样修改后,每个文件都可以单独运行(比如只跑chatting.spec.js时,只会执行当前文件的测试+前置命令,不会连带跑另外两个文件的所有测试),同时代码复用性大幅提升。


2. 配置全局测试执行顺序(解决「run all specs」的排序问题)

如果需要点击「run all specs」时按你期望的步骤顺序执行,而不是默认的字母顺序,可以在cypress.config.js中指定specPattern的顺序:

const { defineConfig } = require('cypress');

module.exports = defineConfig({
  e2e: {
    // 按指定顺序加载测试文件
    specPattern: [
      'cypress/e2e/chat_app_connect.spec.js',
      'cypress/e2e/chat_connect.spec.js',
      'cypress/e2e/chatting.spec.js'
    ],
    // 其他配置项...
  },
});

这样全局运行时就会严格按照「连接应用→连接聊天→发送消息」的顺序执行。


3. 利用cy.session提升测试效率(可选)

如果测试执行速度较慢,可以用Cypress的cy.session缓存连接状态,避免每次测试都重复执行相同的前置步骤,同时不影响测试独立性:
修改commands.js中的命令:

Cypress.Commands.add('connectChatApp', () => {
  // 缓存应用连接状态,同一session下只会执行一次
  cy.session('chat-app-connection', () => {
    cy.visit('https://chat.page..');
    cy.contains('Live Support');
    cy.contains('Hello, Stranger');
    cy.url().should('include', '/hello');
    cy.get('circle').should('have.class', 'positive');
  });
});

Cypress.Commands.add('connectChat', () => {
  cy.session('chat-session', () => {
    cy.connectChatApp(); // 依赖应用连接
    cy.get('input').clear().type('E2E Test');
    cy.get('.submit-button').click();
    cy.url().should('equal', 'https://client.dev.octopus.chat/');
    cy.get('circle', { timeout: 5000 }).should('have.class', 'positive');
  });
});

这样在同一个测试会话中,Cypress会复用之前的连接状态,大幅减少重复操作的时间。


总结

当前的导入方案完全不可行,会导致测试耦合严重、独立性丧失。通过封装自定义命令+配置执行顺序+可选的session缓存,既能满足「独立测试单个步骤」的需求,又能保证全局运行时的顺序符合预期,同时提升代码可维护性和测试效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:41:34