如何找到可能直接或间接调用给定方法的所有单元测试? (。净)

时间:2011-03-25 11:12:55

标签: .net unit-testing code-analysis static-code-analysis

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

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

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

(我们在.net上使用nUnit并进行了大量的慢速单元测试,在我们将所有单元测试重构为快速之前,这将是很多年)

另见:

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在最常见的情况下,当你使用委托,lambda表达式等时,我有直觉认为这个问题等同于检查一个给定的程序是否会完成(Halting Problem),所以我不会希望找到合理的答案。

如果您的真正目标是能够快速测试您的更改是否有所改变,我建议:

  • 重构您的测试
  • 使用构建计算机集群设置并行构建基础结构(比使用TeamCity等现代工具更容易思考)

答案 2 :(得分:1)

您需要的是每个测试与其运行的代码之间的关系。

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

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

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

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

我们的SD Test Coverage tools在方法层面为Java和C#提供了这种功能。 您需要设置一些脚本来将实际测试与已收集的测试覆盖率向量打包在一起。实际上,这往往很容易。

答案 3 :(得分:0)

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