【问题标题】:Determine which Unit Tests to Run Based on Diffs根据差异确定要运行的单元测试
【发布时间】:2010-10-20 18:48:22
【问题描述】:

有没有人知道可以根据提交的差异来帮助确定应该运行哪些单元测试的工具?

例如,假设开发人员提交的内容只更改了一行代码。现在,假设我有 1000 个单元测试,每个单元测试(或者可能只是每个测试套件)都有代码覆盖率数据。开发人员的一行更改不太可能需要运行所有 1000 个测试用例。相反,可能只有少数单元测试真正接触到这一单行更改。是否有工具可以帮助确定哪些测试用例与开发人员的代码更改相关?

谢谢!

【问题讨论】:

    标签: c unit-testing automation continuous-integration code-coverage


    【解决方案1】:

    据我了解,单元测试的主要目的是覆盖整个代码库。当您对一个文件进行所有测试时,必须执行测试以确保您的微更改不会破坏产品。如果你打破了这个原则,你的单元测试就没有什么理由了。

    ps。我建议将项目拆分为独立的模块/服务,并创建新的“集成单元测试”,这将验证它们之间的接口。但是在一个模块/服务中,所有单元测试都应该以“全有或全无”的方式执行。

    【讨论】:

    • 我们有超过 1000 名开发人员将代码提交到同一个分支。他们可能会为完全不相关的服务提交代码(即服务 A 永远不会使用来自服务 B 的代码),但所有这些服务都捆绑到一个图像中。如果我们有数千个单元测试,那么为每个提交运行每个单元测试对我们来说是没有好处的(即,在服务 A 上工作的开发人员提交代码,不需要为服务 B 运行测试)。整个套件可以每隔几天运行一次。但是,运行与已提交代码相关的测试会非常有益。
    • @DuneBug 你怎么知道某些服务“完全不相关”?你把这些知识保存在哪里?如果有一天情况发生了变化,服务 A 开始使用服务 B 怎么办?
    【解决方案2】:

    您可以使用make 或类似工具来执行此操作,方法是为每个测试生成一个结果文件,并使结果文件依赖于它使用的源文件(以及单元测试代码)。

    【讨论】:

      【解决方案3】:

      我们的family of Test Coverage tools 可以告诉您哪些测试执行了代码的哪些部分,这是您回答的基础。

      当您重新检测代码库时,它们还可以告诉您哪些测试需要重新运行。实际上,它在已经检测的源文件上计算差异,而不是使用提交差异,但它实现了您正在寻找的效果,恕我直言。

      【讨论】:

      • 我是否需要使用这些工具来获得代码覆盖率?还是我们仍然可以使用我们自己的工具来获得代码覆盖率?需要做什么才能将工具与构建过程集成?
      • 您必须使用这些工具,因为它们内置了进行微分计算的机制。这些工具同时具有 UI 和命令行功能,因此将它们集成到批处理构建脚本中应该很简单。进一步的讨论可能应该离线进行;有关联系信息,请参阅我的简历。
      【解决方案4】:

      您可以尝试使用 'prove' 运行它们,它有一个基于文件修改时间的 'fresh' 选项。详情请查看prove manpage

      免责声明:我是 C 单元测试的新手,没有使用过证明,但在我的研究中读到了这个选项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-22
        • 2015-09-12
        相关资源
        最近更新 更多