如何在GitLab CI作业中仅重跑失败的自动化测试?
在GitLab CI中重试时仅运行失败的测试用例
当然可以实现,核心思路是在首次测试失败时捕获失败用例清单,重试时读取清单只执行这些失败的测试,结合GitLab CI的作业变量和artifacts特性就能搞定,具体步骤如下:
1. 捕获失败的测试用例清单
首先需要让你的测试框架或脚本在运行失败后,把失败的测试用例标识符(比如测试类名、方法名、测试文件路径)导出到一个文本文件里。不同测试框架的实现方式略有不同:
- pytest:可以用
--last-failed参数自动记录失败用例,也可以自定义脚本提取失败列表,比如:# 运行完整测试后,提取失败用例到文件 pytest --alluredir=reports || pytest --collect-only --tb=no -q --last-failed > failed-tests.txt - JUnit/TestNG:解析生成的XML测试报告,用脚本提取失败的测试节点,比如用Python或jq工具提取测试名到文件。
- Cypress:借助
cypress-failed-log插件生成失败测试的路径列表,再导出到文件。
2. 配置GitLab CI作业
利用GitLab CI的CI_JOB_RETRY变量(重试作业时该变量值为true),结合artifacts保存失败用例文件,实现重试时只跑失败测试:
regression-tests: stage: test script: - | # 判断是否是重试作业,且存在失败用例文件 if [ "$CI_JOB_RETRY" = "true" ] && [ -f failed-tests.txt ]; then # 仅运行失败的测试用例 ./your-test-runner.sh --run-only failed-tests.txt else # 首次运行完整测试套件,并导出失败用例到文件 ./your-test-runner.sh --run-all --export-failed failed-tests.txt fi artifacts: paths: - failed-tests.txt when: on_failure # 仅在测试失败时保存该文件 expire_in: 1h # 设置过期时间,避免存储冗余
注意事项
- 确保
failed-tests.txt的格式和测试运行脚本的--run-only参数兼容,比如每行一个测试用例的唯一标识符。 - 如果重试后仍有测试失败,新的失败用例清单会覆盖旧文件,后续重试会自动执行最新的失败用例。
- 部分测试框架(比如pytest)自带
--failed-first参数,可以简化流程,但自定义导出清单的方式更灵活,适配更多场景。
内容的提问来源于stack exchange,提问作者krish
相关产品推荐
相关产品推荐

