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

