【问题标题】:How do code coverage tools work?代码覆盖工具如何工作?
【发布时间】:2010-06-16 08:04:47
【问题描述】:

像 NCover 这样的代码覆盖工具如何知道代码的哪些部分被执行,哪些部分没有被执行?

【问题讨论】:

    标签: code-coverage


    【解决方案1】:

    这是一篇关于 How to Implement test coverage tools for arbitrary languages 的技术论文。

    我公司正是基于这个原则为Java、C#、C++、PHP、COBOL、PLSQL……构建了一系列测试覆盖工具。

    【讨论】:

      【解决方案2】:

      直接从 NCover FAQ 引用:NCover 报告代码中在整个自动化测试过程中采用的分支百分比。它通过在每个分支处检测源代码并将“命中”点写入文件来实现这一点。然后将这些“命中”点与可能被“命中”的总可能点进行比较。

      【讨论】:

      • @Yassir:你可能想澄清你的问题。但是,由于 NCover 是开源的,您已经可以看到它是如何做到的...我建议您看看是否可以查看尽可能早的版本,那里的代码可能会更少,因此应该向您展示结构更容易。
      • 我实际上已经尝试过了,但代码不是很清楚,因为代码中没有 cmets :)
      • @Yassir:对于一个开源项目来说多么不常用:)。有 PartCover 项目,也许更好sourceforge.net/projects/partcover
      • 这个答案更像是对问题的重述。更多的是说明什么是代码覆盖率,而不是它如何可能或如何完成。
      【解决方案3】:

      我知道这是个老问题,但如果您仍然感兴趣,可以通过查看开源项目 OpenCover 来查看如何为 .NET 应用程序执行此类检测的示例。

      OpenCover 在代码中的重要点插入检测点。

      1. 对于代码行覆盖率,它使用取自 PDB 文件的序列点
      2. 对于分支覆盖,它通过检测跳转目标和分支指令之后的下一条指令(即不跳转)来检测 COND_BRANCH 指令。
      3. 对于方法检测,它检测任何方法的第一条指令。

      在使用 Mono.Cecil 定位适当的点并从控制台主机传递到分析器后,所有这些规则都将应用于 CoverageInstrumentation.cpp

      PartCover 的源代码也可用(如所示),但这更难理解,但它也使用 PDB 中的序列点来确定它在哪里检测代码。

      【讨论】:

        【解决方案4】:

        来自this 来源:

        NCover 使用 .NET Framework 分析器 API 来监视应用程序的执行。当 CLR 加载方法时,NCover 检索 IL 并将其替换为检测的 IL 代码

        简而言之,它会将自己挂接到即时编译中。

        但并非所有工具都以相同的方式工作。其他工具通过在代码编译后修改应用程序的字节码来工作。

        【讨论】:

          【解决方案5】:

          它要求您在启用代码覆盖率分析的情况下运行一次测试,然后简单地计算覆盖的块数(即范围块)并与您正在测试的项目中的总块数进行比较.

          基本推理是,如果覆盖了每个可能的代码块组合,则覆盖了所有代码路径1。反对在代码覆盖率上过分重视的主要论点是,像 getter 和 setter 这样的“简单”块没有真正的价值(而且几乎不会出错......)与更容易出错的代码块一样多.


          1) 正如Ira Baxter 在评论中所指出的,这句话的先前措辞是不正确的。请阅读 cmets 对此进行一些讨论。

          【讨论】:

          • “如果每个块都被覆盖,则所有代码路径都被覆盖”。错误的。想象四个块,两对 A1 A2 B1 B2,每对都由 if-thenelse A 和 B 控制。假设 if 条件独立,则有 4 条可能的路径。有了A真,就可以锻炼B真假;这将涵盖 A1 B1 B2。如果 A 为假,B 为假,则覆盖了 A2 和 B2。到目前为止描述的一组测试,A1 A2 B1 B2(所有块)都被覆盖了。但路径 A2 B1 尚未执行。并非所有路径都被覆盖。块/分支覆盖!= 路径覆盖。
          • @IraBaxter 我认为重点不是要涵盖所有代码执行组合,而是至少要涵盖所有代码块一次。
          • @Brenden:通常是你以外的人定义“足够好”的标准。有些人会满足于“每个块至少执行一次”;这本质上是“分支覆盖”。有些人坚持认为任何布尔表达式的每个因果子条件都被覆盖了;这就是飞机软件如此出色的原因(DO-178B)。其他人可能会坚持所有路径都被覆盖。关键是有很多标准,每个标准都有不同的受众。他们告诉你什么是可以接受的,而不是相反。
          • @ThomasLycken 那么代码覆盖率工具是否会衡量每个“可能的代码块组合”是否被执行或只是代码块?
          • @Abdul:这取决于工具及其配置。我认为大多数工具只是衡量是否曾经执行过代码块(但不关心它是通过哪种方式到达那里的),但我也认为(虽然我目前没有参考)有一些工具可以实际检测到如果通过函数的每条可能路径都被采用。大多数工具这样做(例如,它们只测量代码块是否曾经运行过)这一事实是反对将代码覆盖率用作衡量代码质量的重要指标的主要论据之一。你的测试套件。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-23
          • 1970-01-01
          • 1970-01-01
          • 2013-11-04
          相关资源
          最近更新 更多