代码覆盖工具如何工作?

时间:2010-06-16 08:04:47

标签: code-coverage

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

5 个答案:

答案 0 :(得分:16)

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

我的公司基于这一原则为Java,C#,C ++,PHP,COBOL,PLSQL等构建了一系列测试覆盖工具。

答案 1 :(得分:7)

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

答案 2 :(得分:3)

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

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

  1. 对于代码行覆盖率,它使用从PDB文件
  2. 中获取的序列点
  3. 对于分支覆盖,它通过检测跳转目标和分支指令之后的下一条指令(即无跳转)来检测COND_BRANCH指令。
  4. 对于方法检测,它检测任何方法的第一条指令。
  5. 在使用Mono.Cecil找到适当的点并从控制台主机传递给探查器后,所有这些规则都应用于CoverageInstrumentation.cpp

    PartCover的源代码也可用(如图所示),但这很难遵循,但它也使用PDB中的序列点来确定代码的位置。

答案 3 :(得分:3)

来自this来源:

  
    

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

  

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

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

答案 4 :(得分:2)

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

基本原因是,如果涵盖了每种可能的代码块组合,则所有代码路径都包含在 1 中。反对在代码覆盖率数字中加入过多权重的主要论点是,像getter和setter这样的“简单”块,没有真正的价值(并且几乎不会出错......)与更容易出错的代码块一样重要


1)如评论中Ira Baxter所述,此句的先前措辞不正确。请阅读评论,以便对此进行一些讨论。