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

本文关键字:路径 覆盖率 单元测试 | 更新日期: 2023-09-27 18:15:53

我喜欢使用单元测试,我认为它们对我帮助很大。我用点覆盖来分析我的代码覆盖率,但正如你所知道的,代码覆盖率并不是一切,但我认为它仍然是一个重要的工具。

现在我正在做一个非常复杂的项目,对准确性的要求非常高(这是为了钱,所以人们很挑剔),所以这是一个仅仅100%的代码覆盖率是不够的项目。我想知道它每次都会工作。

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

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

我使用c#和visual studio。

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

我不知道有现成的,所以您可能必须构建一个自定义。这将"需要很多努力";应用程序是什么?

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

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

你可能能够处理MSIL文件,它捕获c#编译器的结果(例如,所有的前端信息)。有一些"普通的"测试覆盖工具可以操作MSIL文件并进行检测。一个可能的缺点是,MSIL代码中的路径可能不会一对一地映射到源代码中的逻辑路径,这可能会使任何答案都难以破译。

Roslyn当然提供解析和名称/类型解析。我不知道它是否构造控制流程图。目前还不清楚(至少对我来说)Roslyn为源代码修改提供了什么。

我们的DMS软件再造工具包对c#有一些支持,但还不支持控制流图提取。相关的是DMS提供了这样做的机制,它已经被用来实现c++ 11程序的精确控制流提取,所以(按照设计)它肯定有能力为c#做这件事。

OpenCover做分支覆盖,也会记录当一个分支点被击中时哪个测试正在运行,然而我们谈论的IL分支可能不会与你的代码1:1映射(正如@IraBaxter已经提到的)。当测试运行时访问序列点时,它通过记录序列点流来完成后者。目前OpenCover只是聚合结果,但你可以修改代码来转储原始流,然后你需要分析并产生一些路径的可视化。

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

然而,即使是100%的序列和分支覆盖率,你仍然可以有缺陷,因为这是你的测试质量的问题,我实际上会首先集中在这一点上,并使用这些工具来指导你朝正确的方向前进。