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

如何让Cypress在CI中跳过执行超时的卡顿测试?

解决Cypress单个测试超时卡顿后自动跳过并继续执行的方案

1. 基础超时配置:设置Cypress全局测试超时

首先在cypress.config.js中配置单个测试用例的最大执行时间,让Cypress能识别并处理超时场景:

module.exports = defineConfig({
  e2e: {
    // 单个测试用例超时时间(15分钟=900000毫秒)
    testTimeout: 900000,
    // 单个命令的超时时间(可根据业务调整,比如1分钟)
    defaultCommandTimeout: 60000,
    // 页面加载超时时间
    pageLoadTimeout: 120000,
  },
});

默认情况下,单个测试超出testTimeout时,Cypress会将其标记为失败,然后自动继续执行下一个测试用例。如果你的场景中这个机制没生效,可能是极端卡顿导致进程无响应,需要结合下面的自定义逻辑。

2. 自定义超时监控:强制终止卡顿测试并标记跳过

如果默认超时机制无法触发(比如页面完全挂起),可以在全局钩子中手动监控测试执行时长,超时后强制终止当前测试:

在cypress/support/e2e.js中添加以下代码:

let testTimeoutTimer;

beforeEach(() => {
  // 设置15分钟超时阈值
  const timeoutMs = 900000;
  testTimeoutTimer = setTimeout(() => {
    // 终止当前测试执行
    Cypress.runner.stop();
    // 标记测试为跳过(可选,用于报告区分)
    if (Cypress.currentTest) {
      Cypress.currentTest.state = 'skipped';
    }
    cy.log('测试执行超时,自动跳过');
  }, timeoutMs);
});

afterEach(() => {
  // 测试正常完成后清除定时器
  clearTimeout(testTimeoutTimer);
});

这个逻辑会在每个测试开始时启动定时器,一旦超时就强制停止当前测试,Cypress会自动切换到下一个测试用例,不会阻塞整个套件。

3. Jenkins层面兜底:避免进程挂起导致整个构建停滞

如果Cypress进程本身因为极端卡顿完全无响应,Cypress自身的超时机制会失效,此时可以在Jenkins构建脚本中给每个测试文件单独设置超时:

# 遍历所有测试文件,逐个执行,每个测试最多执行16分钟(留1分钟缓冲)
for spec_file in cypress/e2e/**/*.cy.js; do
  echo "开始执行测试:$spec_file"
  timeout 960s npx cypress run --spec "$spec_file"
  echo "测试 $spec_file 执行完成/超时,继续下一个"
done

通过timeout命令限制单个测试进程的执行时间,即使某个测试完全卡住,timeout会强制终止该进程,脚本会继续执行下一个测试文件,彻底避免整个Jenkins构建停滞。

4. 测试报告优化(可选)

如果需要在测试报告中明确区分“超时跳过”的测试,可以结合Cypress报告插件(如mochawesome),在超时逻辑中添加自定义属性:

// 在超时触发时添加自定义标记
Cypress.currentTest._timeoutSkipped = true;

后续生成报告时可以读取该标记,单独展示超时跳过的测试用例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:41:05