【问题标题】:How to analyze unit test *path* coverage如何分析单元测试*路径*覆盖率
【发布时间】:2014-07-31 14:44:07
【问题描述】:

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

现在我正在从事一个非常复杂且对准确性要求非常高的项目(它关乎金钱,所以人们非常挑剔)所以这是一个仅 100% 代码覆盖率不够的项目。我想知道它每次都有效。

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

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

我使用 c# 和 Visual Studio。

【问题讨论】:

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


    【解决方案1】:

    我不知道有什么现成的,所以你可能必须建立一个定制。 那将“需要付出很多努力”;应用程序是什么?

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

    为此,您需要一个完整的 C# 前端(解析、名称/类型解析、控制流图构建),然后是代码检测。

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

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

    我们的 DMS Software Reengineering Toolkit 对 C# 有一些支持,但还没有控制流图提取。相关的是 DMS 提供了执行此操作的机制,该机制已用于为 C++11 程序实现精确的控制流提取,因此(通过设计)它肯定有能力为 C# 执行此操作。

    【讨论】:

    • 嗯,谢谢你的提示,但我(当然)会有一个我可以使用的成品。但否则我将不得不这样做。感觉它是一种一般来说非常方便的产品......
    【解决方案2】:

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

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

    但是,即使 100% 的序列和分支覆盖率仍然可能存在缺陷,因为我们的测试质量很重要,我实际上会首先专注于这一点,并使用这些工具来引导您朝着正确的方向前进。

    【讨论】:

    • “序列”点实际上只是“它在here执行”,对吗?要进行路径覆盖,需要枚举所有 路径(然后您可以使用序列点样本点亮它们)。它正在获得艰难的道路。
    • 感谢您的提示,我将检查 openCover。我同意你关于低 CC 和 DI 的观点。我的应用程序利用 DI 到 100% 和 FakeItEasy 以及反射来降低 CC
    猜你喜欢
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2023-04-07
    相关资源
    最近更新 更多