一种两两覆盖组合软件测试用例集生成方法
技术领域
本发明属于软件测试技术领域,具体涉及到组合软件测试中测试用例集的生成问题,提供一种两两覆盖组合软件测试用例集生成方法,主要解决在软件测试中如何根据实际需要,用尽可能少的测试用例来尽可能多地覆盖软件系统中的各因素及相应两两覆盖组合,系统地检测它们之间的相互作用对系统所产生的影响,从而在保证测试用例集错误检测能力的基础上尽可能地减少测试用例数量,提高软件测试效率,减低测试成本。
背景技术
软件测试作为保证软件质量和可靠性的重要手段,贯穿于软件生命周期的整个过程,在整个软件生命周期中占有重要的地位,大约占整个开发成本的60%以上。特别对于航空航天,军事国防等性命攸关的系统,其测试费用甚至高达其工程开发阶段费用总和的3到5倍。针对一个具体的待测软件系统,我们一方面要考虑采用什么样的测试方法对其进行系统科学的测试,另一方面要考虑如何产生数量少而质量高的测试用例集,既达到对系统的充分测试,又能够提高测试的效率,降低测试的成本。
软件作为一个复杂的逻辑系统,它的正常运行可能受到多因素的影响,这些因素可能是系统的配置、内部事件、外部输入等。除单个因素之外,上述因素之间的相互作用也可能会对软件的正常运行产生影响。因此,在测试时不仅要考虑所有对软件产生影响的可能因素,而且对存在于这些因素之间的相互作用,即因素之间的组合也要进行充分的测试。研究发现,大约70%的软件故障是由一个或两个参数的相互作用而引发,为了使用尽可能少的测试用例来有效检测这些因素之间的相互作用对系统产生的影响,人们提出了组合软件测试方法,组合软件测试方法是一种设计测试用例集的方法,它依据一定的组合覆盖准则产生测试用例。根据覆盖程度的不同,可以分为单因素覆盖、两两组合覆盖等。这种方法力求用尽可能少的测试用例,覆盖尽可能多的影响因素,有效的检测软件系统中各个因素以及它们之间的相互作用对系统产生的影响。当前组合测试研究的核心问题是组合测试用例集生成问题,即如何针对具体待测软件,在满足给定组合覆盖要求的前提下,生成规模尽可能小的测试用例集,以便在保证错误检测能力的前提下尽可能的降低测试成本。
大量实践表明,组合软件测试在软件测试实践中具有很好的效果,因此,很有必要对软件进行组合软件测试,寻找高效地自动组合测试用例集的生成方法,对实现软件测试过程自动化、高效化和智能化,有着十分重要的现实意义。
在软件测试中,测试人员根据待测软件系统SUT的需求规格说明书,确定相应的测试需求说明书,在软件测试需求说明书中可以准确的获得影响待测软件系统的各种因素和因素之间的约束限制,这些因素可以用集合F表示为F={f
1,f
2,…,f
1,…,f
n},n为影响待测系统的因素的个数,i为1到n中的任意一个值,其中因素f
i假设经过等价类划分后包含p
i个离散的值,则因素f
i可能的取值可以用集合V
i表示
其中v
i1表示因素f
i的第一个离散值,v
i2表示因素f
i的第二个离散值,
表示因素f
i的第p
i个离散值。该待测系统SUT因素的所有离散值共有P个
约束限制集合可以用C表示C={c
1,c
2,…,c
m},m为约束限制的个数待测软件系统SUT的一个测试用例test可以用n元组表示为test=(v
1,v
2,…,v
n),其中v
1∈V
1,v
2∈V
2,v
n∈V
n且满足约束限制C,待测软件系统SUT的一个测试用例集TS假设是有m个测试用例构成的,通过对测试用例集TS中的各个测试用例在待测软件系统SUT中的运行来实现对待测软件系统SUT的测试。对待测软件系统SUT因素的所有离散值按照因素从左到右的顺序进行编号,第一个因素f
1的第一个离散值v
11编号为1,第二个离散值v
12的编号为2,……,依次类推,第i个因素f
i的第一个离散值v
i1编号为因素f
1到f
i-1的离散值个数之和再加1,……,最后一个因素f
n的最后一个离散值的编号为P,这样后面我们就用编号来代表系统所有的可能离散取值。
考虑到待测软件系统SUT中任意两个因素间的相互作用,都可能对系统产生重要影响,测试用例集TS需要保证覆盖任意两个因素间所有的取值组合且满足约束限制,待测软件系统SUT中任意两个因素对可以用二元关系矩阵T=(ti,j)P×P表示,其中,P表示待测系统的因素的全部离散值个数,i,j为离散值的编号,ti,j表示第i个离散值和第j个离散值覆盖对是否要覆盖,ti,j=1表明第i个离散值和第j个离散值对需要覆盖,ti,j=0表明第i个离散值和第j个离散值对不需要覆盖,不需要覆盖的原因可以是同一因素内部的离散值对,也可以是违背了约束限制C的不同因素之间的离散值对。
由上述描述可知,两两覆盖的组合测试用例集生成问题就是根据待测软件系统SUT所有因素的离散值和约束限制情况找到覆盖二元关系矩T=(ti,j)P×P中所有两两组合对的规模最小的测试用例集。
组合测试方法始于20世纪80年代Mandl提出的两两组合覆盖的软件测试,并成功应用于Ada编译器的测试,并利用正交拉丁方来产生测试用例集;20世纪90年代末,贝尔实验室提出一种基于贪心策略的组合测试用例生成方法,并开发了AETG系统用于产生组合测试用例集。2001年Schroeder提出了利用软件附加信息对组合测试的测试用例集进行约简和优化的方法;Lei和Tai提出了一种基于参数顺序扩充的两两组合测试数据生成策略,并开发了PairTest系统用于产生两两组合的测试用例。2002年Kuhn和Reilly研究了组合测试的可用性,发现大约70%的故障是由两个以下参数的相互作用引起的。同年,Kobayashi和Tsuchiya提出了一种生成两两组合测试数据的代数方法。2003年Cohen M.B.等人将模拟退火算法应用于多重维数组合测试用例的生成,该方法综合考虑了运算效率和运算结果之间的关系,可以根据时间和效率上不同的要求来生成尽可能优的结果。2004年,Shiba和Tsuchiya等人研究了遗传算法和蚁群算法在组合测试数据自动生成中的应用。Colbourn和Cohen M.B等人提出一种两两组合测试数据生成的确定性密度方法。Schroeder等人通过实验比较了N维组合测试与相同规模随机测试的错误检测能力。2005年,Colbourn和Sherwood等人研究了两种组合覆盖表的生成方法,分别应用于具有不同参数取值的两两组合覆盖表和高维组合覆盖表的生成。2006年Microsoft的Czerwonka发布了组合测试用例生成工具PICT,该工具使用基于one-test-at-a-time策略的方法生成测试用例集;徐宝文,聂长海,史亮等人提出了两种类似的二水平二维组合测试用例集生成方法;严俊、张健等人提出了在组合测试用例生成中完备搜索算法的应用。2007年,徐宝文等人提出了一种基于in-parameter-order策略的广义变力度组合测试用例集生成方法,命名为ParaOrder,完整的解决了相邻因素组合测试用例的生成问题。2010年12月查日军等人提出组合测试数据生成的交叉熵与粒子群方法,该方法简单的使用了传统粒子群算法取得了一定的效果。
从近年来国内外对组合测试用例生成方法的研究,我们可以发现,他们采用的方法可以概括为:针对不同类型的组合测试结合一定最优化搜索方法来实现测试用例的生成,这里使用的方法主要有确定的搜索方法(即代数方法)和基于进化和模拟生物的优化方法(即启发式方法)。代数方法主要正交表方法,图覆盖的方法,由于组合测试用例生成是一个NP-C问题,该方法主要适合于小规模的问题;针对该NP-C问题使用启发式方法生成近似最优解是一种常用的方法,使用的启发式算法主要有:贪心算法、爬山算法、模拟退化算法、洪水算法,禁忌搜索等个体搜索算法和遗传算法、蚁群算法,粒子群等群体智能算法。从前人的实验结果我们可以看出群体智能算法的寻优效果要比个体算法好,但是整体寻优效果相当,原因在于他们只是简单的套用传统的遗传算法、蚁群算法,粒子群算法,没有在使用中充分的体现组合测试用例生成问题的解空间离散的特点,位置更新没有体现组合测试用例各个因素的各个离散值出现机会基本均等的特点,并且采用一次产生一个测试用例的方法,没有从测试用例集的整体情况考虑,不利于得到最小的测试用例集,而且计算量大。所以其寻优效果一般,不利于整体最优测试用例集的产生。
离散粒子群优化算法(DPSO)是Kennedy和Eberhart在1997年为解决离散空间问题提出的离散版的粒子群算法,即传统的离散粒子群算法,粒子的速度和位置公式如式(1)和式(2):
式(1)中:
为粒子i在迭代第t次的速度;w是为避免DPSO陷入局部最优而引入的惯性权重因子,c
j(j=1,2)为加速常数;
是0到1之间的随机数;
为个体i在迭代第t次当前位置;Pbest
id为第i个粒子的个体极值;Gbest
id为全局极值。式(2)中:rand为0~1的随机数,sig(v)是一个根据粒子速度控制粒子位置为1或0的函数。
该传统的离散粒子群算法沿用了基本连续粒子群优化的速度更新公式,即速度仍作用于连续空间,而位置则利用Sig函数将其离散化.目前DPSO算法被广泛用于离散空间的优化问题中。
DPSO算法通过优化可连续变化的二进制概率达到间接优化二进制变量的目的。但是,该间接优化策略根据概率而非算法本身确定二进制变量,未能充分利用基本粒子群优化算法的性能。
和连续版的粒子群算法相比,离散版的粒子群算法在编码方式,粒子位置改变方式发生了变化,但仍然缺少对连续量与离散量运算不同规律的考虑,运算量大,其性能与其它算法相比效果很一般。
由于DPSO算法实现简单,效果好,目前已在许多离散工程领域中取得了广泛的应用,近年来受到各界的广泛关注,并提出了很多改进算法。但是将DPSO算法应用于组合测试用例集生成问题还没有。
为此本发明的方法以离散粒子群算法为基础,结合组合用例生成问题对基本离散粒子群算法加以改进,减少计算量,位置更新采用以各个因素的各个离散值出现的次数为依据来产生新的位置,同时采用一次产生一个测试用例集的方法,从整体评价一个测试用例集的优劣来指导生成测试用例集,从而产生一个高效的实用的两两覆盖组合测试用例集生成方法。
发明内容
本发明解决的问题:克服现有方法不足,将改进的离散粒子群算法应用于两两覆盖组合软件测试用例生成问题中,为两两覆盖组合测试用例生成问题提供一种操作简单、计算速度快、稳定性好且生成的测试用例集整体规模小的自动测试用例集生成方法。
本发明解决方案:一种两两覆盖组合软件测试用例集生成方法,其特点在于主要包括以下步骤:
(1)在软件测试中,测试人员根据待测软件系统SUT的需求规格说明书,确定相应的测试需求说明书,在软件测试需求说明书中可以获得影响待测软件系统SUT的各种因素和因素之间的约束限制,这些因素可以用集合F表示为F={f
1,f
2,…,f
i,…,f
n},n为影响待测软件系统的因素的个数,i为1到n中的任意一个值,其中因素f
i假设经过等价类划分后包含p
i个离散的值,则因素f
i可能的取值可以用集合V
i表示
其中v
i1表示因素f
i的第一个离散值,v
i2表示因素f
i的第二个离散值,
表示因素f
i的第p
i个离散值,则该待测软件系统SUT因素的所有离散值共有P个
约束限制集合可以用C表示C={c
1,c
2,…,c
m},m为约束限制的个数,待测软件系统SUT的一个测试用例test可以用n元组表示为test=(v
1,v
2,…,v
n),其中v
1∈V
1,v
2∈V
2,v
n∈V
n且满足约束限制C;
(2)对待测软件系统SUT因素的所有离散值按照因素从左到右的顺序进行编号,第一个因素f
1的第一个离散值v
11编号为1,第二个离散值v
12的编号为2,第p
i个离散值
编号为p
i,依次类推,第i个因素f
i的第一个离散值v
i1编号为因素f
1到f
i-1的离散值个数之和加1,最后一个因素f
n的最后一个离散值的编号为P,因此第i个因素f
i的离散值的编号集合可以用集合H
i表示为
这样我们就可以用编号来代表该待测软件系统所有的可能离散取值;
(3)考虑到待测软件系统SUT中任意两个因素间的相互作用,都可能对系统产生重要影响,测试用例集TS需要保证覆盖任意两个因素间所有的取值组合且满足约束限制,待测软件系统SUT中任意两个因素覆盖对可以用二元关系矩阵T=(ti,j)P×P表示,其中P表示待测软件系统的因素的全部离散值个数,i,j为离散值的编号,ti,j表示第i个离散值和第j个离散值覆盖对是否要覆盖,ti,j=1表明第i个离散值和第j个离散值对需要覆盖,ti,j=0表明第i个离散值和第j个离散值对不需要覆盖,不需要覆盖的原因可以是同一因素内部的离散值对,也可以是违背了约束限制C的不同因素之间的离散值对;
(3)对上述待测软件系统SUT,在粒子群中每个粒子代表一个生成的测试用例集,则粒子群中第i个粒子li的编码为:
li=<(li11,li12,…,li1n),(li21,li22,…,li2n),…,(liq1,liq2,…,liqn)>,其中lijk∈{Vk中离散值的编号},q是要生成的测试用例集中的测试用例的数量,该编码的长度为q×n,(li11,li12,…,li1n)代表该测试用例集中的第1个测试用例,(li21,li22,…,li2n)代表该测试用例集中的第2个测试用例,(liq1,liq2,…,liqn)代表该测试用例集中的第q个测试用例;
(4)设定基于离散粒子群算法的参数,所述的参数包括粒子群中粒子的数量N,生成的测试用例集中测试用例的个数q,随机选取各因素可取离散值初始化每个粒子的位置,令迭代次数t=1,开始两两覆盖组合软件测试用例集生成;
(5)若粒子l
i其编码为:l
i=<(l
i11,l
i12,…,l
i1n),(l
i21,l
i22,…,l
i2n),…,(l
iq1,l
iq2,…,l
iqn)>,其对应的二元覆盖关系矩阵T=(t
i,j)
P×P,从l
i的编码中可以准确地获得该粒子所代表的测试用例集所覆盖的两两覆盖对以及其出现的次数,若覆盖对<i,j>出现w次,则将关系矩阵T中的t
i,j的值减去w,计算关系矩阵T中值为1的元素的个数
若t
i,j=1就是该粒子代表的测试用例集没有覆盖的对数,则每个粒子所代表的生成的测试用例集的适应值f(l
i)=UnCount(l
i);
(6)对每个粒子,将当前适应值和该粒子局部最优位置的适应值liBest进行比较,若其值小于liBest,则将粒子的当前位置其作为该粒子当前的局部最优位置LocBesti=li,且该粒子的当前适应值作为该粒子的局部最优适应值liBest=f(li)=UnCount(li);
(7)对每个粒子,将其局部最优适应值liBest和全局经历过的最优位置的适应值LGBest进行比较,若第i个粒子li的局部最优值liBest小于LGBest,则将其局部最优位置作为当前粒子群的全局最优位置GBest=li,该粒子的局部最优适应值作为粒子群的全局最优适应值LGBest=liBest;
(8)根据下面的方法更新每个粒子的各维的位置,粒子li当前位置为li=<(li11,li12,…,li1n),(li21,li22,…,li2n),…,(liq1,liq2,…,liqn)>,更新之后的位置为li′=<(li11′,li12′,…,li1n′),(li21′,li22′,…,li2n′),…,(liq1′,liq2′,…,liqn′)>更新的方法为:计算各个离散值出现的次数,lijk出现的次数为num(lijk)则
Rand(prob(h
k1),h
k1)表示以prob(h
k1)为概率随机取h
k1,Rand(prob(h
k2),h
k2)表示以prob(h
k2)为概率随机取h
k2,…,
表示以
为概率随机取
其中n为该粒子代表的测试用例集中包含的测试用例的个数,p
k为第k个因素的离散值的个数,num(h
kj)粒子中第h
kj个离散值出现的次数;
(9)如果当前的迭代次数t等于最大迭代次数MAX,或者当前粒子群的LGBest的UnCount达到期望的值0,则全局最优值PGBest所对应的粒子所代表的测试用例集即为两两覆盖组合软件测试用例集生成方法生成的最优测试用例集,结束循环;否则,t=t+1,返回第(5)步。
该两两覆盖组合软件测试用例集生成方法,可以应用于软件测试过程中的单元测试阶段,集成测试阶段,确认测试阶段,系统测试阶段,验收测试阶段。有益效果:
传统离散粒子群优化算法(DPSO)是Kennedy和Eberhart在1997年在粒子群算法基础上为解决离散空间问题提出的,其原理和传统的连续粒子群优化算法一样,求解离散优化问题时,首先将问题的离散可行解通过一定的离散编码方式编码成粒子,用一个粒子来代表该问题的一个离散可行解,用粒子群来代表一组可行的离散解,根据要求随机初始化一个粒子群,通过粒子群中各粒子的迭代,寻找最优,在每一次迭代中,粒子通过根据两个″极值″来更新自己的位置。第一个就是粒子本身所找到的最优解即个体极值PBest.另一个极值是整个种群目前找到的最优解即全局极值PGBest。粒子位置的好坏,由被优化的问题决定的适应值函数来评价。每一个粒子根据当前速度并利用Sig函数来决定下一步粒子到达的位置,各个粒子追随当前的个体最优和全局最优位置在离散搜索空间进行搜索,利用各个粒子的飞行的信息不断的更新“极值”位置,最终达到或接近问题的最优位置。
该传统的离散粒子群算法沿用了基本粒子群优化的速度更新公式,即速度仍作用于连续空间,而位置则利用SIG函数将连续的速度转化为位置的离散值.即通过优化可连续变化的二进制概率达到间接优化二进制变量的目的,该间接优化策略根据概率而非算法本身确定二进制变量,和连续版的粒子群算法相比,离散版的二进制粒子群算法在编码方式,粒子位置改变方式发生了变化,但仍然缺少对连续量与离散量运算不同规律的考虑,运算量大,未能充分利用基本粒子群优化算法的性能,其性能与其它算法相比效果很一般。
在离散空间的优化问题的求解中。离散粒子群算法近年来受到的广泛关注,为了提高性能,更好的解决离散问题,专家学者提出了很多改进算法,取得了一定的成绩。但是将离散粒子群算法应用于两两覆盖组合测试用例集生成问题的研究却没有见到。
两两覆盖的组合测试用例集生成问题就是根据待测软件系统SUT所有因素的离散值和约束限制情况找到覆盖二元关系矩T=(ti,j)P×P中所有两两组合对的规模最小的测试用例集,以便在保证错误检测能力的前提下尽可能的降低测试成本。
在传统的离散粒子群算法中,粒子位置的更新是利用SIG函数将连续的速度转化而来的,间接的利用传统的粒子群算法来实现解决离散问题,此方法缺少对连续量与离散量运算不同规律的考虑,运算量大,未能充分利用离散化数据的特点,在测试用例集生成问题中,粒子位置的每一维值的选择只有有限个事先确定的离散值,要产生的是不同因素间的组合。同时由于对于最后产生的最优测试用例集来说,同一因素的各个离散值出现的机会应该是均等的(个别有约束的因素的离散值有例外),所以根据目前粒子的测试用例组成情况可以重新确定下次出现的概率,现在已经出现次数多的离散值,在更新中下次出现的概率让其减小些,相反,当前粒子中出现次数少的离散值,在更新中下次出现的概率让其增大,这样粒子的更新就更加易于趋向最优值,这样可以加快测试用例集的生成的速度,所以本发明位置更新采用以各个因素的各个离散值出现的次数为依据来产生新的位置的方法,提高算法的收敛速度,同时简化了位置更新的操作。
在传统的粒子群算法中,通常采用一个粒子代表一个测试用例,通过粒子群算法迭代过程一次产生一个测试用例的方法,该方法是基于贪心的思想,每次找到当前覆盖最多覆盖对的测试用例,但是该方法缺少从整体上来考虑测试用例集中各个测试用例的整体效应,不能体现粒子群的整体寻优能力,因此不利于得到最小的测试用例集。为此本发明的方法采用一个粒子代表一个测试用例集,充分考虑测试用例集的整体效果,进行整体评价,通过粒子群算法迭代过程一次产生需要的测试用例集的方法,提高了测试用例集的生成效率,便于得到更小规模的测试用例集。
将改进的离散粒子群算法应用于两两覆盖组合软件测试用例集生成问题,并且位置更新采用以各个因素的各个离散值出现的次数为依据来随机产生新的位置,同时采用一次产生一个测试用例集的方法,从整体评价一个测试用例集的优劣来指导生成测试用例集,从而产生一个高效的实用的两两覆盖组合测试用例集生成方法。
下面典型实例实验结果证实了该方法的有效性:
两两覆盖组合软件测试用例集生成问题是NP-C问题,目前有多种启发式方法能获得该问题的近似解,达到对测试用例集的自动生成。现有的启发式方法和系统主要包括:AETG,PAIRTEST,NetWork,PSST,SA,GA,ACA,CE,PSO等,本发明的方法MDPSO和现有的两两覆盖组合软件测试用例集生成方法AETG,PAIRTEST,NetWork,PSST,SA,GA,ACA,CE,PSO实验比较结果如表1和表2所示。
表格待测软件系统问题解释:以问题53×44×31×22为例,53×44×31×22表示有3个因素的离散值取值个数为5个,有4个因素的离散值取值个数为4个,有1个因素的离散值取值个数为3个,有2个因素的离散值取值个数为2个。
从表1和表2中可以看出,本发明提供的方法生成的测试用例规模结果大部分是近优,与其它方法生成的测试用例集的规模在整体上较好,方法稳定性好。
表1 生成结果比较1
表2 生成结果比较2
通过以上分析和实例验证表明,本发明提出的两两覆盖组合软件测试用例集生成方法与已有的组合测试用例集生成方法相比,本发明提供两两覆盖组合测试用例集生成方法充分利用组合测试生成离散值的特点,生成的测试用例集规模整体较小,方法稳定性好,计算量少,是一种有效的两两覆盖组合软件测试用例集生成方法。
附图说明
附图1是本发明的流程图。
附图2某一次测试用例集生成的迭代次数和局部最优的平均适应值图。
附图3 30次实验中找到最优测试用例集的迭代次数图。
具体实施方式
以某待测软件系统的两两覆盖组合测试用例集生成为例,结合图1具体说明本发明的两两覆盖组合测试用例集生成方法的实施方式。
从某待测软件系统测试需求说明书获得影响该待测软件系统SUT的4个因素及其可能取值和因素之间的一个约束限制如下:
因素及其可能取值:
Database:DB/2,Oracle
Client:Firefox,IE,Opera,Google
WebServer:WebSphere,Apache,NET
OS:windows,linux
参数之间的约束为:
if([Client]==″IE″)then([OS]!=″linux″)
因素可以用集合F表示为F={Database,Client,WebServer,OS},影响待测软件系统的因素的个数为4,第一个因素Database含有2个离散值,V
1={DB/2,Oracle},p
1=2;第二个因素Client含有4个离散值,V
2={Firefox,IE,Opera,Google},p
2=4;第三个因素WebServer含有3个离散值,V
3={WebSphere,Apache,NET},p
3=3;第四个因素OS含有2个离散值,V
4={Windows,Linux},p
4=2。该待测系统SUT因素的所有离散值共有P个
约束限制只有一个,可以用C表示C={if([Client]==″IE″)then([OS]!=″linux″)},待测软件系统SUT的一个测试用例test可以用4元组表示为test=(v
1,v
2,v
3,v
4),其中v
1∈V
1,v
2∈V
2,v
n∈V
n且满足约束限制C;
(2)对待测系统SUT因素的所有离散值按照因素从左到右的顺序进行编号,第一个因素Database的第一个离散值DB/2编号为1,第二个离散值Oracle的编号为2,其编号集合可以用集合H1表示为H1={1,2};第二个因素Client的第一个离散值Firefox编号为3,第二个离散值IE的编号为4,第三个离散值Opera编号为5,第四个离散值Google编号为6,其编号集合可以用集合H2表示为H2={3,4,5,6};第三个因素WebServer的第一个离散值WebSphere编号为7,第二个离散值Apache的编号为8,第三个离散值NET编号为9,其编号集合可以用集合H3表示为H3={7,8,9};第四个因素WebServer的第一个离散值windows编号为10,第二个离散值linux的编号为11,其编号集合可以用集合H4表示为H4={10,11}。
(3)待测软件系统SUT中任意两个因素对可以用二元关系矩阵T=(ti,j)11×11表示为:
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
t4,11=0是因为参数直接约束if([Client]==″IE″)then([OS]!=″linux″)造成不存在(IE,linux)这样的覆盖对,其他ti,j=0的是因为没有存在覆盖对。
(4)对上述待测软件系统SUT,在粒子群中每个粒子代表一个生成的测试用例集,根据测试需求和历史数据取测试用例集中含测试用例个数为12;则粒子群中粒子li的编码为:li=<(li11,li12,li13,li14),(li21,li22,li23,li24),…,(li121,li122,li123,li124)>,其中lijk∈Hk,该编码的长度为12×4=48,(li11,li12,li13,li14)代表该测试用例集中的第1个测试用例,(li21,li22,li23,li24)代表该测试用例集中的第2个测试用例,(li121,li122,li123,li12n)代表该测试用例集中的第12个测试用例;
(5)设定基于粒子群算法的参数,所述的参数包括粒子群中粒子的数量10,生成的测试用例集中测试用例的个数12,初始化各个粒子的局部最优值为100,全局部最优值为100;随机选取各因素可取离散值初始化每个粒子的各维位置,例如第4个粒子随机初始化的位置编码为:
l4=<(2,5,8,11),(1,5,7,11),(1,3,9,10),(2,6,8,11),(1,4,9,10),(1,5,7,11),(1,3,8,10),(1,5,8,10),(2,5,9,10),(2,5,7,10),(2,5,7,11),(2,6,9,11)>
令迭代次数t=1,开始组合测试用例集生成;
(6)上述粒子l4其对应的二元覆盖关系矩阵T=(ti,j)11×11为:
0 |
0 |
1 |
0 |
2 |
1 |
1 |
1 |
1 |
-3 |
-1 |
0 |
0 |
1 |
1 |
-3 |
-1 |
-1 |
-1 |
-1 |
-1 |
-3 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
-1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
3 |
1 |
0 |
2 |
3 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
计算过程为:从l4的编码中可以准确地获得该粒子所代表的测试用例集所覆盖的两两覆盖对以及其出现的次数,若两两覆盖对<i,j>出现w次,则将关系矩阵T中的ti,j的值减去w,例如<1,3>出现了2次,t1,3=1-2=-1;计算关系矩阵T中值为1的元素的个数UnCount(l4)=1+(1+1)+(1+1)+(1+1)+0+(1+1)+0+0+0+0+0=9就是该粒子代表的测试用例集没有覆盖的对数,作为该粒子所代表的生成的测试用例集的适应值f(l4)=UnCount(l4)=9;
(7)对粒子l4,将当前适应值为9和该粒子局部最优位置的适应值l4Best=100进行比较;当前位置较好,则将粒子的当前位置其作为该粒子当前的局部最优位置LocBest4=l4,即粒子的当前适应值作为该粒子的局部最优适应值l4Best=f(l4)=UnCount(l4)=9;
(8)对粒子l4,将其局部最优适应值l4Best和全局经历过的最优位置的适应值LGBest=100进行比较,则第4个粒子l4的局部最优值l4Best比LGBest好,则将其局部最优位置作为当前粒子群的全局最优位置GBest=LocBest4,该粒子的局部最优适应值作为粒子群的全局最优适应值LGBest=l4Best=9;
l4=<(2,5,8,11),(1,5,7,11),(1,3,9,10),(2,6,8,11),(1,4,9,10),(1,5,7,11),(1,3,8,10),(1,5,8,10),(2,5,9,10),(2,5,7,10),(2,5,7,11),(2,6,9,11)>
(9)更新粒子的各维的位置,以l
4为例,从l
4编码中计算各个离散值出现的次数分别为{6,6,2,1,7,2,4,4,4,6,6}即num(1)=6,num(2)=6,num(3)=2,num(4)=1,num(5)=7,num(6)=2,num(7)=4,num(8)=4,num(9)=4,num(10)=6,num(11)=6,以第一个测试用例的更新为例说明更新过程,其他的11个测试用例的更新过程和第一个完全一样。第一个测试用例(2,5,8,11),2出现了num(2)=6次,其更新过程中可能取值为{1,2}pror(1)=1/12
5出现了num(5)=7次,其更新过程中可能取值为{3,4,5,6}pror(3)=1-4*2/12=1/3,pror(4)=1-4*1/12=2/3,pror(5)=1/12,pror(6)=1-4*2/12=1/3,则
同理可以计算prob(7)=prob(8)=prob(9)=1/3;prob(10)=prob(11)=1/2按照以上计算的各个离散值概率取值,得到的结果如下:
l4′=<(1,6,8,10),(2,3,8,11),(2,3,7,10),(1,5,7,10),(2,6,7,11),(2,4,8,10),(1,5,9,11),(2,5,8,10),(2,5,8,10),(2,3,7,11),(1,3,7,10),(2,5,9,10)>T′其T为:
0 |
0 |
0 |
1 |
-1 |
0 |
-1 |
0 |
0 |
-2 |
0 |
0 |
0 |
-2 |
0 |
2 |
0 |
-2 |
-3 |
0 |
-4 |
-2 |
0 |
0 |
0 |
0 |
0 |
0 |
2 |
0 |
1 |
-1 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
-1 |
-3 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-2 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-3 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
f(l4′)=UnCount(l4′)=5,粒子l4的适应值减小,其代表的测试用例集剩余没有覆盖的对数减少,覆盖的两两覆盖对增多,朝着最优的方向前进。
(10)如果当前的迭代次数t等于最大迭代次数MAX,或者当前粒子群的LGBest的UnCount达到期望的值0,则全局最优值PGBest所对应的粒子所代表的测试用例集即为测试用例集缩减的最优测试用例集,结束循环;否则,t=t+1,返回第(6)步。
经过7次迭代,粒子群的LGBest的UnCount达到期望的值0,最优位置为
l4=<(2,4,7,10),(1,6,7,10),(1,5,7,11),(2,3,7,10),(1,3,9,10),(1,6,8,10),(2,6,9,11),(1,4,9,10),(1,5,9,10),(1,4,8,10),(2,5,8,11),(2,3,8,11)>矩阵T为:
0 |
0 |
0 |
-1 |
-1 |
-1 |
-1 |
1 |
-2 |
-5 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
-2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-1 |
-1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
生成组合测试用例(12个):
通过以上过程可以实现两两覆盖组合软件测试用例集自动生成,用基于改进离散粒子群算法的测试用例集生成方法的将上述过程执行30次,初始值每次随机产生,30次的结果都是12个测试用例,满足了约束,同时还覆盖了所有的两两覆盖,虽然生成的测试用例集的具体内容可能不一样,但个数都达到了最少,同时又处理了约束问题,所以该方法生成效果好,稳定性好,结果与初值无关。
图2给出了某一次迭代过程中,粒子群10个粒子的局部最优值的平均值的变化情况,从中可以看出,粒子群中粒子整体收敛速度较快,经过7次迭代,达到最优,结束迭代,说明该方法效果好。
图3给出了30次实验中,每次找到最优测试用例集生成方案进行的迭代次数,最少的2次迭代,最多的是20次迭代,平均值为7.336次,迭代次数较少,计算速度快。
实例分析表明,本发明提出的两两覆盖组合软件测试用例集生成方法与已有的组合测试用例集生成方法相比,本发明提供两两覆盖组合测试用例集生成方法充分利用组合测试生成离散值的特点,编码形式简单,位置更新操作简单,收敛速度快,稳定性好,计算量少,并且与初始值无关,生成的测试用例集规模整体较小,是一种有效的两两覆盖组合软件测试用例集生成方法,在组合测试中自动生成满足约束的最小的两两覆盖测试用例集有利于快速的检测系统中存在的错误,不仅可以有效减小测试用例设计的开销,而且大大的提高了测试的效率。