1

我的任务是调查是否可以将某些内容添加到我们的 MR 批准流程中,以突出显示 GitLab 中提议的合并请求 (MR)(基于 C++ 的代码)是否包含任何新的单元测试或对现有测试的修改。总体目标是提醒开发人员和审批者他们需要考虑单元测试。

理想情况下,一个小脚本将运行并检测是否存在其他测试或更改(我可以轻松编写,并且我接受这里可以完成的操作有限制),如果未检测到,则会在 MR 上显示警告.

如果可能的话,一个附加步骤是阻止 MR,直到推送满足标准的进一步提交,或者完成(额外/自定义)GitLab MR 字段,解释为什么单元测试不适合此更改。出于审计目的,该字段将与 MR 一起保存。我接受这不是万无一失的,但我希望将其作为更大推动更多单元测试覆盖率的一部分。

如前所述,我可以轻松地在 Python 中编写一个脚本来检查提交中的单元测试,但我不知道是否/如何将其挂钩到 GitLab MR 过程中(我查看了web-hooks,但它们似乎专注于通知其他系统而不是事务)以及 GitLab 是否具有足够的可扩展性以使我们能够实现上述额外步骤。有什么想法吗?可以做到这一点,如果可以,我将如何去做?

4

2 回答 2

2

衡量单元测试的缺乏

检测是否存在其他测试或更改

我认为您在这里寻找错误的东西。测试已更改或有任何其他测试的事实并不意味着 MR 包含提交代码的任何单元测试。

根本问题当然是一个难题。

您想要的一个很好的近似值通常是检查测试套件涵盖了多少行代码。

如果测试套件在 MR 之后比之前测试了更多的 LOC,那么开发人员已经完成了他们的功课并且测试套件得到了改进。如果覆盖范围变小了,那就有问题了。

当然,用户仍然可以提交与其代码更改完全无关的单元测试,但至少整体覆盖率有所提高(或者:如果您在 MR 之前已经有 100% 的覆盖率,那么任何保持100% 的覆盖率并添加新代码显然为新代码添加了单元测试)。

最后,来回答你的问题

是的,可以配置一个 gitlab-project 来报告 MR 引入的测试覆盖率变化。

https://docs.gitlab.com/ee/ci/pipelines/settings.html#test-coverage-parsing

您显然需要从您的单元测试运行中创建一个覆盖率报告。你如何做到这一点取决于你使用的单元测试框架,但 gitlab 文档给出了一些提示。

于 2021-06-22T10:21:52.937 回答
0

您不需要网络挂钩或类似的东西。这应该是您可以通过在 .gitlab-ci.yml 中的额外工作或多或少轻松解决的问题。如果没有新的测试,则运行您的 python 脚本并使其退出非零,理想情况下会显示一条错误消息,指示需要新的测试。现在,当 MR 发布时,您的工作将运行,如果没有新的测试,管道将失败。

如果您希望管道快速失败,您可以将这个新作业放在管道的开头,这样如果这个作业失败,则不会运行任何其他作业。

您可能希望使其成为有条件的,以便它仅作为 MR 的一部分运行,否则您可能会得到错误的失败(例如,如果只是针对某个分支上的任意提交运行管道)。

于 2021-08-23T15:52:36.347 回答