2 基本的度量
有许多覆盖率度量存在,这里介绍一些基本的度量的益处和弱点。
2.1 语句覆盖(Statement Coverage )
这个度量报告每一个可执行语句是否被执行。
也称为:行覆盖(line coverage), 段覆盖(segment coverage) [Ntafos1988], C1 [Beizer1990 p.75] 和基本块覆盖(basic block coverage)。基本块覆盖当每一个序列的语句是无分支的语句时和语句覆盖相同。
这个覆盖度量的主要好处是它可以直接应用在目标码上,不需要对源代码进行处理。执行轮廓就完成了这个度量。
这个覆盖度量的主要缺点是对一些控制结构很迟钝。例如,考虑下列的C/C++ 代码:
int* p = NULL;
if (condition)
p = &variable;
*p = 123;
如果当condition 取假的情况下,语句覆盖率显示这四句都覆盖到了,但是代码执行是失败的。这是一个语句覆盖率的严重的缺陷,IF语句是很普通的一种情况。
语句覆盖不能报告循环是否到达它们的终止条件―――只能显示循环是否被执行了。
既然do-while 循环通常要至少执行一次,语句覆盖认为它们和无分支语句是一样的。
语句覆盖率对逻辑运算符反映是迟钝的(|| and &&)。
语句覆盖不能区分连续的switch 语句。
测试用例通常和判定有关而不是和语句有关。你可能不必用10个单独的测试用例来测试一个有10个无分支语句的语句,你可能只用一个测试用例就够了;考虑一个IF-else语句,包含一条语句在then子句,99条语句在else子句,当执行两个可能路径的其中之一时,语句覆盖率得到如下的结果: 1 或 99 的覆盖率。基本块覆盖率就忽略了这个问题。
2.2 判定覆盖(Decision Coverage )
这个度量报告是否BOOL型的表达式取值true 和false在控制结构中被测试到了(例如if-statement和while-statement)。 整个的BOOL型的表达式被认为是取值一个true 和false,而不考虑是否内部包含了logical-and 或 logical-or 操作符。另外,这个度量包括switch-statement cases, exception handlers, and interrupt handlers的覆盖.
也被称为:分支覆盖(branch coverage), 所有边界覆盖(all-edges coverage) [Roper1994 p.58], 基本路径覆盖(basis path coverage )[Roper1994 p.48], C2覆盖 [Beizer1990 p.75], 判定到判定路径覆盖(decision-decision-path或DDP testing [Roper1994 p.39]. )"Basis path" 测试就是选择路径来达到所有的判定覆盖.
这个度量有语句覆盖的简单性,但是没有语句覆盖的问题。
缺点是这个度量忽略了在BOOL型表达式内部的BOOL取值。例如考虑如下的C/C++/Java 代码:
if (condition1 && (condition2 || function1()))
statement1;
else
statement2;
这个度量可以完全可以不用调用function1. 测试表达是为真时可以取condition1 为true 和condition2 为true,测试表达是为假时可以取condition1 为false。
2.3 条件覆盖(Condition Coverage )
条件覆盖报告每一个子表达式的结果的true 或false 。logical-and 和logical-or 独立起来。条件覆盖独立的度量每一个子表达式.
这个度量和decision coverage 相似,但是对控制流更敏感。
但是,完全的条件覆盖并不能保证完全的判定覆盖。例如,考虑下列的C++/Java 代码。
bool f(bool e) { return false; }
bool a[2] = { false, false };
if (f(a && b)) ...
if (a[int(a && b)]) ...
if ((a && b) ? false : false) ...
所有三个IF语句不管a和b取值是什么,判定覆盖率只能达到50%。但是条件覆盖率却能达到100%。
2.4 多条件覆盖(Multiple Condition Coverage )
多条件覆盖报告每一个可能的BOOL型子表达式的组合发生了。相对于条件覆盖,即通过logical-and和logical-or把子表达式独立起来相比, 多条件覆盖需要的测试用例是用一个条件的逻辑操作符的真值表来确定的。
对于C, C++和Java等具有short circuit operators的语言,多条件覆盖的益处是它需要一个彻底的测试。
缺点是它可能是非常冗长乏味的来决定一个需要的测试用例的最小设置,尤其是对于非常复杂的BOOL型表达式。另一个缺点是,这个度量需要的测试用例对于相似的复杂性的条件却需要非常大的变化。例如,考虑如下的C/C++/Java 条件:
要达到完全的多条件覆盖,第一个需要6个测试用例,
而第二个需要11个测试用例。
但是两个条件却有相同的操作数和操作符。
对于Visual Basic 和Pascal等不具有short circuit operators的语言, 多条件覆盖对于逻辑表达式是非常有效的路径覆盖,具有相同的优缺点。考虑下列的Visual Basic 代码:
If a And b Then
...
多条件覆盖需要四个测试用例,a 和b分别取值true 和false.
2.5 分支条件组合覆盖(Condition/Decision Coverage )
分支条件组合覆盖是条件覆盖(condition coverage)和分支覆盖(decision coverage)的一个混血。 它有两者的简单性但是没有两者的缺点。
2.6 修正条件/判定覆盖(Modified Condition/Decision Coverage)
也被称为MC/DC 和MCDC.
这个度量需要足够的测试用例来确定每个条件能够影响到包含的判定[Chilenski1994]的结果。这个度量是最早是被波音公司创建被用于航空软件中RCTA/DO-178B。
这个度量起初是是设计来对于无short circuit operators的语言。 short circuit logical operators 在C, C++和Java语言中的作用仅仅是当它们的结果能够影响到被包含的判定的评估条件。
当以下的需求遇到时,需要考虑用MCDC覆盖:
• 需求1: 每一个程序模块的入口和出口点都要考虑要至少被调用一次,每个程序的判定到所有可能的结果值要至少转换一次。
• 需求2:程序的判定被分解为通过逻辑操作符(AND, OR, etc.)连接为BOOL条件。每一个条件对于判定的结果值是独立的,或者说单条件的变化将导致判决的变化。
所以,据以上的定义,以下三组数据是必须的。(单条件的变化将导致判决的变化)
其中T1 & T2,或T1&T3已经满足要求1,但要求满足条件2,就必须存在同时存在T1&T2&T3。
T4:(F,F),是多余的,因为一个条件改变并不能导致判决的改变。
T1(T,T)与T2(T,F)表明Y独立影响了判决,Y的独立对;
T1(T,T)与T3(F,T)表明X独立影响了判决,X的独立对。
再如:
测试用例1 (T,T,T) 和测试用例5 (F,T,T) ,对于X独立。
测试用例2 (T,T,T) 和测试用例6 (F,T,T) ,对于X独立。
测试用例3 (T,T,T) 和测试用例7 (F,T,T) ,对于X独立。
测试用例2 (T,T,T) 和测试用例4 (F,T,T) ,对于Y独立。
测试用例3 (T,T,T) 和测试用例4 (F,T,T) ,对于Z独立。
结果,测试用例组{1,5,2,4,3} 满足MCDC覆盖对表达式X, Y和Z的要求。
明显,这不是唯一的组合,例如还有{6,2,4,3}。
2.6.1 覆盖率的计算公式:
或者: number of tests
number of tests + minimal nuber of test required
2.7 路径覆盖(Path Coverage )
这个度量报告是否函数的每一个可能的分支都被执行了。一个路径就是一个从函数的入口到函数的出口的唯一的系列分支。
也称呼为断言覆盖(predicate coverage)。断言覆盖可以看出可以组合的逻辑条件的路径[Beizer1990 p.98]。
因为循环引入了一个很大的路径数,这个度量只考虑一个有限数量的循环可能性。有很多的变种来处理循环,内部边界路径测试(Boundary-interior path testing)只考虑循环的两个可能性。重复零次和多于零次的重复[Ntafos1988]。对于do-while 循环,两种,零次反复和多于零次反复。
路径覆盖的一个好处是:需要彻底的测试。
但有两个缺点:
一是,路径是以分支的指数级别增加的,例如:一个函数包含10个IF语句,就有1024个路径要测试。如果加入一个IF语句,路径数就达到2048。
二是,许多路径不可能与执行的数据无关。例如
if (success)
statement1;
statement2;
if (success)
statement3;
路径覆盖认为以上语句包含四个路径,实际上只有两个是可行的:success=false 和 success=true.
研究者发明了很多种的路径覆盖技术来避免大数量的路径。如,n-length sub-path coverage 报告你是否exercised each path of length n branches.其它变种包括linear code sequence and jump (LCSAJ) coverage 和data flow coverage.
posted on 2008-01-19 20:32
三原 阅读(4286)
评论(0) 编辑 收藏 引用 所属分类:
软件测试