适用于 Free、Premium、Ultimate,以及 GitLab.com、自管理和 Dedicated 部署。
单元测试报告直接在合并请求和流水线详情显示结果,无需翻查作业日志,就能立即发现失败、比较分支、通过错误详情和截图调试,并跟踪长期失败模式。
报告必须采用 JUnit XML,且本身不影响作业状态。要在测试失败时让作业失败,脚本必须以非零状态退出。
Runner 将 JUnit XML 作为制品上传。打开合并请求时,GitLab 比较源分支 head 与目标分支 base 的结果,展示变化。
格式与大小限制
报告文件必须:
- 使用 JUnit XML,扩展名为
.xml。 - 每个文件小于 30 MB。
- 单个作业全部 JUnit 文件总计小于 100 MB。
测试名称重复时,只使用第一个,忽略后续同名测试。测试用例数量上限见 GitLab 相应限制文档。
支持的 XML 字段
GitLab 解析以下子集:
| 元素 | 属性或内容 | 用途 |
|---|---|---|
| testsuites | time | 全部测试套件累计执行时间 |
| testsuite | name | 套件名称,用于内部分组 |
| testsuite | time | 单个套件执行时间 |
| testcase | classname | 测试类或分类,在界面显示为套件名 |
| testcase | name | 单个测试名称 |
| testcase | file | 测试定义文件路径 |
| testcase | time | 执行秒数 |
| failure | 元素内容 | 失败消息与堆栈 |
| error | 元素内容 | 错误消息与堆栈 |
| skipped | 元素内容 | 跳过原因 |
| system-out | 元素内容 | 标准输出和附件标签,仅解析 testcase 内的元素 |
| system-err | 元素内容 | 标准错误输出,仅解析 testcase 内的元素 |
不解析 testsuite 的 tests、failures、errors、timestamp 属性,testcase 的 assertions、line、status 属性,properties 元素,以及 testsuite 层的 system-out/system-err。
XML 示例
<testsuites>
<testsuite name="Authentication Tests" tests="1" failures="1">
<testcase classname="LoginTest" name="test_invalid_password" file="spec/auth_spec.rb" time="0.23">
<failure>Expected authentication to fail</failure>
<system-out>[[ATTACHMENT|screenshots/failure.png]]</system-out>
</testcase>
</testsuite>
</testsuites>
界面显示套件 LoginTest、名称 test_invalid_password、文件 spec/auth_spec.rb、耗时 0.23 秒,并在详情对话框中提供截图。testsuite 的“Authentication Tests”不会显示为界面套件名称。
结果类型
比较分支后,结果分为:
- 新失败:目标分支通过,当前分支失败。
- 新错误:目标分支通过,当前分支发生错误。
- 已有失败:两分支都失败。
- 已解决失败:目标分支失败,当前分支通过。
无法比较时,例如目标分支还没有数据,只显示当前分支的失败测试。
默认分支过去 14 天失败过的测试,还会显示“Failed {n} time(s) in {default_branch} in the last 14 days”。计数包含已完成流水线,不包含被阻塞流水线;后者支持由 issue 431265 跟踪。
配置
- 根据测试框架文档,让作业输出 JUnit XML。
- 在
.gitlab-ci.yml为测试作业加入artifacts:reports:junit。 - 指定 XML 文件路径,可用单文件
junit: report.xml、模式junit: test-results/**/*.xml、数组junit: [rspec-1.xml, rspec-2.xml, rspec-3.xml],或混合junit: [rspec.xml, test-results/TEST-*.xml]。 - 不支持直接指定目录,例如
test-results或test-results/**。 - 可选:通过
artifacts:paths让文件可浏览。 - 可选:使用
artifacts:when: always,让作业失败时也上传报告。
Ruby RSpec 示例:
ruby:
stage: test
script:
- bundle install
- bundle exec rspec --format progress --format RspecJunitFormatter --out rspec.xml
artifacts:
when: always
paths:
- rspec.xml
reports:
junit: rspec.xml
作业完成后,可在流水线详情的 Tests 标签查看;流水线完成后,也可在合并请求的 Test summary 面板查看。
在合并请求查看
Test summary 展示通过与失败数量。点击 Show details 展开,再点击失败测试旁的 View details,查看名称、路径、耗时、截图和错误输出。

点击 Full report,可以跳转流水线详情的 Tests 标签,查看全部结果。
复制失败测试名称
报告必须为失败测试提供 file 属性。
在 Test summary 点击 Copy failed tests,可复制全部失败测试名称,以空格分隔,便于本地重跑。复制单个测试时,展开详情,打开 View details,再点击 Copy test name to rerun locally。
在流水线查看
进入流水线详情,选择 Tests,再选择任意套件查看用例,包括子流水线的结果。也可以通过 Pipelines API 获取报告。

时间指标
- Pipeline duration:流水线开始到结束的实际经过时间。
- Test execution time:所有作业中全部测试执行时间之和。
- Queue time:作业等待可用 Runner 的时间。
并行运行时,累计测试时间可以超过流水线时长。前者表示计算资源消耗,后者表示用户等待多久。例如流水线 81 分钟完成,但多个 Runner 并行测试,累计执行时间可能为 9 小时 10 分钟。
添加截图
在 JUnit XML 中加入相对于 $CI_PROJECT_DIR 的截图路径附件标签:
<testcase time="1.00" name="Test">
<system-out>[[ATTACHMENT|/path/to/some/file]]</system-out>
</testcase>
在 .gitlab-ci.yml 中,将截图路径加入制品。建议使用 when: always,失败时也上传:
ruby:
stage: test
script:
- bundle install
- bundle exec rspec --format progress --format RspecJunitFormatter --out rspec.xml
- # Your test framework should save screenshots to a directory
artifacts:
when: always
paths:
- rspec.xml
- screenshots/
reports:
junit: rspec.xml
运行流水线后,在失败测试的 View details 对话框中即可访问截图链接。

故障排查
报告为空
可能是制品已过期,或文件超过限制。提高 expire_in,或运行新流水线。确保单文件小于 30 MB,总计小于 100 MB。自定义限制的支持由 epic 16374 跟踪。
结果缺失
重复名称只保留第一个。确保测试名称及类组合唯一。
合并请求完全没有报告
目标分支可能没有用于比较的测试数据。在目标分支运行流水线,生成基线。
XML 解析错误
作业名称旁可能显示解析错误,原因是格式错误或元素无效。确认符合标准格式、标签正确闭合、属性名称和值格式正确。分组作业只显示组内第一条解析错误。
原文:Unit test reports。作者/维护方:GitLab 文档维护者。本文为中文翻译,代码及命令保留原文。
原文页面标示 CC BY-SA 4.0 许可;本文为中文翻译,译文沿用相同许可,保留原始出处与署名。











暂无评论内容