一种基于组合测试的软件故障调试方法的相关分析研究

2016-01-06 07:08王瑞凤,宋玲玲
烟台职业学院学报 2015年2期
关键词:软件测试

一种基于组合测试的软件故障调试方法的相关分析研究

王瑞凤,宋玲玲

(烟台职业学院,山东 烟台 264670)

摘要:对于软件的功能测试来说,它是一个构建高可信软件的关键环节。组合测试作为一种重要的软件测试方法,往往能以简单高效的测试用例来对测试系统进行有效完整的测试,可以达到事半功倍的效果。基于组合测试的原理与算法对软件的故障调试进行一系列技术方面的分析,找到故障的原因所在并证明组合测试方法的有效性。

关键词:软件测试;组合测试;故障调试

收稿日期:2015-03-19

作者简介:王瑞凤(1968-),女,山东招远人,烟台职业学院讲师.

中图分类号:TP311.5文献标识码:A

软件的制成都要经历软件测试这个过程,它能够保障软件的质量。软件测试是一项复杂的计算过程,在软件测试的研究中要面临例如建模分析、准则设定、测试用例生成、变异测试和回归测试等诸多挑战。关于测试用例生成,我们常常会用到组合测试这种技术手段,它是近年来被世界各地软件应用领域关注热议的一项话题技术。

1组合测试

1.1 组合测试的概念

组合测试作为一种软件测试方法,它的主要特点就是在保证错误检出率的前提下用极少的测试用例就能够测试系统。在软件测试过程中,当建模分析完毕后,测试人员就可以获得一些由因素和因素取值联合构成的测试用例实例,组合测试可以通过极少数的因素间取值组合构造出一个组合测试用例集,然后自动分配最优组合测试用例,通过测试用例集来测试软件。

1.2 覆盖数组

目前,关于传统的组合测试方法研究,其中大部分都是基于覆盖数组的,只有一小部分针对特殊的软件测试。

覆盖数组简称CA,它是一个值域为v的n×t矩阵,n×t上则包含了v值域上所有大小为t的排列,形成一个矩形阵列。t即是矩阵的强度,而v是序,在一个覆盖数组里,如果行数最小,就是最优的排列,这个最小的行数就被称为是覆盖数(covering array number),被记作CAN。在覆盖数组中,强度如果是t,就称为t覆盖数组(t-covering array),如果有t=2的特别情况,那么就称为成对覆盖数组(pairwise covering array)。在覆盖数组中,它所要求的矩阵的每一列的值域都有着相同的大小。

一般在真实的程序中,不是每个覆盖数组都能满足每一个参数具有相同值域这个要求,所以就会出现混合覆盖数组。混合覆盖数组简称MCA,它由v个符号组成一个n×t的矩形阵。在此矩形阵里,v=Ek(i=1)xVi。其中第i列的所有符号都是一个大小为vi的集合Si的元素,并且任意的n×t子矩阵都包含了相应值域的t元组。所以,在混合覆盖数组中我们就可以合理的定义它的强度t和覆盖数MCAN了[1]3。

在这些矩形阵的构造过程中,可以发现某些数学构造方式只能用于CA。而利用其它构造法尤其是利用计算机自动化搜索的时候,就能得知CA会以MCA的一个特殊范例出现,并且在处理时MCA和CA并没有任何区别,所以覆盖数组中应该包含了CA和MCA。

1.3 非经典组合测试

在覆盖数组组合测试中,所有数量为t的任意个参数组合都应该被覆盖,但是这样的做法并没有考虑到具体参数的特殊性质。所以近年来世界上一些学者对组合测试的方法进行了一些修改和延展,例如对测试用例集合中的每个参数取值组合都加入一些限制,这就是非经典组合测试法。这种测试法可以进一步的减少测试用例数目,让组合测试的过程更为简易。

因为在测试的时候某些取值组合必须被测试,所以一般把这种必须经历测试的取值组合称为种子。这种测试一般用贪心算法来完成并能够很好的支持参数中所有的限制。例如我们举例说明一段约束,如(a,b,c,d)=(2,4,8,3),表示例如这样的组合形式会在测试用例集合中至少出现1次。

一般情况下在简单的计算器中非十进制运算中并不支持浮点数运算,所以十六进制和浮点数的组合应该禁止出现在组合测试中,因为它们是一组无效组合。在非经典组合测试中规定没有意义的无效组合不应该出现在参数组合中。这种情况就说明了参数之间的冲突。在微软的免费测试工具PICT(pairwise independent combinatorial testing)就支持这种较为复杂的约束。

在另外一种组合测试方法中,它允许不同参数之间的覆盖强度也不同,这就是变强度组合测试。变强度组合测试的目的就是将覆盖数组扩展。如果VCA表示为一个强度为2的混合覆盖数组,它的其中如果包含3个子数组,每个数组又包含了3个值域大小为3的参数的话,那么它的每个子数组内部就都应该满足所有参数组合满足3的覆盖这个条件,这种特殊的测试方法适用于在系统的重点测试中某些关键参数的测试。

一般的测试程序中虽然有多个输入,但是输出很少,经常以单个输出为具体形态。但是某些被测程序中可能具有多个输出,这会复杂化测试用例集的生成。因为如果每个输出都是由几个参数影响,那么测试集合就需要覆盖影响任意一个输出的所有输入参数的取值组合。在这种情况下,如果能利用变强度组合的方式就可以解决多输出带来的问题。比如在一个铁路信号系统中,如果火车到来前一个信号灯的状态取决于之前3个区间的状态的话,那么就可以采用强度为3的相邻因素组合测试方法来测试系统,这是一种比较自然的自动测试生成方法,它可以在多种时间区间内产生最优的测试用例集合[1]5。

1.4 贪心算法

贪心算法可以将空矩阵逐行逐列扩展,扩展到所有强度t组合全部被覆盖的地步。它包含了一维扩展和二维扩展两种方式,它还可以结合其他的测试算法并应用于测试中。一维测试即为(one test at a time)方法。它在构造覆盖数组时会给数组依次增加一行,这多覆盖的一行恰好覆盖了某些未覆盖的t元组,然后以此类推直到所有的t元组全部被覆盖。覆盖的t元组越多,就代表这种策略程度越直接。一般大部分的贪心策略都是从一个较小的测试用例集合中选择下一个测试用例而得来的。

它的具体方法是首先要随机选择50个左右的候选测试用例。通过计算机随机指定一个矩形列阵的次序,再在这个次序依次赋予每个参数数值,这些参数赋值要保证新的参数赋值和用例中的已有参数赋值要能够覆盖最多的t元组。赋值之后从这些测试用例中选择覆盖了最多的未覆盖t元组作为数组的下一行。而在类似于成对测试这种特殊问题的计算中,根据组合测试的性质,应该保持新加入用例与测试集中已有元素的重叠数量不能超过2。比如在两个数列中,(1,3,4)和(1,3,5)这两个数列中第一个和第二个参数的取值相同,所以它的重叠数就是2。这种计算方法可以为一部分测试用例提供最优的计算结果。

对于二维扩展(in parameter order)来说,它的计算主要就是针对成对测试。基本原则就是首先构造前两个参数的所有组合并形成一个小规模的矩阵,然后重复二维扩展。首先是水平扩展,水平扩展就是在矩形列阵中增加一列参数,然后为列上的每一个参数都赋值,目的就是尽可能覆盖最多的t元组;其次是垂直扩展,它建立于水平扩展的基础上,如果有些t元组没有被覆盖,那么新的测试用例就会生成。

ABA1B1A1B2A2B1A2B2ABCA1B1C1A1B2C2A2B1C3A2B2C1HorizontalgrowthABCA1B1C1A1B2C2A2B1C3A2B2C1A2B1C2A1B2C3Verticalgrowth

图1二维扩展算法的水平扩展和垂直扩展

图1就是一个二维扩展的算法实例。如果有A和B两个参数,以下是它们的所有4组取值组合。经过水平扩展到第3列,这一列的取值为C1、C2、C3,其中C1能够覆盖2个元组。在计算中就可以发现(A1,-,C3)、(-,B1,C2)这些元组没有被覆盖,所以通过二维扩展算法的垂直扩展就可以将这些2元组全部合并得到图1这样的结果。

2组合测试的故障诊断算法应用

在利用组合测试用例对系统进行测试时,目的主要是检测排查系统中的故障。如果没有故障就不需要进行诊断。当某一个测试用例集合中的测试用例在运行时发生了故障,那么就应该按照:分析用例集合中用例本身——生成附加的测试用例帮助故障诊断——观察附加测试用例的运行情况并根据它重新进行分析验证这三个步骤进行故障的计算和检验。根据组合测试故障的诊断算法,应该在故障诊断和计算时注意以下几点[2]。

①组合测试一般会把故障总结为测试用例中某些取值模式所引发的,所以系统的故障有可能是在组合测试中被测试组合的某些取值模式引起的。

②一般导致系统故障原因集合的因素就是在组合测试用例集合中所有共同含有的模式所导致的。这时注意分析集合中的元素可以进一步的确认故障的原因并遏制更多故障的发生。

③可以通过生成附加测试用例的方式来辅助故障的诊断。这种方法通过发现故障的测试用例,由它生成相应的多个(设置为n个)附加测试用例,这样一个测试用例集合就会生成nl个附加测试用例,这时候对系统重新进行测试,根据附加测试用例的运行情况就可以重新分析和验证系统的故障原因。

3实际应用分析

如果要测试一台交换机的通信功能,通过交换机的呼叫模式、资费方式、接入方式和通信状态作为4个参数进行测试。在这4个参数中,每一个参数都应该具有3种不同的状态。按照组合测试的原则,如果要测试每一个参数的所有情况,就需要3的四次方也就是81个测试来完成。对于1个参数利用81次测试显然是不切实际的,所以通过组合测试的方法,随机组成一个测试用例合集,就可以实现对两个参数之间所有变量组合的完全覆盖,并且能够保证每个例子中组合出现的频率保持相同和统一,这些频率且只出现1次[3]。

CallTypeBillingAccessStatusLocalCollectPbxLbusyLongDistanceFreecallLoopBusyInternationalCallerlsdnBusyLocalFreecallIsdnBlockedLongDistanceCallerPbxBlockedInternationalCollectLoopBlockedLocalCallerLoopSuccessLongDistanecCollectIsdnSuccessInternationalFreecallPbxSuecess

图2组合测试的用例表

这种测试兼顾了一般性,所以是一种很全面的测试方法。对上述交换机进行的测试只会用到一个测试用例在系统中运行时发生故障的情况。用图2这组测试用例再对交换机进行测试,根据测试的结果基本可以确定出现故障可能的原因。

由于这几个测试用例从未发生过故障,因此此时它们的模式都是极小元,即Mt=(International,Collect,Loop,Blocked),(Long distance,Free call,Loop,Busy),所以它们就是导致故障发生的原因。另外,如果某一个测试用例或者某几个测试用例发生了原来发生的故障,也可以发现用例之间的极小元,从而排查出导致故障发生的原因。所以在组合测试中,如果辅之以必要的相关测试用例,就可以对导致系统故障的因素进行有效的定位和相关的解决措施。从组合测试我们可以看出,如果某个系统出现错误的测试用例数量少,那就说明这是一个高质量的测试用例集合,也反映了软件系统的优秀品质。所以对于软件质量测试来说,基于组合测试的高质量测试用例对系统的故障原因进行合理的分析是软件系统创建中相当重要和必要的一个环节。

4总结

组合测试是一个重要的实验方法,它不仅仅应用于软件测试行业,在各大领域都有广泛的应用。因为它可以通过最少的测试发现影响系统正常运行的最多不利因素,以以点带面的效率影响着软件行业的发展,是一个高能的软件技术,在软件测试领域具有相当的代表性。作为一种基于数理化和统计学的科学实验方法,组合测试应该在更多科技领域得到更广泛的重视、应用和发展。

参考文献:

[1]严俊,张健.组合测试:原理与方法[J].软件学报,2009,20(6).

[2]陈翔.组合测试技术及应用研究[D].南京:南京大学,2011.

[3]徐宝文,聂长海,史亮,等.一种基于组合测试的软件故障调试方法[J].计算机学报,2006,29(1).

Relevant Analysis and Research on Software Failure Debugging

Method Based on Combinatorial Test

WANG Rui-feng, SONG Ling-ling

(YantaiVocationalCollege,Yantai264670,China)

Abstract:It is a key link for the functional test of software to construct highly reliable software. As an important method to test the software, the combinatorial test can test the test system effectively and integrally with simple and efficient test cases to attain the result with half effort. We have carried out a series of technical analyses based on the theory and algorithm of the combinatorial test and found the cause of the failure and certified the effectiveness of the combinatorial test.

Key words:software test; combinatorial test; failure debugging

(责任编辑侯中岩)

猜你喜欢
软件测试
软件测试方向人才培养“1+X”融合研究
基于OBE的软件测试课程教学改革探索
航天软件测试模型构建与应用
CTCS2-200C列控车载设备软件测试方法研究
EXCEL和VBA实现软件测试记录管理
基于社交网络的软件测试课程教学实践
交通运输行业信息系统软件测试体系框架研究
浅析云计算环境下的软件测试服务研究
计算机软件测试技术研究现状综述
关于 Web 应用系统的软件测试的研究