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

Gitlab CI测试用例失败阶段仍通过,如何配置100%通过率才成功

问题原因确认

你描述的现象确实有两种常见触发原因:

  • 测试执行脚本未正确透传测试失败的退出码:如果stage-unittests.sh在Google Test用例失败后最终返回的退出码为0,GitLab默认会判定阶段执行成功
  • 项目配置了自定义测试通过率阈值:如果管理员在项目CI/CD设置中配置了低于100%的通过率要求(比如90%),只要失败用例占比未超过阈值,系统就会判定测试阶段成功

解决方案

1. 修复测试脚本的退出码透传逻辑

修改scripts/gitlab-ci/stage-unittests.sh,确保Google Test、pytest执行失败时,整个脚本返回非0退出码,参考逻辑如下:

# 执行Google Test
./path/to/your/gtest_executable
GTEST_EXIT=$?
# 执行pytest并生成junit报告
pytest ./test/ --junitxml=test_unit_test_report.xml
PYTEST_EXIT=$?

# 任意测试失败则脚本最终返回非0
if [ ${GTEST_EXIT} -ne 0 ] || [ ${PYTEST_EXIT} -ne 0 ]; then
  echo "存在测试用例执行失败"
  exit 1
fi

2. 配置CI Job强制测试用例全过才成功

如果你使用的是GitLab 15.3及以上版本,直接修改.gitlab-ci.yml的测试阶段配置,给JUnit报告增加fail_on_failure: true参数即可,修改后的配置如下:

test_unit_test:
  stage: test
  needs: ["build", "build_unit_test"]
  image: $DOCKER_IMAGE
  rules:
    - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
  script: |
    ZIPNAME=`cat _VERSION_.txt`
    ./scripts/gitlab-ci/stage-unittests.sh test_unit_test_report.xml $ZIPNAME
  artifacts:
    reports:
      junit:
        paths:
          - test_unit_test_report.xml
        fail_on_failure: true # 只要报告存在失败用例,直接标记Job失败
    expire_in: 1 week

3. 低版本GitLab兼容方案

如果你的GitLab版本低于15.3不支持fail_on_failure参数,可以在测试脚本末尾增加JUnit报告解析逻辑,主动判断失败用例数:

# 安装依赖(也可以提前打包到CI镜像里)
apt update && apt install -y xmlstarlet
# 统计失败用例数
FAILED_CASES=$(xmlstarlet sel -t -v "count(//testcase[failure])" test_unit_test_report.xml)
if [ ${FAILED_CASES} -gt 0 ]; then
  echo "检测到${FAILED_CASES}个失败用例,流水线终止"
  exit 1
fi

4. 检查项目级通过率配置

进入项目「设置」→「CI/CD」→「通用管道」页面,找到测试通过率阈值配置项,将阈值设置为100%,关闭允许部分测试失败的相关开关。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:15:02