如何在某个Cypress测试失败后继续执行后续测试?
问题描述
我在Node.js环境中有多组Cypress测试,可通过npm run命令单独执行(比如npm run home-page-test),也能用npm run home-page-test && npm run about-page-test && npm run contact-page-test的方式串联执行。
当前遇到的问题是:如果某测试文件(spec)里的某个it块执行失败,该spec文件的所有it块仍会全部执行完,但Node/NPM不会继续执行后续的测试文件。比如home-page-test里第3个it块断言失败后,该文件的7个it块都会跑完,但串联命令里的下一个npm run about-page-test完全不会执行。
测试代码示例:
// home-page-test.spec.js describe('I am on the Home page', () => { it(`Does this`, () => { // 测试通过 }) it(`Does something else`, () => { // 测试通过 }) it(`Does SOMETHING THAT FAILS`, () => { // 测试失败 }) it(`Does something else`, () => { // 测试通过 }) // 其他测试... }); // about-page-test.spec.js // 因为上面的it块失败,这个文件的测试不会运行 describe('I am on the About page', () => { it(`Does this`, () => { // 测试通过 }) // 其他测试... });
解决方案
问题的核心是:当Cypress测试失败时,npm run命令会返回非0的退出码,而shell里的&&逻辑是只有前面的命令成功(返回0)才会执行后续命令。要实现失败后继续执行,有以下几种方法:
方法一:使用npm-run-all工具(推荐,跨平台)
这是最可靠的跨平台方案,能串行执行所有测试命令,即使某条命令失败也会继续执行,最后还能返回正确的总体退出码(方便CI环境检测测试结果)。
- 安装依赖:
npm install npm-run-all --save-dev
- 修改
package.json的scripts字段,新增一个批量执行的命令:
"scripts": { "home-page-test": "cypress run --spec cypress/e2e/home-page-test.spec.js", "about-page-test": "cypress run --spec cypress/e2e/about-page-test.spec.js", "contact-page-test": "cypress run --spec cypress/e2e/contact-page-test.spec.js", "run-all-tests": "run-s home-page-test about-page-test contact-page-test --continue-on-error" }
run-s表示串行执行命令--continue-on-error表示即使某条命令失败,也继续执行后续命令
- 执行所有测试:
npm run run-all-tests
方法二:通过shell命令调整执行逻辑
方法2.1:使用分号;替代&&
在类Unix系统(Linux/macOS)或Git Bash中,可以用分号分隔命令,不管前面的命令是否失败,都会执行后续命令:
npm run home-page-test ; npm run about-page-test ; npm run contact-page-test
注意:Windows的cmd终端不支持这种写法,PowerShell中可以用;但行为略有差异。
方法2.2:添加|| true强制命令返回成功
在每个npm run命令后添加|| true,让shell认为该命令始终执行成功,从而继续执行后续命令:
npm run home-page-test || true && npm run about-page-test || true && npm run contact-page-test || true
缺点:这种写法会让整个串联命令的最终退出码为0,即使有测试失败,CI环境可能无法检测到测试出错。
方法三:调整Cypress配置(不推荐)
Cypress默认会在测试失败时返回非0退出码,如果强制让它返回0,虽然能让后续命令执行,但会丢失测试失败的状态,无法在CI中正确判断结果,所以不建议使用。
内容的提问来源于stack exchange,提问作者MeltingDog

