Cucumber测试失败但Travis构建仍通过的问题解决请求
Fixing Cucumber Exit Code Propagation in Travis CI Builds
我帮你梳理下问题根源,再给出具体的修复步骤:
问题核心
你遇到的情况是Cucumber测试明明失败了,但Travis CI构建却依然显示通过——这是因为Cucumber的非零退出码没有被正确传递到脚本末尾,导致整个e2e.test.sh脚本最终以最后一条清理命令的成功状态(退出码0)结束,yarn收到这个0状态后,也就向Travis返回了成功信号。
具体修复方案
我们需要捕获Cucumber的退出码,执行完清理步骤后再返回这个码,确保脚本的最终状态由Cucumber的测试结果决定。
1. 修改e2e.test.sh脚本
修改后的完整脚本如下,关键改动已标注:
#!/usr/bin/env bash RETRY_INTERVAL=${RETRY_INTERVAL:-0.2} # Run our API server as a background process if [[ "$OSTYPE" == "msys" ]]; then if ! netstat -aon | grep "0.0.0.0:$SERVER_PORT" | grep "LISTENING"; then pm2 start --no-autorestart --name test:serve "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" -- run test:serve until netstat -aon | grep "0.0.0.0:$SERVER_PORT" | grep "LISTENING"; do sleep $RETRY_INTERVAL done fi else if ! ss -lnt | grep -q :$SERVER_PORT; then yarn run test:serve & fi until ss -lnt | grep -q :$SERVER_PORT; do sleep $RETRY_INTERVAL done fi # 关键步骤1:执行Cucumber并捕获其退出码 npx cucumber-js spec/cucumber/features --require-module @babel/register --require spec/cucumber/steps CUCUMBER_EXIT_CODE=$? # 执行清理操作(这一步的退出码不会影响最终结果) if [[ "$OSTYPE" == "msys" ]]; then pm2 delete test:serve fi # 关键步骤2:返回Cucumber的退出码作为脚本的最终状态 exit $CUCUMBER_EXIT_CODE
2. 验证package.json的脚本配置
确保你的test:e2e命令直接指向修改后的脚本,比如:
"scripts": { "test": "yarn run test:unit && yarn run test:integration && yarn run test:e2e", "test:e2e": "./e2e.test.sh" }
yarn会自动传递脚本的退出码,当e2e.test.sh返回非零(Cucumber测试失败)时,yarn run test:e2e也会返回非零,进而让整个test命令失败,Travis CI就能正确识别并标记构建失败了。
为什么这样有效?
Shell脚本默认会以最后一条执行命令的退出码作为自身的退出码。之前的脚本中,不管Cucumber测试成功与否,最后执行的是清理命令(比如pm2 delete),只要清理成功,脚本就返回0。现在我们先保存Cucumber的退出码,最后手动返回这个码,就确保了脚本的最终状态完全由Cucumber的测试结果决定。
内容的提问来源于stack exchange,提问作者msm1089
相关产品推荐
相关产品推荐

