判定覆盖
出自 MBA智库百科(https://wiki.mbalib.com/)
判定覆盖(Decision Coverage)
目录 |
判定覆盖是指设计若干个测试用例,运行被测程序,使得程序中每个判定条件的取真分支和取假分支至少评价一次。
判定覆盖具有比语句覆盖更强的测试能力,而且具有和语句覆盖一样的简单性,无需细分每个判定就可以得到测试用例。但是大部分的判定语句是由多个逻辑条件组合而成(如,判定语句中包含AND、OR、CASE),若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。
判定覆盖是设计足够多的测试用例,使得程序中的每一个判断至少获得一次“真”和一次“假”,即使得程序流程图中的每一个真假分支至少被执行一次。
使设计的测试用例保证程序中每个判断的每个取值分支(ture or false)至少经历一次
【优点】:分支(判定)覆盖具有比语句覆盖更强的测试能力。同样分支(判定)覆盖也具有和语句覆盖一样的简单性,无须细分每个判定就可以得到测试用例。
【缺点】:往往大部分的分支(判定)语句是由多个逻辑条件组合而成,若仅仅判断其整个最终结果,而忽略每个条件的取值情况,必然会遗漏部分测试路径。判定覆盖仍是弱的逻辑覆盖。
判定覆盖
CASE让判断1和2都分别能出现 true, false .
CASE1:
A=TRUE, B=TRUE——判断1= True;
C=TRUE,D=TRUE——判断2=TRUE;
CASE2:
A=TRUE,B=TRUE——判断1=TRUE
C=FALSE,D=FALSE——判断2=FALSE
CASE3:
A=FALSE,B=TRUE——判断1=FALSE
判断2不执行,
这里B=FALSE情况就没覆盖到。
修订的条件/判定覆盖(Modified Condition/Decision Coverage)
MC/DC(修订的条件/判定覆盖,Modified Condition/Decision Coverage)准则是一种实用的软件结构覆盖率测试准则, 已被广泛地应用于软件验证和测试过程中
下举例来详细说明MC/DC下测试用例的设计准则:
if(A( ) || B ( ) && C( )){
do action1();
}else{
do action2( );
}
A( ),B( ),C( )都是一个条件,而(A( ) || B( ) && C( ))叫一个Decision,如果是判定覆盖的话只需两个case就能覆盖,就是让这个decision为true和false各一次
如果是MC/DC的话就得四个case,而且只比条件数目多一个而已,怎么计算的呢?
定义: 在每个判定中的每个条件都曾独立的影响判定的结果至少一次, (独立影响意思是在其他的条件不变的情况下,改变一个条件)
那么就有如下测试用例(true和false的顺序就按照A( )、B( )、C( )来):
A( )对结果独立影响,那么就要求"B( )"和"C( )"中至少一个为false,于是有:
A( )独立影响且decision为true:
true false false
true false true
true true false
A( )独立影响且decision为false:
false false false
false false true
false true false
B( )对结果独立影响,那么就要求"A( )"为false,"C( )"为true,于是有:
B( )独立影响且decision为true:
false true true
B( )独立影响且decision为false:
false false true
C( )对结果独立影响,那么就要求"A( )"为false,"B( )"为true,于是有:
C( )独立影响且decision为true:
false true true
C( )独立影响且decision为false:
false true false
需要进一步补充说明的是,MC/DC测试的主要目的是为了防止在组合条件表达式中包含边际效应(side effect),如以下语句:
if (A( )||B( )||C()){
statements...;
}
当B( )函数或C( )函数具备边际效应时,MC/DC测试存在非常大的必要性;
原则上不应在组合条件表达式中调用包含边际效应的函数。