有没有一种方法可以确定代码覆盖率而不需要运行代码?

问题描述:

我不是问StyleCop或Fxcop提供的静态代码分析。两者都有不同的目的,并且效果很好。我在问是否有方法来查找用户控件或子模块的代码覆盖范围?例如,你有一个应用程序在独立程序集中使用助手类。为了确保单元测试代码覆盖率,我们需要运行应用程序并确保使用NCover或类似工具。有没有一种方法可以确定代码覆盖率而不需要运行代码?

我的要求是,不运行它,有没有辅助类或相似类型的组件中的任何可以找到的代码覆盖率?

我会说不;除了编译器可以确定的“死代码”之外。

我的代码覆盖率的定义是指多少次的每一行代码在程序运行的结果:其中,当然,是指运行程序。这里的决定因素通常是通过确定条件执行路径的程序的数据值。像编译器一样,静态分析可以推导出无法在任何条件下运行的代码行。

这里的一个例子是如果您的程序使用第三方库,但库中存在错误。如果您的程序从不使用库的这些部分,或者您发送给库的数据会导致它避免该错误,那么您将不会受到影响。

你可以写一个程序,通过反射,假设所有条件语句将被采取,并遵循所有的函数调用,通过所有派生类,但我不知道这是什么会告诉你。它当然不能告诉你代码行中是否存在任何错误。

+1

一般而言,我听说过术语“代码覆盖率”是指测量是否执行特定的代码行,而不是执行了多少次。 – 2010-02-27 17:15:10

+0

@John Saunders:IIRC gcov告诉你每行执行多少次。参见:http://gcc.gnu.org/onlinedocs/gcc/Gcov-Intro.html#Gcov-Intro但是,是的,你只需要知道*是否已经执行了一行。 – quamrana 2010-02-27 17:21:10

+0

这是一个关于gcov的问题?如果是这样,那么我错过了。我只熟悉其他六种代码覆盖系统,其中没有任何一种代码涵盖范围之外的任何内容。 – 2010-02-27 17:37:49

一般来说,答案是否定的。这相当于halting problem,这是不可计算的。

Coverity Static Analysis是一种工具,是可以识别的程序很多secuirty缺陷。它还可以识别死代码,并可用于帮助满足测试法规,如D0178B,这要求开发人员证明所有代码都可以执行。

有些(研究)工具基于抽象解释或模型检查,可以显示覆盖属性而不执行,适用于语言子集。参见例如

“在界模型检验分析功能覆盖”,格罗斯,库恩D.,U德雷克斯勒,2008年

一般R.,是的,有办法的,但他们是专业的,可能需要一些正式的方法经验。这种东西仍然是尖端的研究。

请参阅Static Estimation for Test Coverage,该技术可以在不执行源代码的情况下估计覆盖率。

的基本思想是计算program slice每个测试用例,然后在“计数”切片列举什么。 (向前)切片实际上是程序的一部分,您可以从代码中的特定起点(本例中为测试代码)到达该切片。

尽管如果您不是ACM会员(或者您没有出席会议),上述技术文件很难得到,但有一个slide presentation here

当然,运行这个静态估计器只会告诉你(大致)什么样的代码将被执行。它并不代替实际运行测试,并验证它们通过!