【问题标题】:Determining which tests cover a line of code确定哪些测试覆盖了一行代码
【发布时间】:2011-03-12 13:45:24
【问题描述】:

有没有办法确定可能执行给定代码行的单元测试集?换句话说,您能否自动确定是否给定的行被覆盖,而是覆盖它的实际测试集?

考虑一个包含 50K 单元测试的大型代码库。显然,运行它们可能需要很长时间——即使不是几天,也可能是几个小时。在这样的代码库中工作,您希望能够执行所有单元测试的子集,仅包括那些覆盖您刚刚接触的一行(或多行)的测试。当然,您可以手动找到一些并运行它们,但我正在寻找一种更快、更全面的方法。

如果我正确地考虑了这一点,那应该是可能的。一个工具可以静态遍历从每个单元测试引出的所有代码路径,并得出一个可从该测试访问的程序片段。然后您应该(理论上)能够计算在其切片中包含给定行的单元测试集,这意味着该行可以由该测试执行(“可以”而不是“将”,因为实际的代码路径将仅在运行时根据输入或其他条件确定)。给定的代码行可能有大量执行它的测试(例如,共享库中的代码),而其他行可能只有很少(或没有)覆盖它们的测试。

所以:

  1. 我对这个想法的推理是否合理?理论上可以做到吗,还是我遗漏了什么?

  2. 是否已经有工具可以做到这一点?或者,这是一个我没有遇到过的名字的常见事情吗?指点 java 世界中的工具,或对该主题的一般研究,将不胜感激。

【问题讨论】:

    标签: unit-testing code-coverage


    【解决方案1】:

    JetBrains 的 dotCover 现在也为 .NET 代码提供了此功能。可以通过 dotCover 菜单使用“显示覆盖测试”选项或按 Ctrl + Alt + K 来访问它。

    【讨论】:

      【解决方案2】:

      这是 JMockit Coverage 工具(适用于 Java)提供的一项功能,尽管它显示了在上次运行中确实覆盖了给定生产代码行的测试,而不是“将可能执行给定的代码行”。

      但是,通常情况下,您将拥有项目的 Jenkins(或其他)构建,其中执行所有测试并生成 HTML 覆盖率报告。然后只需检查报告以查看当前哪些测试覆盖了给定的代码行。

      显示每行生产代码的测试列表的示例覆盖率报告是available online

      【讨论】:

        【解决方案3】:

        下面的presentation 讨论了如何计算单元测试执行的程序切片。它回答了“你能否在不执行程序的情况下确定测试覆盖率”的问题?并且基本上勾勒出您所描述的想法......以及实际实施它的额外工作。

        您可能会注意到,计算程序切片并不是一项计算成本低的任务。我猜计算切片(符号计算)通常比执行单元测试慢,所以我不确定你是否会节省任何时间。切片是程序受影响部分的保守近似值,因此您得到的答案将包括实际未执行的程序部分。

        您最好只运行一次所有这 50,000 个单元测试,并收集每个单元测试的覆盖率数据。在这种情况下,当某些代码片段被更新时,可以静态地确定特定测试执行的代码是否包含您更改的代码,从而可以识别必须再次执行的测试。您可以跳过执行其余的测试。

        我的公司建立了family of test coverage tools。这些工具的下一个版本将具有这种增量回归测试功能。

        【讨论】:

          【解决方案4】:

          我很确定Clover 会告诉你哪些测试可以验证每一行代码。因此,您可以通过查看覆盖率报告来手动执行测试。他们还有一个新的API,您可以使用它来编写一个 IDE 插件,让您执行涵盖一行代码的测试。

          【讨论】:

          • 验证每一行代码 = Clover 可以做到这一点 - 测试贡献选项卡。 Clover 还有一个新功能,只执行与您的更改相关的测试。但是我没有使用它(移动到 .NET 并且真的缺少 Clover)atlassian.com/software/clover/tour/test-optimization.jsp
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-20
          相关资源
          最近更新 更多