岳 海 任慧敏
北京航天自动控制研究所,北京 100854
基于修正条件判定覆盖的软件测试技术研究和方法应用
岳 海 任慧敏
北京航天自动控制研究所,北京 100854
对在航天软件测试过程中广泛应用的修正条件判定覆盖测试技术进行了说明,并在此基础上对修正条件判定覆盖的测试用例设计方法进行举例描述,最后给出了使用工具对修正条件判定覆盖测试的应用情况,对相关领域的技术人员有一定的参考意义。
软件测试;修正条件判定覆盖;最小测试用例集
软件测试是为了发现软件错误而执行程序的过程,是保证软件质量的重要手段。通过软件测试可以有效的减少软件缺陷,提高软件的安全性和可靠性。通常根据软件代码在动态测试执行过程中的可见性,又分为黑盒测试和白盒测试。黑盒测试是在程序代码不可见的情况下,基于规格说明进行功能测试的方法;而白盒测试是在程序代码可知的情况下,依据结构设计开展的结构或逻辑测试方法。白盒测试又包括程序结构分析、逻辑覆盖、路径分析等方法技术,其中修正条件判定覆盖(Modified Condition/Decision Coverage,以下简称MC/DC)就是逻辑覆盖中比较典型的测试技术,目前被广泛应用于高安全性、高可靠性的关键软件测试中。
1.1 MC/DC的定义
MC/DC覆盖测试,由波音公司提出,并被RTAC/DO-178B(机载系统和设备合格审定中的软件考虑)所采纳。对于关键性的实时程序而言,超过半数的可执行代码可能都与布尔运算表达式有关,表达式实现的正确性直接关系到程序的可靠性和安全性。采用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.[1]
由上可知,在MC/DC的定义中要求:
1)程序中每一个入口和出口至少被执行一次;
2)程序中的每一个条件和所有可能的结果至少出现一次;
3)每个判定中的每个条件必须能够独立影响判定的结果,即在其它条件不变的情况下,仅改变这个条件的值,可使得判定结果改变[2]。
这里条件是指由关系操作符构成,不包含任何逻辑操作符的布尔表达式;判定是指包含逻辑操作符的布尔表达式。如果同一个布尔表达式在一个判定中出现多次,则该表达式也应算作多个条件。
MC/DC的计算方法:
MC/DC用例数=被证明独立影响判定结果的布尔操作数的数量÷布尔操作数的总数。
1.2 MC/DC应用的范围
MC/DC用在采用高级语言开发的具有关键高安全等级的软件测试过程中,它可以有效地发现布尔表达式中存在的缺陷,主要发现的软件问题包括:
1) 操作符使用缺陷,如“与”被误写为“或”;
2) 变量被误写为它的否定所导致的错误操作;
3) 表达式被误写为它的否定所导致的错误操作等。
采用MC/DC测试时,首先确定独立影响判定结果的条件,也就是说如果一个条件能单独确定判定的输出值(判定中的其它条件保持不变),则称该条件独立地影响判定结果。表明条件独立影响判定结果的两组测试用例称为独立影响对。其次,通过真值表进行分析,获取独立影响结构的的最小子集即可得到MC/DC的最小用例集。设计独立影响结果的最小测试用例集一般有2种方法:唯一原因法和屏蔽法。
2.1 唯一原因法
在唯一原因法中,只有关心的条件值和判定结果可以改变,而其他所有可能的条件必须保持固定。固定其他所有可能的条件是为了确保只有该条件能独立影响判定结果。举例说明真值表的用法,表1是判定“Z=(A∨B)∧(C∨D)”的唯一原因法示例。
表1 唯一原因法真值表
从真值表中可以看出:
1)(2 ,10),(3 ,11),(4 ,12) 表明条件A的独立影响;
2)(2 , 6),(3 , 7),(4 , 8) 表明条件B的独立影响;
3)(5 , 7),(9 ,11),(13,15) 表明条件C的独立影响;
4)(5 , 6),(9 ,10),(13,14) 表明条件D的独立影响。
通过判定中所有条件的独立影响对的最小组合可生成该判定的最小测试用例集,因此取交集后可以得到测试用例组(2,5,6,7,10)、(3,7,9,10,11)或(4,8,12,13,15)构成判定Z的最小测试用例集。
2.2 屏蔽法
屏蔽法是指对一个逻辑操作符的特定输入能隐藏对该操作符的其他输入的影响。如“OR”操作符的“T”输入可以屏蔽其他所有输入;对“AND”操作符的“F”输入可以屏蔽其他所有输入;只要对判定的内部逻辑分析表明关心的条件是唯一影响判定输出值的条件,那么屏蔽法允许独立影响对中多于一个输入值的改变。
对于例子 Z=(A∨B)∧(C∨D)中为了表明条件A的独立影响性,组合条件(Y= (C∨D))必须为“T” ;因为如果Y为“F”,则判定“Z”的值总为“F”。对于唯一原因法,在条件A的独立影响对中,条件C和D的值必须是固定的。而在屏蔽法中允许C和D的值变化,只要组合条件Y的结果为“T”。这样屏蔽法比唯一原因法会产生更多的独立影响对。在表1中,测试用例组2和测试用例组10~组12都能配对表明条件A的独立性影响。
通过建立中间变量来替代所有不关心的变量,也是检查条件屏蔽的有效方法,如,在查找上述判定中的A或B的独立影响对时,可用Y替代组合条件(C∨D),这样便可以利用唯一原因法设计条件独立影响结果的最小测试用例集。采用真值表获取MC/DC覆盖的屏蔽法见表2。
表2 屏蔽法真值表
某些特殊条件下,例如((X<2)‖(Y<5))&&((X<2)‖(Y≥5))是一个判定,可以表示为Z=(A∨B)∧(C∨D),在这个布尔表达式中A和C条件是一样的,B和D是取反的关系,如果严格按照MC/DC的定义,不考虑条件之间的关系和逻辑替代,由于A=C,B=!D的关系存在,实际上不存在严格意义上的独立对,为了处理这类情况,可以先进行逻辑操作符的短路或布尔表达式化简,忽略对最终结构不产生作用的条件,之后采用真值表进行分析,并获取最小测试用例集。
目前流行的软件测试工具中很多都能够提供MC/DC覆盖率度量方法,如Cantata++,LDRA Testbed,下面以LDRA Testbed为例,介绍MC/DC方法在软件测试工具中的应用。
对于高级语言编制的软件,LDRA Testbed 有3 级代码覆盖指标,TER1=1 代表100%的语句覆盖,TER2=1 代表100%的分支覆盖,TER3=1 代表100%的LCSAJ 覆盖(最高级覆盖指标路径覆盖的一种),而MC/DC覆盖是介于分支覆盖和LCSAJ 覆盖之间的一种多条件判定覆盖指标。
1)TER1=1 即100%语句覆盖意味着:代码包含的每条语句都被使用的测试数据执行过,每个函数调用都被执行过;
2)TER2=1 即100%分支覆盖意味着:代码包含的每条语句都被使用的测试数据执行过,程序的每个判断至少取真分支和假分支一次,即判断的真假值均曾满足;
3)100%的MC/DC 覆盖除了具有上述的所有特征外,还意味着:所有对结果独立影响的条件都被执行过。
对于只有两三个分支条件的多条件判定,用户可以采用人工的方式设计测试用例达到100%的MC/DC 覆盖,但是随着分支条件数目的增大,人工方式设计测试用例条件下就有可能遗漏执行某些条件组合或分支,而通过LDRA Testbed工具的辅助则可以避免这一情况。LDRA Testbed在静态分析阶段会通过语法分析侦测到程序内所有的多条件判定,并且会产生MC/DC 测试用例计划报告和动态测试覆盖分析报告,辅助用户设计适当的测试用例满足100%的MC/DC 覆盖,如果用户在执行完已设计的用例后,LDRA Testbed会根据用例执行的覆盖情况,给出未被覆盖的独立条件或分支分析报告,用户可以根据实际运行情况适当补充用例,达到测试覆盖要求。
使用LDRA Testbed辅助进行MC/DC覆盖测试用例设计和执行分析的基本步骤如下:
1)使用LDRA Testbed对程序进行静态分析,从程序中抽出布尔表达式的独立影响条件;
2)基于需求设计测试用例,并根据独立影响条件通过真值表获取符合MC/DC准则的测试用例;
3)结合源代码执行测试用例,并分析测试结果,如果结果为“FALSE”,则说明软件存在缺陷;
4)结合覆盖分析报告获取MC/DC覆盖的条件,如有条件遗漏,则根据设计方法适当补充用例并执行。
表3为某飞行控制软件部分功能模块的覆盖率信息,其中最后一列为MC/DC覆盖率情况。
表3 LDRA Testbed覆盖率信息
MC/DC覆盖测试具有较强的逻辑覆盖强度,是对分支条件组合覆盖的一种非常实用的折衷,通过MC/DC覆盖测试可以更充分地测试每个独立的子条件,消除子条件中可能存在的错误,达到用户的需求和争取较高的性价比。MC/DC覆盖与分支条件组合覆盖相比,能够通过真值表等合理的用例设计方法,在满足测试覆盖指标要求的前提下设计出具有较少测试用例的用例集,并有效发现软件中存在的逻辑缺陷。由于MC/DC覆盖具有更强的覆盖强度,且可有效防止测试用例随逻辑复杂度呈指标上升的优势,目前已被广泛地应用到我国航空航天高级语言编制的安全苛刻性软件的测试中,成为检出软件错误保证软件质量的有效而重要的测试方法。
[1] 机载系统和设备合格审定中的软件考虑[S].美国航空无线电委员会文件RTAC/DO-178B,1992.
[2] 古乐,史九林,赵斌.软件测试技术概论[M].北京:清华大学出版社,2004.
The Research on the Method of Software Testing Based on MC/DC
YUE Hai REN Huimin
Beijing Aerospace Automatic Control Institute, Beijing 100854, China
Thedesignandeditingtestcasesarethemostimportantstepintheprocessofsoftwaretesting.Asoftwaretestingmethodbasedonmodifiedcondition/decisioncoveragecriterionispresentedinthispaper.AndanexamplegivenshowstwodifferentMC/DCcasedesignideasforacomplicatedsituation.AreasonabledesignisconcludedforthissituationwhichiscombinedwiththecoverageanalysisresultbyLDRAtest-bed.
Softwaretesting;ModifiedCondition/DecisionCoverage;Minimaltestcasesset
2011-09-26
岳 海(1973-),男,陕西人,高级工程师,研究方向为软件测试;任慧敏(1981-),女,内蒙古人,工程师,主要从事软件设计与测试技术研究。
TP391.9
A
1006-3242(2012)03-0069-04