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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:44:14