1 简介
文章的目的在于通过比较发现条件判定覆盖(即Condition/Decision Coverage C/DC)和修正条件判定覆盖(Modified Condition/Decision Coverage即MC/DC)的差异.软件测试是一项大型的软件工程中必不可少且非常重要的一部分,软件测试使用两种测试方法:静态测试和动态测试.静态测试是指不用执行程序的测试,它主要采取方案——代码走查、技术评审、代码审查的方法对软件产品进行测试;而动态测试是指实际运行程序,并通过观察程序运行的实际结果来发现错误的软件测试技术,它分为黑盒测试和白盒测试.黑盒测试是在不知道程序内部结构,只知道程序规格的情况下采用的测试技术或策略;而白盒测试是一种在知道程序内部结构的情况下采用的测试技术或策略,就是要选取足够的测试用例,对源代码实现比较充分的覆盖,以便尽可能多地发现程序中的错误.它包括逻辑覆盖法和路径测试法的两种技术.C/DC和MC/DC就是白盒测试方法中的逻辑覆盖方法中的两个成员.目前这两种方法在软件测试中被广泛应用,尤其是MC/DC更是被很多大型软件测试(如飞行控制软件的测试)所应用
2 对C/DC和MC/DC的描述
2.1 C/DC的定义
C/DC是Condition/Decision Coverage的缩写,含义是条件判定覆盖.对它的定义为:
Condition/Decision Coverage——it combines the requirements for decision coverage with those for condition coverage.That is,there must be suficient test cases to toggle the decision outcome between true and false and to toggle each condition value between true and false.
例如:if A and (B or C) then⋯ else⋯ 测试这条语句使用C/DC方法可以从表l(具有3个条件的真值表)中选择它的测试集为{ TTF,FFT},分析如下:当 ,B和C的值依次分别取T,T,F时判定A and (B or C)的值为T;当将A,B和C的值依次分别取F,F,T时,判定A and (B or C)的值为F;在测试中,3个条件A,B,C的所有可能取值T、F,都被测试,而判定 A and (B or C)的所有可能取值T和F也都被执行了一次,由此说明此测试集满足C/DC方法的要求,是C/DC方法的其中一个测试集合.
2.2 MC/DC的定义
MC/DC是Modified Condition/Decision Coverage(MC/DC)的缩写,含义是修正条件判定覆盖.对它的定义为:
Condition —— a Boolean expression containing no Boolean operators:
Decision —— a Boolean expression composed of conditions and zero or more Boolean operators:
Modified Condition/Decision Coverage —— every point of entry and exit in the program has been invoked at least once,every condition in the program has taken all possible outcomes at least once,and each condition in a decision has been shown to independently affect a decision S outcome by varying just that condition while holding fixed all other possible conditions.
由上可知:在MC/DC这种测试方法中,条件表示不含有布尔操作符号的布尔表达式;判定表示由条件和零或者很多布尔操作符号所组成的一个布尔表达式;而修正条件判定覆盖方法要求在一个程序中每一种输入输出至少得出现一次,在程序中的每一个条件必须产生所有可能的输出结果至少一次,并且每一个判定中的每一个条件必须能够独立影响一个判定的输出,即在其他条件不变的前提下仅改变这个条件的值,而使判定结果改变.
与上文同样的例子:if and (B or C) then⋯ else⋯ 这条语句,A and (B or C)是一个判定,A,B,C均为条件,使用MC/DC方法找出分别对应此3个条件的测试集中有4组元素为:{TTF, F,TFT,FFT}.方法如下:测试元素均从表1中选取,保持A和B的值不变测试元素TFF和TFT可以改变C条件的值和整个表达式的结果(F变成了T);而保持A和C的值不变测试元素TTF和TFT可以改变B条件的值和整个表达式的执行结果(T变成了F);而当保持B和C的值不变测试元素TFT和FFT可以改变A条件的值和整个表达式的执行结果(T变成了F).这个测试集完全满足MC/DC的要求即当锁定其它的条件保持不变,而改变判定中一项条件的值,必然引起整个表达式执行的变化.
3 C/DC和MC/DC之间的差异
3.1选取两种方法的条件不同
当以下的需求在程序测试中遇到时,需要考虑用MC/DC方法:每一个程序模块的输入和输出点都要考虑至少出现1次,每个程序的判定到所有可能的结果值要至少实现1次;程序的判定被分解为通过逻辑操作符(AND,OR,etc.)连接为BOOL条件,每一个条件对于判定的结果值是独立的,或者说单个条件的变化将导致判定的最后变化.
而对于C/DC方法而言,在程序需要测试时,由于它只要求“判定中每个条件的所有可能取值至少执行一次,同时每个判定的所有可能判定结果至少执行一次”,要求比较简单,所以它可以与其他覆盖方法一样适合于使用在绝大多数的程序的测试中.
3.2 两者的测试集不同
The MC/DC criterion enhances the condition/decision coverage criterion by requiring that each condition be shown to independently affect the outcome of the decision.MC/DC方法虽是在C/DC方法上的改进,但是两者在寻找测试集时是不同的,原因在于MC/DC方法要求对于判定中的所有条件当固定其他条件的值时每一个已选定的条件必须能够独立地影响一个判定的输出.
在以上的举例中:if A and (B or C) then⋯else⋯ 这条语句上文已找出用C/DC方法其一个测试集合为{TTF,FFT},同时如果采用MC/DC方法其测试集合可为{TTF,TFF,TFT,FFT}.对比两个测试集可发现测试集中的元素是不同的,而且元素组数也是不同(C/DC方法有2组,MC/DC方法有4组).原因是:对于C/DC方法来说,不管条件个数有多少,一个测试集中的元素组数最少可以为2个.推导如下:各个条件的取值只有两种T,F,从每个条件的取值中取出一个将它们组合起来形成一组元素,并使得这组元素分别一一对应相应条件而代人整个判定得出的最后结果值为T;然后从剩下的各个条件的取值中组合形成另一组元素并使得元素中的各个值分别对应相应条件代人整个判定后能使表达式的结果值为F(这两种情况是一定可以从真值表中找到的),这样就达到了C/DC取测试集的要求,即各个条件的可能取值T和F都必须取到,且判定结果的可能取值T,F也必须实现.而另外对于MC/DC方法来说如果在一个表达式中N个条件只出现一次,那么一个测试集中的元素组数为N+1个.这句话说明测试集中的元素组数与表达式中的条件个数有关.
3.3两者在测试中的覆盖面不同
对于MC/DC方法,它的覆盖面是要大于C/DC方法的,也就是指在测试一个程序或一个软件时,MC/DC能比C/DC找到更多的错误之处,原因就在于MC/DC的测试集检测出错误发生的概率比较高.再举一个很简单的例子:对于这条If A or B then⋯ else⋯语句,由文章的前部可知使用C/DC方法它的测试集可为{TT,FF};可是如果在这条语句中的操作符号是笔误(由and一时大意写成了or ),那么即使采用了{TT,FF}来测试仍然检测不到错误(因为T and T = T or T,且F and F = F or F,即无论将测试集中的哪组元素代人到两个判定中⋯ V ⋯ ,⋯ ^ ⋯ ,两者所得到的判定结果相同),由此可说明虽然使用了判定条件覆盖(C/DC)准则来测试语句,逻辑表达式中的有些错误仍然不能检测出来;可是如果大家用MC/DC方法,由它的规则可得测试集合为{FF,TF,FT },只需使用其中的一组数据TF,就可知道其中发生了错误.原因是:T or F值为T,而 T and F值为F,T and F语句的判定结果本来应该得到F却得到了T,由此可说明中间的操作符号发生了错误,这样就检测到了错误.所以这个例子说明MC/DC的测试集合的覆盖面要大于C/DC方法,若用户对于测试程序的质量要求较高,而不考虑其他因素,那么可以使用MC/DC的方法来测试自己的大型软件或单个程序.
3.4两者的用途不同
由于MC/DC在寻找测试集时的要求比C/DC要严格,所以相比较下在测试时为了寻找出测试集合所花费的时间多,由此而引起的人力、物力、财力三重开销也会直接攀升,但是MC/DC测试错误的准确率却是特别地高,因此MC/DC适合那些大型的并且要求测试非常精确的软件测试所用.为达到用户的目的和一个较高的信价比,近年来MC/DC方法主要应用于大型的航空航天软件程序的测试上.
对比而言C/DC方法要求较低,开销少,而覆盖率也低,所以比较适合对于例如C++,JAVA等小型的程序的}贝4试当中使用,这正是因为小型程序所拥有的项目经费较少、语句代码少则导致相应地寻找错误也比较容易.此时使用C/DC方法足以测试软件.
4总结
本文介绍了条件判定覆盖和修正条件判定覆盖两个测试方法的定义和使用,并且通过比较分析出两者之间所存在的差异.目前,在市场上,C/DC和MC/DC两种测试方法被社会广泛应用,但是由于两者的各个不同点,用户必须根据软件自身测试时能给出的条件及软件测试所需要达到的程度选择使用适当的测试方法.