如何分析单元测试*路径*覆盖率

时间:2014-07-31 14:44:08

标签: c# visual-studio unit-testing code-coverage cyclomatic-complexity

我喜欢与单位测试合作,我认为他们帮了我很多。 我使用dotcover来分析我的报道但是你知道代码覆盖并不是一切,但我认为它仍然是一个重要的工具。

现在我正在开发一个复杂程度非常高且对准确性要求很高的项目(关于钱,所以人们非常挑剔)所以这个项目只是100%的代码覆盖率还不够。我想知道每次工作。

问题:如何测量单元测试路径覆盖率以确保应用程序按预期工作? (这将要求单位测试与圈复杂度一样多)

我知道这需要相当多的努力和资源,但在这种情况下,这是值得的。

我使用c#和visual studio。

2 个答案:

答案 0 :(得分:1)

我不知道现成的一个,所以你可能需要建立一个自定义。 这将“需要很多努力”;申请是什么?

您显然需要一种能够通过代码枚举路径的工具,并且可以使用跟踪数据来检测每条路径。

对于所有这些,您需要一个完整的C#前端(解析,名称/类型解析,控制流图结构),然后是代码检测。

您可能能够处理MSIL文件,这些文件捕获C#编译器的结果(例如,所有前端信息)。有“vanilla”测试覆盖工具可以在MSIL文件上运行并进行检测。可能的缺点是MSIL代码中的路径可能不会一对一地映射到源代码中的逻辑路径,这可能使得任何答案都难以解密。

Roslyn当然提供解析和名称/类型解析。我不知道它是否构建了控制流图。目前尚不清楚(至少对我而言)Roslyn为源代码修改提供的内容。

我们的DMS软件再造工具包对C#有一些支持,但尚未控制流程图提取。有意义的是,DMS提供了这样做的机制,它已被用于实现C ++ 11程序的精确控制流程提取,因此(按设计)它肯定有能力为C#执行此操作。

答案 1 :(得分:0)

OpenCover执行分支覆盖,并且还会记录分支点被点击时正在运行的测试,但我们正在讨论IL分支,这些分支可能不会与您的代码1:1映射(正如@IraBaxter已经提到的那样) 。它通过记录在测试运行时访问的序列点流来完成后者。目前OpenCover只汇总结果,但您可以更改代码以转储原始流,然后您需要对其进行分析并生成所采用路径的可视化。

另一种方法是通过确保您的课程不要做太多来尽量保持您的CC尽可能小,即一个复杂的小对象网络,这些网络更容易进行单元测试。使用依赖注入(例如AutoFac)这比以前更容易组装,并且使用模拟工具(例如NSubstitute,Moq)这比你想象的要容易得多。

然而,即使是100%的序列和分支覆盖率,您仍然可能存在缺陷,因为我们的测试质量非常重要,我实际上会首先关注这一点并使用这些工具指导您正确的方向。