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

如何在.gitlab-ci.yml中合并多测试阶段生成单一报告

如何在GitLab CI中生成单一的JUnit测试报告和覆盖率报告?

问题背景

当前的.gitlab-ci.yml配置中,三个测试脚本分别生成独立的JUnit测试报告和覆盖率报告,导致报告分散:

.run_warehouse_tests: &run_warehouse_tests |
  echo "Running tests for Warehouse"
  python -m pytest --durations=0 ./src/unittest -m warehouse --junitxml="junit-test-result-warehouse.xml" -v
  python -m pytest ./src/unittest --cov-report xml --cov=./src/main
  coverage lcov

.run_logistics_tests: &run_logistics_tests  |
  echo "Running tests for Logistics"
  python -m pytest --durations=0 ./src/unittest -m logistics --junitxml="junit-test-logistics.xml" -v
  python -m pytest ./src/unittest --cov-report xml --cov=./src/main
  coverage lcov

.run_packaging_tests: &run_packaging_tests  |
  echo "Running tests for Packaging"
  python -m pytest --durations=0 ./src/unittest -m packaging --junitxml="junit-test-packaging.xml" -v
  python -m pytest ./src/unittest --cov-report xml --cov=./src/main
  coverage lcov

需要调整配置,生成覆盖所有测试的单一JUnit测试报告和覆盖率报告。


解决方案

方法一:统一执行所有测试(推荐)

直接合并所有测试步骤,一次性执行所有标记的测试,生成单一报告,步骤最简单:

.run_all_tests: &run_all_tests |
  echo "Running all tests"
  # 一次性执行所有标记的测试,输出到同一个JUnit报告
  python -m pytest --durations=0 ./src/unittest -m "warehouse or logistics or packaging" --junitxml="junit-test-result.xml" -v
  # 生成统一的覆盖率报告
  python -m pytest ./src/unittest -m "warehouse or logistics or packaging" --cov-report xml --cov=./src/main
  coverage lcov

方法二:分步骤执行后合并报告(适合必须分开执行的场景)

如果因为环境依赖或其他原因必须分开执行不同模块的测试,可以通过以下方式整合报告:

1. 修改测试脚本,保留中间报告并累加覆盖率

.run_warehouse_tests: &run_warehouse_tests |
  echo "Running tests for Warehouse"
  python -m pytest --durations=0 ./src/unittest -m warehouse --junitxml="junit-warehouse.xml" -v
  # 累加覆盖率数据,不直接生成最终报告
  python -m pytest ./src/unittest -m warehouse --cov-report=term --cov=./src/main --cov-append

.run_logistics_tests: &run_logistics_tests  |
  echo "Running tests for Logistics"
  python -m pytest --durations=0 ./src/unittest -m logistics --junitxml="junit-logistics.xml" -v
  python -m pytest ./src/unittest -m logistics --cov-report=term --cov=./src/main --cov-append

.run_packaging_tests: &run_packaging_tests  |
  echo "Running tests for Packaging"
  python -m pytest --durations=0 ./src/unittest -m packaging --junitxml="junit-packaging.xml" -v
  python -m pytest ./src/unittest -m packaging --cov-report=term --cov=./src/main --cov-append

# 新增报告合并步骤
.merge_reports: &merge_reports |
  # 安装JUnit合并工具(若环境未预装)
  pip install junitmerge
  # 合并所有JUnit中间报告为单一文件
  junitmerge junit-warehouse.xml junit-logistics.xml junit-packaging.xml junit-test-result.xml
  # 基于累加的覆盖率数据生成最终报告
  coverage xml
  coverage lcov

2. 在CI任务中调用所有步骤

test_job:
  script:
    - *run_warehouse_tests
    - *run_logistics_tests
    - *run_packaging_tests
    - *merge_reports
  artifacts:
    reports:
      junit: junit-test-result.xml
      coverage_report:
        coverage_format: cobertura
        path: coverage.xml

关键注意事项

  • 使用--cov-append参数确保覆盖率数据累加,避免后续测试覆盖之前的结果
  • 若采用合并JUnit报告的方式,需确认CI环境中已安装junitmerge工具
  • 最终的artifacts配置必须指向合并后的报告文件,才能让GitLab正确展示测试和覆盖率信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:01:05