单元测试报告

CI/CD 流水线通常包含验证您的代码的测试作业。 如果测试失败,流水线将失败并通知用户。处理合并请求的人必须检查作业日志并查看测试失败的地方,以便可以修复它们。

您可以将作业配置为使用单元测试报告,极狐GitLab 会显示有关合并请求的报告,以便更轻松、更快速地识别故障,而无需检查整个日志。单元测试报告目前仅支持 JUnit 报告格式的测试报告。

如果您不使用合并请求但仍希望在不搜索作业日志的情况下查看单元测试报告输出,则流水线中提供完整的单元测试报告详细视图。

考虑以下工作流程:

  1. 您的默认分支坚如磐石,您的项目正在使用极狐GitLab CI/CD,并且您的流水线表明没有任何损坏。
  2. 您团队中的某个人提交了合并请求,测试失败并且流水线获得已知红色图标。要进行更多调查,您必须查看作业日志来找出测试失败的原因,这些日志通常包含数千行。
  3. 您配置单元测试报告,极狐GitLab 立即收集并在合并请求中公开它们,您不再需要在作业日志中搜索。
  4. 您的开发和调试工作流程变得更容易、更快、更高效。

工作原理

首先,极狐GitLab Runner 上传所有 JUnit 报告格式 XML 文件到极狐GitLab,作为产物。然后,当您访问合并请求时,极狐GitLab 开始比较 head 和 base 分支的 JUnit 报告格式 XML 文件,其中:

  • base 分支是目标分支(通常是默认分支)。
  • head 分支是源分支(每个合并请求中的最新流水线)。

报告面板有一个摘要,显示有多少测试失败、有多少错误以及有多少已修复。如果由于 base 分支的数据不可用而无法进行比较,则面板仅显示 head 的失败测试列表。

有四种类型的结果:

  1. 新失败的测试:测试用例在 base 分支上通过,在 head 分支上失败
  2. 新遇到的错误:测试用例在 base 分支上通过,但由于 head 分支上的测试错误而失败
  3. 现有故障:测试用例在 base 分支上失败,在 head 分支上失败
  4. 已解决的故障: 测试用例在 base 分支上失败,在 head 分支上通过

查看失败的测试

测试摘要 面板中的每个条目都显示了测试名称和结果类型。单击测试名称会打开一个窗口,其中包含其执行时间和错误输出的详细信息。

Test Reports Widget

拷贝失败的测试名称

  • 引入于极狐GitLab 15.2。

当在 测试摘要 面板上列出失败的测时,您可以复制失败测试的名称和路径,以便在本地查找和重新运行测试以进行验证。

要拷贝所有失败测试的名称,在 测试摘要 仪表盘的顶部,选择 复制失败的测试。失败的测试以字符串的形式列出,测试之间用空格分隔。只有当 JUnit 报告填充失败测试的 <file> 属性时,才提供此选项。

要拷贝单个失败测试的名称:

  1. 通过选择 展示测试摘要详情 ( ) 来展开 测试摘要 面板。
  2. 选择您要查看的测试。
  3. 选择 复制测试名称以在本地重新运行 ( )。

最近失败的数量

如果在默认分支上的测试在过去 14 天失败,则会在测试上展示 Failed {n} time(s) in {default_branch} in the last 14 days

该计算包含已完成流水线中的失败测试,但不包含受阻流水线

如何设置?

要在合并请求中启用单元测试报告,您必须在 .gitlab-ci.yml 中添加 artifacts:reports:junit,并且制定生成的测试报告的路径。报告必须是 .xml 文件,否则极狐GitLab 返回错误 500

在如下的 Ruby 示例中,在 test 阶段运行的作业执行后,极狐GitLab 会收集作业的单元测试报告。作业执行后,XML 报告作为产物存储在极狐GitLab 中,并在合并请求小部件中显示结果。

## Use https://github.com/sj26/rspec_junit_formatter to generate a JUnit report format XML file with 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

为了能够浏览报告输出文件,您可以在示例中使用 artifacts:paths 关键字包含它们。要上传报告,即使作业失败(例如,如果测试未通过),也使用 artifacts:when:always 关键字。

您无法在您 JUnit 的 XML 格式报告文件中具有多个相同的测试名称。

在极狐GitLab 15.0 及早期版本,并行:矩阵作业的测试报告被聚合在一起,这会导致某些报告信息无法显示。在极狐GitLab 15.1 及以后版本中,此问题已修复,所有报告信息都可看。

在极狐GitLab 上查看单元测试报告

如果 JUnit 的 XML 文件格式报告已生成并作为流水线的一部分进行了上传,则可以在流水线详情页面查看这些报告。此页面上的 测试 选项卡会展示测试用例列表,这些测试用例来自 XML 文件。

Test Reports Widget

您可以查看所有已知的测试套件,并选择每个套件以查看进一步的详细信息,包括构成套件的用例。

您还可以通过极狐GitLab API 检索报告。

单元测试报告

如果解析 JUnit 报告 XML 时出现错误,将在作业名称旁边显示一个指示器。将鼠标悬停在图标上会显示工具提示中的解析器错误。如果多个解析错误来自分组作业,极狐GitLab 只显示群组中的第一个错误。

Test Reports With Errors

对于测试用例解析限制,请参阅每个单元测试报告的最大测试用例数

极狐GitLab 无法解析 JUnit 报告中非常大的节点。

在极狐GitLab 上查看 JUnit 截图

您可以将您的屏幕截图作为产物上传到极狐GitLab。如果 JUnit 报告格式 XML 文件包含 attachment 标记,极狐GitLab 将解析附件。上传屏幕截图制品时:

  • attachment 标签 必需 包含您上传相对于 $CI_PROJECT_DIR 的屏幕截图的路径。例如:

    <testcase time="1.00" name="Test">
      <system-out>[[ATTACHMENT|/path/to/some/file]]</system-out>
    </testcase>
    
  • 您应该设置作业以上传截图到 artifacts:when: always,则当测试失败时,它仍然会上传屏幕截图。

上传附件后,流水线测试报告包含指向屏幕截图的链接,例如:

Unit test report screenshot example

故障排查

测试报告为空

如果包含的报告的工件过期时,单元测试报告可能在在合并请求中查看时为空。如果工件经常过期太早,为报告产物设置更长的expire_in值。

相对地,你可以运行一个新的流水线来生成一个新的报告。