3

如何找到可能直接或间接调用给定方法的所有单元测试?当我改变一种方法时,我想知道运行的最佳测试;必须有一个工具!

由于我们有很多接口,我对所有调用接口上的方法的单元测试感兴趣,当至少有一个路径 var 实现接口的类上的植入方法时。

或者换句话说,当工具无法证明结果不受我更改的方法的影响时,我想要一个所有单元测试的列表。

(我们在 .net 上使用 nUnit 并且有很多缓慢的单元测试,在我们将所有单元测试重构为快速之前还需要很多年)

也可以看看:

4

4 回答 4

3

Visual Studio 2010 具有此确切功能:http: //blogs.msdn.com/b/phuene/archive/2009/12/07/test-impact-analysis-in-visual-studio-2010.aspx

由于您使用的是 nunit,因此您也可以尝试这种技术来运行 MSTest:http: //msdn.microsoft.com/en-gb/magazine/cc163643.aspx#S4

于 2011-03-25T13:58:29.360 回答
1

在最一般的情况下,当您使用委托、lambda 表达式等时,我的直觉是这个问题等同于检查给定程序是否会完成(停止问题),所以我不希望找到一个合理的回答。

如果您的真正目标是能够快速测试您的更改是否破坏了某些东西,我建议:

  • 重构你的测试
  • 使用一组构建机器设置并行构建基础架构(使用 TeamCity 等现代工具比您想象的要容易)
于 2011-03-25T13:53:07.547 回答
1

你需要的是每个测试和它执行的代码之间的关系。

这可以静态计算,但很难,我不知道有任何工具可以做到这一点。更糟糕的是,如果你有这样的工具,决定测试影响的静态分析实际上可能比运行测试本身花费更长的时间,所以这看起来不是一个有吸引力的方向。

但是,这可以使用测试覆盖率工具来计算。对于每个单独的测试,运行该测试(我们假设它通过)并收集测试覆盖率数据。我们现在有很多对 (t_i,c_i) 用于“测试 i 具有覆盖率 c”。

当代码库发生变化时,可以查阅测试数据覆盖率集。一个简单的检查:如果对于任何一个(t_i,c_i),如果c_i提到了文件F,并且F已经改变了,你需要再次运行t_i。给定几乎任何表示形式的测试覆盖率数据,这在抽象中很容易检测到。鉴于大多数测试覆盖率工具并没有具体告诉您它们如何存储测试覆盖率数据,这比实际看起来要难。

实际上,理想情况下,如果 c_i 提到 F 的任何程序元素,并且该程序元素已更改,则需要再次运行 t_i。

我们的SD 测试覆盖率工具在方法级别为 Java 和 C# 提供此功能。您需要设置一些脚本来将实际测试与收集的测试覆盖向量相关联,但是您已经将其打包。作为一个实际问题,这往往很容易。

于 2011-03-25T15:44:38.933 回答
0

您可以使用 VS2010 的“View Call Hierarchy”或 ReSharpers“ReSharper -> Inspect -> Incoming calls”。您甚至可以从 ReSharper 导出结果。
如果您想使用自动化来实现您的目标,即因为这不是一次性的事情,而是您想要集成到您的构建过程中的东西,我建议您构建自己的解决方案。您可以在程序集上使用 Reflection 或 Mono.Cecil 并自己遍历调用层次结构。但是,这可能非常耗时,因为您需要在所有程序集上创建一个完整的调用层次结构树。另一种可能性是创建一个 Visual Studio 或 ReSharper 插件,这样您就可以从您的源代码访问他们创建的对象模型。
基本上,我要说的是:我不知道任何当前存在的通过自动化实现目标的方法,编写自己的解决方案会很有趣,但很棘手,而且可能很耗时,无论是在开发还是运行它时。

于 2011-03-25T11:18:46.030 回答