确定哪些测试覆盖了一行代码

10

有没有一种方法可以确定执行给定代码行的潜在单元测试集?换句话说,你能否自动确定不仅覆盖了给定代码行,而且实际覆盖它的测试集合?

考虑一个大型代码库,例如有50,000个单元测试。显然,运行所有测试需要很长时间--可能需要几小时甚至几天。在这样的代码库中工作时,您希望能够执行一些子集的所有单元测试,其中只包括覆盖您刚刚修改的代码行(或行)的那些测试。当然,您可以手动找到并运行这些测试,但我正在寻找一种更快、更全面的方法。

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

所以:

  1. 我这个想法正确吗?理论上是否可行,或者有什么我遗漏的地方吗?

  2. 是否已经有一个可以做到这一点的工具?或者,这是一种常见的事情,有一个我没有听说过的名称?指向Java世界中的工具或对此问题的一般研究的指针将不胜感激。

4个回答

3

JetBrains 的 dotCover 现在也已经支持 .NET 代码的这个功能。可以通过 dotCover 菜单中的选项“显示覆盖测试”或按下 Ctrl + Alt + K 来访问。


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

验证每行代码 = Clover 可以做到 - 在测试贡献选项卡中。 Clover 还有一个新功能,可以仅执行与您更改相关的测试。我还没有使用过它(转移到了 .NET 平台,非常想念 Clover)。http://www.atlassian.com/software/clover/tour/test-optimization.jsp - Michael Lloyd Lee mlk

1

以下演示文稿讨论了如何计算单元测试执行的程序切片。它回答了一个问题:“你能在不执行程序的情况下确定测试覆盖率吗?”并基本勾勒出了你描述的想法...还有额外的工作要实际实现它。

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

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

我的公司开发了一系列测试覆盖工具 (family of test coverage tools)。我们下一个版本的这些工具将具有这种增量回归测试能力。


0

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

通常,您会有一个项目的Jenkins(或其他)构建,在该构建中执行所有测试并生成HTML覆盖报告。然后,只需检查报告即可查看当前覆盖给定代码行的测试。

显示每行生产代码的测试列表的示例覆盖报告在线提供


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接