代码覆盖工具如何工作?

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

以下是关于如何实现任意语言的testing覆盖工具的技术文章。

我公司根据这一原则,为Java,C#,C ++,PHP,COBOL,PLSQL等构build了一系列testing覆盖工具。

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

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

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

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

在使用Mono.Cecilfind适当的点并将其传递给控制台主机的分析器之后,所有这些规则将应用于CoverageInstrumentation.cpp中 。

PartCover的源代码也是可用的(如图所示),但这很难遵循,但它也使用来自PDB的序列点来确定它在哪里testing代码。

从这个来源:

NCover使用.NET Framework分析器API来监视应用程序的执行。 当一个方法被CLR加载时,NCover检索IL并用IL检测代码replace它

总而言之,它将自己融入到即时编辑中。

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

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

基本的推理是,如果每个可能的代码块组合被覆盖,所有代码path都被覆盖1 。 反对在代码覆盖数字中join太多权重的主要观点是,像getter和setter这样的“简单”块没有真正的价值(并且几乎不会出错……)和更容易出错的代码块一样重要。


1)正如Ira Baxter在评论中指出的那样,这句话以前的措词是不正确的。 请阅读关于此的一些讨论的意见。