{{< details >}}
- Tier: 基础版, 专业版, 旗舰版
- Offering: JihuLab.com, 私有化部署
{{< /details >}}
你可以配置你的 CI/CD 流水线 以在合并请求和流水线详情中直接显示单元测试结果。这使得在不必在作业日志中搜索的情况下更容易识别测试失败。
单元测试报告:
- 需要 JUnit 报告格式。
- 不影响作业状态。要在单元测试失败时使作业失败,你的作业的 脚本 必须以非零状态退出。
考虑以下工作流程:
- 你的默认分支非常稳定,你的项目正在使用极狐GitLab CI/CD,并且你的流水线表明没有任何问题。
- 你的团队中的某人提交了一个合并请求,测试失败,流水线显示已知的红色图标。为了进一步调查,你必须浏览作业日志以找出测试失败的原因,这通常包含成千上万行。
- 你配置了单元测试报告,极狐GitLab 立即收集并在合并请求中展示它们。不再需要在作业日志中搜索。
- 你的开发和调试工作流程变得更容易、更快、更高效。
如何运作
首先,极狐GitLab Runner 将所有 JUnit 报告格式 XML 文件作为 产物 上传到极狐GitLab。然后,当你访问一个合并请求时,极狐GitLab 开始比较头部和基准分支的 JUnit 报告格式 XML 文件,其中:
- 基准分支是目标分支(通常是默认分支)。
- 头部分支是源分支(每个合并请求中的最新流水线)。
测试摘要 面板显示有多少测试失败,有多少出现错误,以及有多少被修复。如果无法进行比较,因为基准分支的数据不可用,面板只显示源分支的失败测试列表。
结果的类型是:
- 新失败的测试: 在基准分支上通过,但在头部分支上失败的测试用例。
- 新遇到的错误: 在基准分支上通过,但由于头部分支上的测试错误而失败的测试用例。
- 现有的失败: 在基准分支和头部分支都失败的测试用例。
- 解决的失败: 在基准分支上失败,但在头部分支上通过的测试用例。
查看失败的测试
测试摘要 面板中的每个条目显示测试名称和结果类型。选择测试名称以打开一个模态窗口,其中包含其执行时间和错误输出的详细信息。
复制失败的测试名称
{{< history >}}
- 引入于极狐GitLab 15.2。
{{< /history >}}
当 测试摘要 面板中列出失败的测试时,你可以复制失败测试的名称和路径。使用名称和路径在本地查找并重新运行测试以进行验证。
要复制所有失败测试的名称,在 测试摘要 面板顶部,选择 复制失败测试。失败的测试被列为一个字符串,测试之间用空格分隔。此选项仅在 JUnit 报告为失败测试填充 <file>
属性时可用。
要复制单个失败测试的名称:
- 通过选择 显示测试摘要详情 ({{< icon name=”chevron-lg-down” >}}) 来展开 测试摘要 面板。
- 选择你想查看的测试。
- 选择 复制测试名称以在本地重新运行 ({{< icon name=”copy-to-clipboard” >}})。
最近失败的次数
如果一个测试在项目的默认分支中在过去 14 天内失败,则会为该测试显示类似 Failed {n} time(s) in {default_branch} in the last 14 days
的消息。
计算包括已完成流水线中的失败测试,但不包括 被阻止的流水线。议题 431265 提议也将被阻止的流水线包括在计算中。
如何设置
要在合并请求中启用单元测试报告,你必须在 .gitlab-ci.yml
中添加
artifacts:reports:junit
,并指定生成的测试报告的路径。报告必须是 .xml
文件,否则极狐GitLab 返回错误 500。
在下面的 Ruby 示例中,test
阶段的作业运行,极狐GitLab 从作业中收集单元测试报告。在作业执行后,XML 报告作为产物存储在极狐GitLab 中,结果显示在合并请求小部件中。
## 使用 https://github.com/sj26/rspec_junit_formatter 生成一个带有 rspec 的 JUnit 报告格式 XML 文件
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 及更早版本中,来自 parallel:matrix 作业的测试报告被聚合在一起,这可能导致某些报告信息无法显示。在极狐GitLab 15.1 及更高版本中,此错误已修复,所有报告信息都显示。
在极狐GitLab 上查看单元测试报告
如果生成并上传了 JUnit 报告格式 XML 文件作为流水线的一部分,这些报告可以在流水线详情页面内查看。此页面上的 测试 选项卡显示从 XML 文件报告的测试套件和用例列表。
你可以查看所有已知的测试套件并选择每个套件以查看进一步的详细信息,包括构成套件的用例。
你还可以通过 极狐GitLab API 检索报告。
单元测试报告解析错误
如果解析 JUnit 报告 XML 结果时出现错误,在作业名称旁边会显示一个指示符。将鼠标悬停在图标上会在工具提示中显示解析器错误。如果来自 分组作业 的多个解析错误,极狐GitLab 仅显示来自该组的第一个错误。
有关测试用例解析限制,请参阅 每个单元测试报告的最大测试用例。
极狐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
,以便在测试失败时仍上传截图。
上传附件后,流水线测试报告 包含指向截图的链接,例如:
故障排除
测试报告显示为空
当你在合并请求中查看单元测试报告时,它可能会因为以下原因显示为空:
-
包含报告的产物已过期。要解决此问题,你可以:
- 为报告产物设置更长的
expire_in
值。 - 运行新的流水线以生成新报告。
- 为报告产物设置更长的
-
JUnit 文件超过大小限制。要解决此问题:
- 确保单个 JUnit 文件小于 30 MB。
- 确保作业的总 JUnit 大小小于 100 MB。