有没有办法在不运行代码的情况下确定代码覆盖率?

时间:2010-02-25 19:12:49

标签: code-coverage code-analysis static-analysis ncover

我不是要求StyleCop或Fxcop提供的静态代码分析。两者都有不同的目的,它很好。我在问是否有办法找到用户控件或子模块的代码覆盖率?例如,您有一个在单独的程序集中使用帮助程序类的应用程序。为了确保单元测试代码覆盖率,我们需要运行应用程序并确保使用NCover或类似工具。

我的要求是,如果没有运行它,是否有可能找到辅助类或类似程序集的代码覆盖率?

5 个答案:

答案 0 :(得分:5)

有关在不执行源代码的情况下估算覆盖率的技术,请参阅Static Estimation for Test Coverage

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

虽然如果你不是ACM会员[或者你没有参加会议的出席会议],上面的技术论文很难获得,但是有一个slide presentation here

当然,运行此静态估算器只会告诉您(大致)将执行哪些代码。它不能代替实际运行测试,并验证它们是否通过了测试!

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

“分析有界模型检验中的功能覆盖”,Grosse,D。Kuhne,U。Drechsler,R。2008

总的来说,是的,有方法,但它们是专业的,可能需要一些正式的方法经验。这种东西仍然是最前沿的研究。

答案 3 :(得分:0)

Coverity Static Analysis是一个可以识别程序中许多安全漏洞的工具。它还可以识别死代码,并可用于帮助满足测试规则,如D0178B,这要求开发人员证明所有代码都可以执行。

答案 4 :(得分:0)

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

我对代码覆盖率的定义是一个结果,它表示在程序中运行每行代码的次数:当然,这意味着运行程序。这里的决定因素通常是通过程序的数据值,它确定条件执行的执行路径。静态分析(如编译器)可以推断出在任何条件下都无法运行的代码行。

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

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