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

时间:2010-07-06 22:56:13

标签: unit-testing code-coverage

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

考虑使用50K单元测试的大代码库。很明显,它可能需要很长时间才能运行它们 - 如果不是几天的话。在这样的代码库中工作,您希望能够执行所有单元测试的一些子集,包括那些覆盖您刚触及的行(或行)的单元测试。当然,你可以手动找到一些并运行它们,但我正在寻找一种方法来更快,更全面地完成它。

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

所以:

  1. 我的推理是否符合这个想法?它理论上可以做到,还是有什么我要离开?

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

JetBrains的dotCover现在也有.NET代码的这个功能。可以从dotCover菜单中选择“显示覆盖测试”或按Ctrl + Alt + K进行访问。

答案 2 :(得分:1)

以下presentation讨论了如何计算单元测试执行的程序片。它回答了这个问题:“你能不确定测试覆盖范围吗?”并且基本上草拟了你所描述的想法......用额外的工作来实际实现它。

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

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

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

答案 3 :(得分:0)

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

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

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