标签:
简介
代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例 计算得出。代码覆盖率可以有效避免包含未测试代码的程序被发布。
代码覆盖率能不能提高软件的可靠性?答案是肯定的,代码的覆盖率分析是保证软件质量最简 便易行的方法。
代码覆盖率等级
代码覆盖率可以通过多种方法测量。最常用的是测量以下一个或多个指标:语句覆盖率,分支 覆盖率,修订的条件/判定覆盖率(MC/DC)。以下章节中将逐一详解这些代码覆盖率。
语句覆盖率
语句覆盖率用来度量被测代码中的可执行语句是否被执行到,它并不考虑循环或者条件语句, 只针对语句度量可执行代码。应当特别注意的是:“语句”并不等同于代码行。
一般情况下,对于 C,C++,Java或Ada,分号代表语句结束。在某些情况下,一条语句会跨越多 行代码。语句覆盖率可以有效度量可执行代码是否被执行,但同时也有一定的局限性。
语句覆盖率的局限
考虑如下图1的代码段:
int* p = NULL;
if (condition)
p = &variable;
*p = 123;
图 1 – 语句覆盖局限代码示例
如
果“condition”为true,那么就有可能达到100%的语句覆盖,然而这个测试用例忽略了另
一种情况:如果“condition”为假,程序将引用空指针,因此,虽然语句覆盖率是一个很好
的度量指标,它仍旧是入门级的代码覆盖率。理想情况下,即使“condition”为false,测试 用例也应当被计算。
分支覆盖率
分支覆盖率用来度量程序中所有的判定和分支以及相应的输出是否都被测试执行到,例如 “if”语句必须将“true”和“false”都考虑到以覆盖所有的输出。如果只有一个路径被执行,那么覆盖率将被标记为部分执行。
和语句覆盖率类似,分支覆盖浪费也有一些需要注意的细节,尤其在针对“惰性求值”的编程语言时,惰性求值是将代码的求值操作延迟到需要结果值时再进行的一项技术。
分支覆盖率的局限
典型的情况是当有复杂的布尔表达式的“惰性求值”出现时,如下图2的代码片段:
int* p = NULL;
if (condition1 && (condition2 || function1(*p)))
statement1;
else
图 2 – 分支覆盖率局限代码示例
考虑“condition1”为假的情况,惰性求值将不会度量“condition2”或,此种情况同样会导致 代码“if (condition1 && (condition2 || function1(*p)))”的分支覆盖率计算错误。
继
续考虑“condition1”和“condition2”都为真的情况。惰性求值将再次导致“function1(*p)”
不会被度量,也同样会导致代码“if (condition1 && (condition2 ||
function1(*p)))”的分支覆盖率 计算错误。在此种情况下,有可能出现分支覆盖率为100%但软件中仍有潜在缺陷的情况。
修订条件/判定覆盖率(MC/DC)
MC/DC是一种特殊的分支覆盖率,它不但会使用分支覆盖率报告复杂条件下的true和false输出,同时也会报告复杂条件下的全部分支条件输出。
MC/DC最初由波音公司创建,用于航空软件中DO-178B的A级认证。通过对所有的子条件输出分支的独立证明,有效解决了惰性求值带来的问题。
继
续讨论代码示例2,我们需要在“condition2”和“function1(*p)”固定的条件下验证“condition1”
的“true”和“false”判定分支,之后继续固定“condition1”和“function1(*p)”验证“condition2”
的判定分支。
同样的,让我们在固定“condition1”和“condition2”的条件下讨论
“function1(*p)”。在其他分支条件固定的情况下验证某个分支条件的“true”和“false”值称作“MC/DC对”。MC/DC对一般
使用MC/DC真值表描述。表1就是一个MC/DC真值表示例。
利用代码覆盖率提高嵌入式软件的可靠性 - VectorCAST
标签:
原文地址:http://www.cnblogs.com/trinitytec/p/4882609.html