GitLab 单元测试报告

适用于 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 跟踪。

配置

  1. 根据测试框架文档,让作业输出 JUnit XML。
  2. 在 .gitlab-ci.yml 为测试作业加入 artifacts:reports:junit。
  3. 指定 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]。
  4. 不支持直接指定目录,例如 test-results 或 test-results/**。
  5. 可选:通过 artifacts:paths 让文件可浏览。
  6. 可选:使用 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,查看名称、路径、耗时、截图和错误输出。

Expanded Test summary panel that shows one failed test with the View details link

点击 Full report,可以跳转流水线详情的 Tests 标签,查看全部结果。

复制失败测试名称

报告必须为失败测试提供 file 属性。

在 Test summary 点击 Copy failed tests,可复制全部失败测试名称,以空格分隔,便于本地重跑。复制单个测试时,展开详情,打开 View details,再点击 Copy test name to rerun locally。

在流水线查看

进入流水线详情,选择 Tests,再选择任意套件查看用例,包括子流水线的结果。也可以通过 Pipelines API 获取报告。

Test results showing 1671 tests with 1 minute 11 seconds total execution time and individual job execution times.

时间指标

  • 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 对话框中即可访问截图链接。

A failed unit test report with test details and screenshot attachment

故障排查

报告为空

可能是制品已过期,或文件超过限制。提高 expire_in,或运行新流水线。确保单文件小于 30 MB,总计小于 100 MB。自定义限制的支持由 epic 16374 跟踪。

结果缺失

重复名称只保留第一个。确保测试名称及类组合唯一。

合并请求完全没有报告

目标分支可能没有用于比较的测试数据。在目标分支运行流水线,生成基线。

XML 解析错误

作业名称旁可能显示解析错误,原因是格式错误或元素无效。确认符合标准格式、标签正确闭合、属性名称和值格式正确。分组作业只显示组内第一条解析错误。


原文:Unit test reports。作者/维护方:GitLab 文档维护者。本文为中文翻译,代码及命令保留原文。

原文页面标示 CC BY-SA 4.0 许可;本文为中文翻译,译文沿用相同许可,保留原始出处与署名。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容