如何在.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
相关产品推荐
相关产品推荐

