【发布时间】:2010-06-16 08:04:47
【问题描述】:
像 NCover 这样的代码覆盖工具如何知道代码的哪些部分被执行,哪些部分没有被执行?
【问题讨论】:
标签: code-coverage
像 NCover 这样的代码覆盖工具如何知道代码的哪些部分被执行,哪些部分没有被执行?
【问题讨论】:
标签: code-coverage
这是一篇关于 How to Implement test coverage tools for arbitrary languages 的技术论文。
我公司正是基于这个原则为Java、C#、C++、PHP、COBOL、PLSQL……构建了一系列测试覆盖工具。
【讨论】:
直接从 NCover FAQ 引用:NCover 报告代码中在整个自动化测试过程中采用的分支百分比。它通过在每个分支处检测源代码并将“命中”点写入文件来实现这一点。然后将这些“命中”点与可能被“命中”的总可能点进行比较。
【讨论】:
我知道这是个老问题,但如果您仍然感兴趣,可以通过查看开源项目 OpenCover 来查看如何为 .NET 应用程序执行此类检测的示例。
OpenCover 在代码中的重要点插入检测点。
在使用 Mono.Cecil 定位适当的点并从控制台主机传递到分析器后,所有这些规则都将应用于 CoverageInstrumentation.cpp。
PartCover 的源代码也可用(如所示),但这更难理解,但它也使用 PDB 中的序列点来确定它在哪里检测代码。
【讨论】:
来自this 来源:
NCover 使用 .NET Framework 分析器 API 来监视应用程序的执行。当 CLR 加载方法时,NCover 检索 IL 并将其替换为检测的 IL 代码
简而言之,它会将自己挂接到即时编译中。
但并非所有工具都以相同的方式工作。其他工具通过在代码编译后修改应用程序的字节码来工作。
【讨论】:
它要求您在启用代码覆盖率分析的情况下运行一次测试,然后简单地计算覆盖的块数(即范围块)并与您正在测试的项目中的总块数进行比较.
基本推理是,如果覆盖了每个可能的代码块组合,则覆盖了所有代码路径1。反对在代码覆盖率上过分重视的主要论点是,像 getter 和 setter 这样的“简单”块没有真正的价值(而且几乎不会出错......)与更容易出错的代码块一样多.
1) 正如Ira Baxter 在评论中所指出的,这句话的先前措辞是不正确的。请阅读 cmets 对此进行一些讨论。
【讨论】: