基于规格说明的若干逻辑覆盖测试准则.pdf
ISSN 1000-9825,CODEN RUXUEW E-mail: Journal of Software,Vol.21,No.7,July 2010,pp.15361549 http:/ doi:10.3724/SP.J.1001.2010.03615 Tel/Fax:+86-10-62562563 by Institute of Software,the Chinese Academy of Sciences.All rights reserved.基于规格说明的若干逻辑覆盖测试准则 钱忠胜1,2+,缪淮扣1 1(上海大学 计算机工程与科学学院,上海 200072)2(江西财经大学 信息管理学院,江西 南昌 330013)Specification-Based Logic Coverage Testing Criteria QIAN Zhong-Sheng1,2+,MIAO Huai-Kou1 1(School of Computer Engineering and Science,Shanghai University,Shanghai 200072,China)2(School of Information Technology,Jiangxi University of Finance and Economics,Nanchang 330013,China)+Corresponding author:E-mail:,http:/,http:/ Qian ZS,Miao HK.Specification-Based logic coverage testing criteria.Journal of Software,2010,21(7):15361549.http:/ Abstract:The specification-based testing can be used to test software functions without knowing program code.Decisions are the main form of the pre-and post-conditions in formal specifications.This work analyzes logic coverage testing criteria for specification-based testing.It proposes and analyzes in detail masking logic coverage testing criteria,to solve the problems that the existent determinant logic coverage testing criteria can not solve.A feasible test case generation algorithm based on the masking logic coverage testing criteria is presented.The test cases satisfying the masking logic coverage testing criteria can detect those errors caused by the masking property of conditions.It also analyzes the constraints among conditions,how to decompose and compose a complicated decision,and the relationship among decisions.These can respectively clarify the coupling problem among conditions,the multiple occurrences of a condition in a decision,and the position problem of decisions in a program.Additionally,test criteria including full true decision coverage,full false decision coverage,all sub-decisions coverage,unique condition true coverage and unique condition false coverage are proposed.The test sets satisfying these criteria can detect respectively different types of errors.Finally,the subsumption relation graph among these testing criteria is presented and different applicable scenarios for different testing criteria are suggested.Key words:test case;testing criterion;decision;condition;specification;subsumption relation Supported by the National Natural Science Foundation of China under Grant No.60673115(国家自然科学基金);the National High-Tech Research and Development Plan of China under Grant No.2007AA01Z144(国家高技术研究发展计划(863);the National Basic Research Program of China under Grant Nos.2007CB310800,2002CB312001(国家重点基础研究发展计划(973);the Research Program of Shanghai Education Committee of China under Grant No.07ZZ06(上海市教委科研项目);the Shanghai Leading Academic Discipline Project of China under Grant No.J50103(上海市重点学科建设项目);the Science and Technology Plan Project of the Education Department of Jiangxi Province of China under Grant No.GJJ10120(江西省教育厅科技计划项目);the School Foundation of Jiangxi University of Finace and Economics of China under Grant No.04722015(江西财经大学校级课题)Received 2008-04-03;Revised 2008-11-27,2009-01-14;Accepted 2009-03-31 钱忠胜 等:基于规格说明的若干逻辑覆盖测试准则 1537 摘 要:基于规格说明的测试可以在不需要了解软件程序代码的情况下对软件进行功能测试.判定是形式规格说明中用于描述前、后置条件的主要形式.分析了基于规格说明的逻辑覆盖测试准则,针对已有的决定性逻辑覆盖测试准则的不足,提出了掩盖性逻辑覆盖测试准则,并对其进行了详细分析.提出了掩盖性逻辑覆盖测试准则的一个可行的测试生成算法.根据该准则生成的测试用例能够发现条件的掩盖性带来的错误.然后,从判定的结构入手,分析了条件之间的约束关系、复杂判定的分解与合成、判定之间的关系.这些分别能够阐明逻辑覆盖中条件间的耦合性问题、同一个条件在判定中的多次出现问题以及判定在程序中的位置问题.继而提出了全真判定覆盖、全假判定覆盖、完全子判定覆盖、唯一条件真覆盖以及唯一条件假覆盖等测试准则.满足这些测试准则的测试用例集能检测出不同类型的错误.最后,给出了这些测试准则之间的包含关系图,并建议了不同测试准则适用的应用场景.关键词:测试用例;测试准则;判定;条件;规格说明;包含关系 中图法分类号:TP311 文献标识码:A 测试覆盖是根据测试准则来评估的,而测试准则的提出又与测试需求相关联1.若测试需求描述的是要覆盖“什么”,则测试规格说明阐述了它们“如何”被覆盖,而测试准则是一条或一组规则,这些规则把测试需求施加于测试用例集.也就是说,测试准则用一种完整而清晰的方式描述了测试需求.因此在软件测试中,测试准则的选择非常重要.测试准则一般分为基于程序的(白盒的、结构化的)和基于规格说明的(黑盒的、功能的).基于程序的测试准则考虑程序的内部结构.基于规格说明的测试准则用于从系统的形式规格说明出发产生测试用例,不需要程序的代码.形式化规格说明精确地描述了“做什么”而不是“怎么做”.因此,测试者可以从中获得重要的信息而无需从繁琐以及不重要的细节中提取.基于规格说明的测试与传统的基于代码的测试相比,它提供了一种更为严格的方法,并且简化了回归测试.此外,基于规格说明的测试还可以从测试数据中得出预期值,以及测试的开发和程序的设计与运行可以同步,这更有利于打破软件工程中的“先编码后测试”的做法,并且有利于对软件的生命周期中所有阶段并行地进行测试活动.为适应不同的需求,研究人员已经提出了各种各样的测试准则111.其中,逻辑覆盖测试准则主要用于基于形式规格说明的测试中12,通过分析规格说明中判定(decision)和条件(condition)的真值关系来产生覆盖某些判定和条件的真值取值的测试用例.文中涉及到的常见的逻辑覆盖测试准则的定义(定义 2定义 4 以及定义 6定义 9)来自于文献1和文献12,但是为了适应需要,有些地方作了相应的改动.在此基础上,本文提出了相应的逻辑覆盖测试准则(定义 11定义 18).这里讨论的判定(谓词表达式)仅使用到常用的 3 种逻辑联结词:(与),(或),(非),当然还有许多其他逻辑联结词(如异或、蕴含等),但包含其他逻辑联结词的判定可以通过等价公式转换成仅含有这 3 种逻辑联结词的判定.而且,两个语法结构不一样的等价判定的主析取范式或主合取范式一定是一样的.所以,我们一般只考虑这 3 种逻辑联结词.本文第 1 节界定判定的结构,给出测试用例的形式化定义,并讨论基本的逻辑覆盖测试准则.第 2 节给出决定性逻辑覆盖测试准则,这种准则测试条件的取值改变能够引起判定值的改变,举例说明这种准则不能适用的情况.第 3 节针对决定性逻辑覆盖测试准则的缺陷,提出掩盖性逻辑覆盖测试准则,并对其进行详细而深入的分析.提出掩盖性逻辑覆盖测试准则的一种可行的测试生成算法.还利用配对表分析条件的掩盖性,即条件取值的改变对判定的值没有影响.第 4 节从分析判定的结构入手,研究了条件之间的约束关系、复杂判定的分解与合成、判定之间的关系.并提出全真判定覆盖、全假判定覆盖、完全子判定覆盖、唯一条件真覆盖以及唯一条件假覆盖等测试准则.满足这些测试准则的测试用例集能够检测出不同类型的错误.第 5 节与相关工作进行比较,给出本文提出的测试准则与部分已有的测试准则之间的包含关系图,并建议不同测试准则适用的应用场景.第6 节总结全文,并给出下一步的研究工作.1538 Journal of Software 软件学报 Vol.21,No.7,July 2010 1 基本逻辑覆盖测试准则 判定是形式规格说明中用于描述前、后置条件的主要形式,也是程序中分支控制条件的主要表达形式,因而可作为基于规格说明的测试用例研究的主要对象和定义测试充分性的基础12.判定的主要元素是谓词,谓词中可以有常量、变量、函数以及它们的组合等项.关系表达式也是一个谓词.谓词通过逻辑联结词相连,构成判 定.如,XYxbZ(记为K)就是一个判定.不包含任何逻辑联结词的原子谓词或其否定称为条件.判定K 中有 5 个条件:X,Y,xb 和 Z.注意,x 和 y 都不是条件,而 xy 才是(因为考察的是逻辑联结词,而非关系算子).判定可用抽象语法树2表示.在软件的形式需求规格说明中,操作的前、后置条件是一组判定的集合,用 表示.C 是 P 中所有判定中的条件所构成的集合.对 P 中的每个判定 pP,Cp是判定 p 中所有条件构成的集合,即 Cp=c|cC且 c 出现在 p 中.所以,C=pp PC12.此外,TS表示测试用例集,用t,t1,t2,表示测试用例.本文把测试用例简化为判定中每个条件的真值取值组合.下面给出测试用例的形式化定义.定义 1(测试用例,test case).一个测试用例是一个三元组t=(Pre,In,Out),它是可导致程序一次执行的输入集,其中,Pre表示输入的前置条件,In表示输入值,Out表示期望输出.一个测试用例集是否检测了某些判定和条件的真值决定了该测试用例集的充分性.利用逻辑覆盖测试准则推导具体测试数据过程的关键是找出满足测试准则的条件真值取值的组合.对于一个测试用例,若其输入的前置条件Pre永真,则它的输入值In总会被“执行”.在下面的讨论中,若不作特别说明,默认前置条件Pre为永真并忽略前置条件.另外,若不致引起混淆,也不给出测试用例的期望输出Out.这样一个测试用例只用其输入值In来表示.因此,我们将每个条件真值取值的组合看成一个测试用例.例如,在判定AB中,A=trueB=true 就是一个测试用例.对应于实际的规格说明,若用A表示“用户的 id 号是否正确”,B表示“用户的口令是否正确”,则该测试用例表示用户的 id 号和口令都输入正确,即用户是合法时的情况.定义 2(判定覆盖,decision coverage,简称 DC).一组条件的真值组合构成的集合TS满足判定覆盖准则,当且仅当对每个判定pP,TS至少包含两个关于p中条件的真值组合,其中一个使得p为 true,另一个使得p为false.当被测判定是永真(或永假)时,条件的取值任意,因而实际上不存在测试用例的选择问题.如果在这种退化了的判定情况下仍然有效,则认为满足判定覆盖,虽然条件的真值组合不能使该判定的取值为 false(或 true).判定覆盖不能决定其中某个条件的取值.为了揭露判定中一个条件的错误,判定中的其他条件必须满足一定的 约束.定义 3(条件覆盖,condition coverage,简称 CC).一组条件的真值组合构成的集合TS满足条件覆盖准则,当且仅当对每个判定pP,Cp中的条件cCp,TS至少包含两个关于p中条件的真值组合,其中一个使得c为true,另一个使得c为 false.条件覆盖并不一定包含(subsume)(关于测试准则之间的“包含”关系这一概念将在本文的第 5 节给出)判定覆盖,判定覆盖也不一定包含条件覆盖.它们都是很弱的测试准则,对于安全性软件的测试根本不够.即使所有的判定和条件的真值取值都已检查过,也无法保证所有可能的条件真值的组合都能够被检查.为了检查判定中所有条件的真值组合,于是出现了组合覆盖准则.定义 4(组合覆盖,combinational coverage,简称 CoC).一组条件的真值组合构成的集合TS满足组合覆盖准则,当且仅当对每个判定pP,TS包含Cp中所有可能的条件真值的组合.假设被测判定中不同条件的个数为n,则组合覆盖测试用例集中的测试用例共有 2n个.显然,组合覆盖准则包含判定覆盖准则和条件覆盖准则.2 决定性逻辑覆盖测试准则 组合覆盖测试准则过于严格,它只能用在条件个数不多的情况下.为了克服组合覆盖准则的缺陷,可以从条 钱忠胜 等:基于规格说明的若干逻辑覆盖测试准则 1539 件的真值对判定真值的作用出发来构造有效的测试准则.术语“决定”用来表达条件的真值和判定真值之间的关系.定义 5(决定,determination).对于判定p中的一个条件ci,如果p中其余的条件cjp,ji的真值使得改变ci的真值会引起p的真值发生变化,那么称ci决定判定p,其中,ci为主要条件(major condition),cj为次要条件(minor condition).利用条件和判定之间的决定关系(我们称为逻辑覆盖的决定性),可以定义如下活动条件覆盖准则:定义6(活动条件覆盖,active condition coverage,简称ACC).一组条件的真值组合构成的集合TS满足活动条件覆盖准则,当且仅当对每个判定pP和每个主要条件ciCp,TS中至少含有两个Cp中条件真值组合,使得ci一次为 true,一次为 false.活动条件覆盖意味着判定值的改变随着某一条件值的改变而改变.该准则要求测试各种条件值的组合(但不是所有的,这与组合覆盖不同),测试用例的个数仍然可以保持线性增长.对于具有n个相互独立条件的判定,测试用例集中最多包含(n+1)个不同的测试用例就可以满足活动条件覆盖准则1.在应用该准则时存在一些问题,即在选取满足活动条件覆盖准则的测试用例集,当主要条件的值为true 和 false 时,次要条件是否应该取相同的值?对于这一问题的不同回答产生了 3 个不同的逻辑覆盖测试准则(定义 7定义 9).定义 7(一般活动条件覆盖,general active condition coverage,简称 GACC).一组条件的真值组合构成的集合TS满足一般活动条件覆盖准则,当且仅当对每个判定pP和每个主要条件ciCp,TS中至少含有两个Cp中条件的真值组合,使得ci一次为 true,一次为 false,并且对这两个条件真值组合中次要条件的真值取值不作要求.由于一般活动条件覆盖准则并不一定包含判定覆盖准则,所以给出下面相关活动条件覆盖的概念.定义 8(相关活动条件覆盖,correlated active condition coverage,简称 CACC).由一组条件的真值组合构成的集合TS满足相关活动条件覆盖准则,当且仅当对每个判定pP和每个主要条件ciCp,TS中至少含有两个Cp中条件的真值组合,使得ci一次为 true,一次为 false,并且这两个条件真值组合必须分别使得p取不同的真值.定义 9(受限活动条件覆盖,restricted active condition coverage,简称 RACC).由一组条件的真值组合构成的集合TS满足受限活动条件覆盖准则,当且仅当对每个判定pP和每个主要条件ciCp,TS中至少含有两个Cp中条件的真值组合,使得ci一次为 true,一次为 false,并且这两个条件真值组合中次要条件必须取相同的值.受限活动条件覆盖等同于 MC/DC(修正的条件/判定覆盖)2,7,当主要条件的取值发生变化时,都规定次要条件应该取相同的值.对于一些实际问题,定义 9 并不是很精确.比如,如何处理当改变主要条件的值而无法保持次要条件的值不变的情况.假定该主要条件不满足,则受限活动条件覆盖可能不是处理该问题的最好方法.但无论如何,在测试中必须检查这样的条件.根据定义 7定义 9,显然,满足受限活动条件覆盖准则的测试用例集一定满足相关活动条件覆盖准则,而满足相关活动条件覆盖准则的测试用例集一定满足一般活动条件覆盖准则.在活动条件覆盖的相关定义(定义 6定义 9)中,当次要条件取一定的真值时,主要条件都是“活动的”,即判定的真值改变随主要条件真值的不同而改变.但在很多情况下,希望一个条件真值的改变对判定的真值没有影响,即,改变某个条件的真值时保持判定的真值不变.现在来看下面的两个例子,它们都摘自于文献3,但为方便描述,有些地方作了相应的改动与补充.例 1:铁路交叉点.在铁路计算机控制系统中,通过交叉点的交换开关可以控制火车从一个方向驶向另一个方向.假设有两个轨道,一个是主要的,一个是预留的,条件决定轨道的状态(是否被占用),判定决定火车路线的改变(从主要轨道驶向预留轨道或者相反).现在考虑两种故障类型:一个是无操作,即该发生的未发生;一个是误激励,即不该发生的却发生了.第 1 种情况是当主要轨道被占用时(条件改变),需要转换到预留轨道(判定改变).若此时判定的值保持不变,则意味着系统无操作,可能导致其崩溃.第 2 种情况是当预留轨道被占用时(条件改变),需要保持主要轨道的路线(判定保持).若此时判定的值发生了变化,则意味着系统发生误激励,同样可能导致系统崩溃.1540 Journal of Software 软件学报 Vol.21,No.7,July 2010 例 2:核反应堆防护系统.考虑一个判定和一个条件,判定用于触发一个核电厂的核反应堆防护系统(如反应堆的关闭),条件用于描述触发的某个标准(如对于某个规定的级别,压力过大).需要测试当条件改变时,判定也要改变的情况,因为此时出现故障,表明系统在紧急条件下无操作,会导致核反应堆事故.然而保持判定的值也是非常重要的,此时的故障意味着在正常操作期间系统的误激励,这可能会导致非强制性的反应堆关闭、物理设备的损坏以及电流供应不足.核反应堆防护系统典型的体系结构考虑了这种特殊情况,即“3选 2”逻辑投票制.使用3个等价的信道降低了系统不正确操作的概率.然而,如果仅仅是需要考虑这个因素,用“3选1”逻辑更可靠.用“3 选 2”逻辑的目的是对系统的误激励提供保护,因为在这种情况下,来自一个信道的错误信号不会触发系统的行为.这些例子表明,仅测试条件取值的变化引起判定值的变化是不够的,从安全性的角度考虑更是如此.因此,在基于规格说明的测试中,除了测试条件取值变化对判定的值“改变”的情况,还有必要测试条件取值变化对判定的值“不改变”的情况.3 掩盖性逻辑覆盖测试准则 当使用逻辑联结词和时,一般都要计算判定中的条件的真值.某些编程语言也提供“短路(short circuit)”的控制形式.一旦结果的值被确定,短路控制逻辑就不需要计算判定中其他条件的值.在 Ada 语言中,and then 和or else 是两个短路控制形式,除了总是先计算左边的条件之外,它们分别产生与逻辑联结词和相同的结果,右边的条件只有当其会对整个判定的结果产生变化时才会进行计算.C,C+中的算子&和|分别与 Ada 语言中的 and then 和 or else 表达的意思相同.一旦(或)条件的取值为 false(或 true),判定的结果将保持 false(或 true),不需要进行进一步的计算,也不会再改变最终结果.3.1 相关定义 条件真值取值的变化若不改变判定的真值取值,则说明该条件的真值取值对判定的作用被其他某些条件的真值取值“掩盖”了.例如,对于判定XY,当条件X=true 时,条件Y被条件X所掩盖,因为无论条件Y的真值取值如何,判定XY的取值始终为 true.相反地,当条件Y=true 时,条件X被条件Y所掩盖.掩盖是指对条件的特殊的输入会隐蔽其他条件输入的作用.条件的掩盖性引起错误的测试可用于测试短路控制逻辑.定义 10(掩盖,mask).对于判定p中的一个条件ci,如果p中其他的某个条件cjp,ji的真值,使得改变ci的真值不会引起p的真值发生变化,那么称cj掩盖ci(或称ci被cj所掩盖).其中,ci为显式条件,cj为隐式条件.利用条件之间的掩盖关系(我们称其为逻辑覆盖的掩盖性),可以定义如下掩盖条件覆盖准则.定义 11(掩盖条件覆盖,mask condition coverage,简称 MCC).由一组条件的真值组合构成的集合TS满足掩盖条件覆盖准则,当且仅当对每个判定pP和每个显式条件ciCp,TS中至少含有两个Cp中的条件真值组合,使得ci一次为 true,一次为 false.例如,对于判定XY,测试用例集TSX=trueY=true,X=falseY=true,X=trueY=false需要 3 个测试用例满足掩盖条件覆盖准则.其中,X=trueY=true 和X=falseY=true 分别使得X=true 和X=false,而X=trueY=true 和X=trueY=false 分别使得Y=true 和Y=false.并且该测试用例集使得判定XY的值始终保持 true,而无论显式条件的取值如何变化.但无论如何,条件X或Y的取值都不能使判定XY的值始终保持 false.对于判定XZYZ,通过分析可知,条件X或Y的取值可使判定XZYZ的值始终保持 true 或者 false,而条件Z的取值只能使该判定的值始终保持 false,不能保持 true.一般地,对于一个特定的判定,不是它的所有的显式条件都能使其值同时保持 true 和 false.因此在下面的讨论中,我们不再分别分析显式条件让判定保持 true 和false 这两种情况,而只要保持其中的一种取值就可以了.掩盖条件覆盖准则和活动条件覆盖准则都用于考察一个条件真值的变化是否会引起判定取值的变化.在应用掩盖条件覆盖准则时,与活动条件覆盖准则一样,也存在同样的问题,即在选取满足掩盖条件覆盖准则的测试用例集,当显式条件的值为true和false时,隐式条件是否应该取相同的值?对于这一问题的不同回答产生了两个不同的逻辑覆盖测试准则(定义 12 和定义 13).钱忠胜 等:基于规格说明的若干逻辑覆盖测试准则 1541 定义 12(一般掩盖条件覆盖,general mask condition coverage,简称 GMCC).由一组条件的真值组合构成的集合TS满足一般掩盖条件覆盖准则,当且仅当对每个判定pP和每个显式条件ciCp,TS中至少含有两个Cp中的条件的真值组合,使得ci一次为 true,一次为 false,并且对这两个条件真值组合中隐式条件的真值取值不作要求.定义 13(受限掩盖条件覆盖,restricted mask condition coverage,简称 RMCC).由一组条件的真值组合构成的集合TS满足受限掩盖条件覆盖准则,当且仅当对每个判定pP和每个显式条件ciCp,TS中至少含有两个Cp中的条件的真值组合,使得ci一次为 true,一次为 false,并且这两个条件真值组合中隐式条件必须取相同的 真值.注意,根据定义 10,由于显式条件真值的改变不会引起判定的真值发生变化,即显式条件和判定之间不存在决定关系,因此没有“相关掩盖条件覆盖”的概念.3.2 测试生成算法 对于一个判定pP,在生成满足受限掩盖条件覆盖准则的条件真值组合时,如何确定隐式条件的取值呢?令XCp为判定p的显式条件,当分别给定X=true 和X=false 时,判定p的值应该相同(即要么都为 true,要么都为false),因为显式条件X的取值被其他隐式条件的取值所掩盖.若将这两次得到的p值进行(异或)操作,得到的结果必为假.当用p(X)表示显式条件X取值为真时,判定p的值;当p(X)表示显式条件X取值为假时,判定p的值;X(p)表示p(X)和p(X)的异或,即X(p)p(X)p(X).这样,通过计算X(p)并使其取值为假,就可以确定隐式条件的取值.我们把这种方法称为“掩盖异或求值法”.例如,设pXY,(1)当X为显式条件时,X(p)p(X)p(X)(trueY)(falseY)Yfalse Y.要使得X(p)为假,隐式条件Y的取值必须为假.也就是说,在该判定p中,当X为显式条件时,隐式条件Y应取假,即有两组真值组合:(X=true,Y=false),(X=false,Y=false)测试显式条件X.(2)当Y为显式条件时,Y(p)p(Y)p(Y)(Xtrue)(Xfalse)Xfalse X.要使得Y(p)为假,隐式条件X的取值必须为假.也就是说,在该判定p中,当Y为显式条件时,隐式条件X应取假,即有两组真值组合:(X=false,Y=true),(X=false,Y=false)测试显式条件Y.由定义 12 和定义 13 可知,满足受限掩盖条件覆盖准则的测试用例集一定满足一般掩盖条件覆盖准则.下面给出掩盖性逻辑覆盖测试准则的一个可行的测试生成算法,见算法 1.算法 1.掩盖性逻辑覆盖测试准则的测试生成.输入:判定;输出:满足掩盖条件覆盖准则的一个抽象测试用例集.begin=;/初始化抽象测试用例集为空 while(中还有条件未充当过显式条件)explicitselectExplicitCondition();/在中选定一个未充当过显式条件的条件作为 显式条件 1542 Journal of Software 软件学报 Vol.21,No.7,July 2010 computeValuesOfImplicitConditions();/用“掩盖异或求值法”计算隐式条件的值 setTrue(explicit);/显式条件的取值为真 tccombineConditions();/将条件的取值组合构成一个抽象测试用例 if(tc不在中)/去掉相同的条件组合=tc;endif;setFalse(explicit);/显式条件的取值为假 tccombineConditions();/将条件的取值组合构成一个抽象测试用例 if(tc不在中)/去掉相同的条件组合=tc;endif;endwhile;/中的条件都充当过显式条件 output;/输出抽象测试用例集 end.3.3 实例分析 考察判定K1XY,其真值表见表 1.从表中可以看出,测试用例(false,false)应该剔除,因为它使得判定 的值为 false,而又没有第 2 个测试用例使得判定的值也为 false.现考察将条件X作为显式条件的情况,若保证Y的取值不变,则测试用例(true,true)和(false,true)使得条件X的取值一次为真,一次为假,但不改变判定的值,满足X的被掩盖性.同理,保证X的取值不变,得到显式条件Y的测试用例(true,true)和(true,false),因此测试用例集(true,true),(true,false),(false,true)满足掩盖条件覆盖准则.Table 1 Truth table of XY 表 1 XY的真值表 X Y Result True True True True False True False True True False False False 利用配对表(pairs table)2可以更清晰、准确地表达测试用例之间的成对关系.表 1 的真值表可以扩展为表2 所示的配对表形式.在表 2 中,第 1 列是测试用例名,标签为(X,Y)的列表示条件X和Y的真值组合,标签为X(或Y)的列表示条件X(或Y)的被掩盖性.例如,测试用例t1:(true,true)(或者测试用例t2:(true,false)可以和测试用例t3:(false,true)配对使用考察条件X的被掩盖性.测试用例t1:(true,true)(或者测试用例t3:(false,true)可以和测试用例t2:(true,false)配对使用考察条件Y的被掩盖性.测试用例t4:(false,false)对考察条件X和Y的被掩盖性都不起作用.Table 2 Pairs table of XY 表 2 XY的配对表 Test case(X,Y)Expected output X Y t1(true,true)True t3 t2 t2(true,false)True t3 t1,t3 t3(false,true)True t1,t2 t2 t4(false,false)False 使用配对表设计测试用例集需要为每个条件选择成对的测试用例,选择的成对测试用例有些是重叠的.如在表 2 中,当条件X选择测试用例t1和t3,而条件Y选择测试用例t1和t2时,则t1就重叠了.当配对表的某一行在所有条件对应的列都不为空时,该行就定义了一个满足掩盖条件覆盖准则的测试用例集.例如,对应于t1行,它在 钱忠胜 等:基于规格说明的若干逻辑覆盖测试准则 1543 所有条件对应的列都不为空,得到测试用例集t1,t2,t3,该测试用例集就满足定义在判定XY上的掩盖条件覆盖准则.注意,对应于t2(或t3)行,可以得到两个测试用例集t1,t2,t3和t2,t3,它们都满足掩盖条件覆盖准则,但t1,t2,t3还满足受限掩盖条件覆盖准则,而t2,t3不满足.现考察稍微复杂的有 3 个条件的判定K2XYZ,其配对表见表 3.在表 3 中,t1,t2,t3可分别和t5或t7配对,t4 可分别和t6或t8配对来考察条件X的被掩盖性.即,要测试X,测试用例集t1,t5,t1,t7,t2,t5,t2,t7,t3,t5,t3,t7,t4,t6,t4,t8都满足要求.同理,要测试Y,测试用例集t1,t3,t1,t7,t2,t3,t2,t7,t3,t5,t4,t6,t5,t7,t6,t8都满足要求.而要测试Z,测试用例集t1,t2,t2,t3,t2,t5,t2,t7都满足要求.注意到,测试用例集t2,t7同时满足测试X,Y和Z这 3 个条件的被掩盖性,它是满足此特性的最小测试用例集.但t2,t7只满足一般掩盖条件覆盖准则,不满足受限掩盖条件覆盖准则.Table 3 Pairs table of XYZ 表 3 XYZ的配对表 Test case(X,Y,Z)Expected output X Y Z t1(true,true,true)True t5,t7 t3,t7 t2 t2(true,true,false)True t5,t7 t3,t7 t1,t3,t5,t7 t3(true,false,true)True t5,t7 t1,t2,t5 t2 t4(true,false,false)False t6,t8 t6 t5(false,true,true)True t1,t2,t3 t3,t7 t2 t6(false,true,false)False t4 t4,t8 t7(false,false,true)True t1,t2,t3 t1,t2,t5 t2 t8(false,false,false)False t4 t6 在表 3 中,对于条件X的所有测试用例集,t1,t5,t3,t7,t4,t8对应的(Y,Z)真值取值相同;对于条件Y的所有测试用例集,t1,t3,t5,t7,t6,t8对应的(X,Z)真值取值相同;对于Z的所有测试用例集,t1,t2对应的(X,Y)真值取值相同.因此,可以取测试用例集t1,t2,t3,t5,它满足受限掩盖条件覆盖,当然也满足一般掩盖条件覆盖,并且它是最精简的.这里定义“最精简测试用例集”为能满足某个给定的测试准则而又无多余测试用例的测试集,即它的任何真子集不满足该测试准则.注意,对于这个例子,满足受限掩盖条件覆盖的最精简测试用例集不只 1 个,还有t1,t2,t3,t7和t1,t2,t5,t7.另外,假设TS1和TS2都是满足某个测试准则的最精简测试用例集,但TS1和TS2中测试用例的个数不一定相等.3.4 掩盖条件覆盖准则的特点 配对表具有一定的局限性:(1)配对表在表达条件较多的判定时是难以处理的,且对于具有n个不同条件的判定一般仅需要(n+1)个测试用例,而表中却有 2n行;(2)一张配对表一次只能用于表达一个判定;(3)配对表没有将基于规格说明的测试用例的输入和输出与源代码的结构联系起来.然而,配对表对于表达条件的掩盖性是一种简便而有效的方法.通过分析,掩盖条件覆盖准则具有下列特点:测试用例个数的线性增长.当判定中条件个数增加时,满足掩盖条件覆盖准则所需的测试用例个数呈线性增长.对每个条件来说,掩盖条件覆盖准则最多需要4个测试用例,两个使判定保持true,两个使判定保持 false,但这样选择测试用例过于严格.我们只需考虑一种情况,即,使判定或者保持 true,或者保持false.因此,对于有n个相互独立条件的判定,最多需要 2n个测试用例就可以满足掩盖