一种基于相关输入变量的变异体分组方法

文档序号:24787461发布日期:2021-04-23 11:11阅读:105来源:国知局
一种基于相关输入变量的变异体分组方法

1.本发明涉及计算机软件测试领域,具体是一种基于相关输入变量的变异体分组方法。


背景技术:

2.在软件整个生命周期中,软件测试是软件质量的重要保障。通过有效的测试,能够检测软件存在的缺陷,并且能够提高软件的可靠度。近些年,软件测试技术也越来越成熟,其中,变异测试是一种故意植入缺陷的测试技术,它也是提高测试用例集充分性的一种有效方法。
3.变异测试首先通过使用变异算子对程序的某一语句实施合乎语法的微小变动,以产生一个新的程序,这个新程序就是一个变异体。某一测试用例分别执行变异体和原程序,如果两者的输出结果不同,那么,称该测试用例杀死了该变异体,这种准则被定义为强变异测试;如果原程序和变异体,在变异点执行后,状态出现不一致,即可认为该变异体基于弱变异测试准则被杀死。
4.对一个程序被实施不同的变异算子,一般会生成数量庞大的变异体,这增加了变异测试的代价,限制了变异测试在工业上的应用。为了克服以上不足,papadakis等人在2011年《software quality journal》第19期发表的文章“automatically performing weak mutation with the aid of symbolic execution,concolic testing and search

based testing”一文提出一种新的软件测试方法。他们基于弱变异测试准则杀死变异体的问题,转化为变异条件语句真分支的覆盖问题。为此,对于变异前后的语句和,基于弱变异测试的必要条件,构建变异条件语句
“”
,其真分支为一个标志语句,简称变异分支,一个变异分支对应一个变异体;然后,把这些变异分支插入到原程序的变异前的语句前面,这样便形成了新的被测程序。那么,能够覆盖新程序变异体的测试用例,一定能够基于弱变异测试准则,杀死对应的变异体。这样做的好处是,将变异测试问题转化为分支覆盖问题。
5.研究表明很多输入变量并不影响变异体是否被杀死,不相关变量参与变异测试,可能会影响变异测试的效率。而且,变异体与输入变量的相关性是多对多关系。如果将大量的变异体,依据输入变量的相关性进行分组,将有利于降低变异测试的代价。
6.然而,寻找变异体与输入变量之间的相关性很难。考虑到,基于搜索的进化算法,已经广泛的应用于变异测试中,尤其是高效生成杀死变异体的测试用例。适应值函数用于驱动进化算法生成测试用例,本发明通过动态分析适应值变化与输入变量相关性,快速得到变异体与输入变量的相关性,从而基于输入变量相关性分组变异体。


技术实现要素:

7.为了解决上述现有技术中寻找变异体与输入变量之间的相关性很难,进而导致软件测试生成测试用例效率低下的问题,本发明提供一种基于相关输入变量的变异体分组方法,该方法,首先建立变异测试用例生成优化模型,设计适应值函数;然后,将判定变异体是
否被杀死与输入变量的相关性,转化为判定适应值与输入变量的相关性,也就是在输入域内,某一输入变量取不同值是否影响适应值的变化。最后,基于相同相关输入变量分组变异体。
8.本发明采用的技术方案:一种基于相关输入变量的变异体分组方法,设被测程序为g,对其包含的语句实施变异,得到变异体集合为m={m1,m2,

,m
n
},n是变异体的个数;将这些变异体转化的变异分支插入到g中,得到新的被测程序g';设程序的输入向量为x=(x1,x2,

,x
m
),m是程序输入变量的个数;输入域d(x)是每个输入变量域的叉乘,即d(x)=d(x1)
×
d(x2)
×…×
d(x
m
);其特征在于:该方法包括以下步骤:
9.s1:构建变异测试用例生成的优化模型并设计适应值函数;
10.s2:动态确定变异体与输入变量之间的相关性;
11.s3:分组变异体。
12.优选的,步骤s1构建变异测试用例生成的优化模型的方法为:
13.记f
i
(x)为目标函数,反映程序的输入向量x基于弱变异测试准则,是否杀死变异体m
i
,当m
i
被杀死,f
i
(x)=0,否则,f
i
(x)=1;m
i
被杀死当且仅当f
i
(x)取最小值0;因此生成杀死m
i
测试用例问题可以转化为求解f
i
(x)最小值问题,记为:
14.min f
i
(x)
15.f
i
(x)只取0和1两个值,很难指导种群的进化;为给种群进化提供更多的信息,在模型中增加一个约束函数g
i
(x);
16.x覆盖m
i
的前提是,必须可达原语句s,因此定义x是否覆盖s为约束函数g
i
(x);覆盖s的分支距离,设为dist
i
(x);那么,dist
i
(x)=0时当且仅当x能够覆盖s,分支距离的值可以任意大,将其进行归一化处理;令
[0017][0018]
由上式可知,0≤g
i
(x)<1,且g
i
(x)=0当且仅当dist
i
(x)=0,即,如果x能够覆盖s,那么,g
i
(x)取值为0;
[0019]
那么,杀死m
i
的测试用例生成问题的数学模型为:
[0020]
min(f
i
(x))
[0021][0022]
采用基于遗传算法求解上式最优解时,程序的输入向量为遗传算法的决策变量,记为x=(x1,x2,

,x
m
),那么,适应值函数定义为,
[0023]
fit
i
(x)=f
i
(x)
×
(g
i
(x)+d)
[0024]
其中,d是一个很小的常数,它的作用确保括号中的值大于0;由上式可知,进化个体性能越好,fit
i
(x)越小;当fit
i
(x)=0时,种群找到了最优解x。
[0025]
优选的,步骤s2动态确定变异体与输入变量之间的相关性的方法为:
[0026]
为了判定变异体m
i
与输入变量x
j
的相关性,首先,随机生成一些进化个体,作为基准测试数据,计算它的适应值;然后,对x
j
做扰动,扰动后的值替换x
j
的值,计算新测试数据的适应值;最后,通过计算x
j
扰动前、后对应的适应值,判定变异体与输入变量的相关性;具体为:
[0027]
确定扰动值的方法,在d(x
j
)内随机取一个值γ1,接近d(x
j
)上、下边界附近随机各取两个值γ2,γ3;
[0028]
设ρ
ij
为m
i
与x
j
是否相关的标记变量,m
i
与x
j
相关,标记ρ
ij
=1,否则,ρ
ij
=0;
[0029]
设size为种群中进化个体的个数,第k个进化个体为其中对应x
j
的取值;
[0030]
基于适应值判定变异体与输入变量的相关性算法:
[0031]
输入:m
i
,i=1,2,

,n;x
j
,j=1,2,

,m;
[0032]
输出:ρ
ij
或杀死m
i
的测试用例;
[0033]
a1:随机生成进化个体然后执行g',计算它的目标函数f
i
(u
k
)的值;
[0034]
a2:如果f
i
(u
k
)=0,输出杀死m
i
测试用例u
k
;否则,转a3;
[0035]
a3:如果g
i
(x)=0,计算fit
i
(u
k
)的值;否则,转a1;
[0036]
a4:
[0037]
a5:执行g',计算
[0038]
a6:如果ρ
ij
=1;否则,转a7;
[0039]
a7:如果且
[0040]
那么ρ
ij
=0,否则ρ
ij
=1;
[0041]
a8:输出ρ
ij

[0042]
优选的,步骤s3分组变异体的方法为:
[0043]
将变异体与输入变量之间的相关矩阵表示为:
[0044][0045]
其中o
i
=(ρ
i1

i2
,


im
)为λ的行向量,其中ρ
ij
为m
i
与x
j
是否相关标记;
[0046]
分组变异体的算法为:
[0047]
输入:m,x,λ;
[0048]
输出:变异体组c1,c2,

,c
β

[0049]
b1:k=1,
[0050]
b2:设
[0051]
b3:在对o1=(ρ
11

12
,


1m
)与o
i
=(ρ
i1

i2
,


im
),i=2,3,

,m,实施异或运算如果第1行和第i行对应的变异体放入c
k
中,将o1&o
i
值为1对应的第j列的相关输入变量保存;最后获得第k组变异体其中为变异体的个数;与其相关的输入变量记为其中l
k
为相关变量个数;
[0052]
b4:从m中删除从λ删除对应的行,删除
对应的列;
[0053]
b5:判断λ是否为空;如果不为空,k=k+1;转b2;否则,转b6;
[0054]
b6:输出变异体组c1,c2,

,c
β

[0055]
本发明的有益效果:
[0056]
(1)本发明通过将分支覆盖作为约束条件,建立基于弱变异测试准则的变异测试数学模型,并针对该模型,设计适应值函数,有利于将成熟的分支覆盖技术应用于变异测试,改善变异测试的效率。
[0057]
(2)本发明将判定输入变量与变异体的相关性,转化为判定输入变量与适应值的相关性,这样有利于动态分析输入变量与变异体的相关性,尤其对于难杀死变异体,而且有利于降低判定相关性的代价。
[0058]
(3)考虑到输入变量与变异体的相关性是多对多的关系,可以基于相同输入变量分组变异体,这样有利于化简变异体的规模,将具有相同相关输入变量的变异体,在相同的被缩小的搜索域内,快速搜索最优解。
附图说明
[0059]
图1为本发明提出的一种基于相关输入变量的变异体分组方法总流程图;
[0060]
图2为本发明实施例中的示例程序。
具体实施方式
[0061]
如图1所示,为本发明提出的一种基于相关输入变量的变异体分组方法总流程图。该方法包括:
[0062]
步骤s1:构建变异测试用例生成的优化模型并设计适应值函数
[0063]
设被测程序为g,对其包含的语句实施变异,得到变异体集合为m={m1,m2,

,m
n
},n是变异体的个数。将这些变异体转化的变异分支插入到g中,得到新的被测程序g'。设程序的输入向量为x=(x1,x2,

,x
m
),m是程序输入变量的个数。输入域d(x)是每个输入变量域的叉乘,即d(x)=d(x1)
×
d(x2)
×…×
d(x
m
)。
[0064]
记f
i
(x)为目标函数,反映程序的输入向量x能否覆盖变异分支,即基于弱变异测试准则是否杀死变异体时。当m
i
被杀死,f
i
(x)=0,否则,f
i
(x)=1。m
i
被杀死当且仅当f
i
(x)取最小值0。因此,生成杀死m
i
测试数据问题,可以转化为求解f
i
(x)最小值问题,记为:
[0065]
min f
i
(x)
ꢀꢀꢀ
(1)
[0066]
f
i
(x)只取0和1两个值,如此函数很难指导种群的进化。为给种群进化提供更多的信息,我们需要在模型中增加一个约束函数。
[0067]
x覆盖m
i
的前提是,必须可达原语句s,因此定义x是否覆盖s为约束函数g
i
(x)。覆盖s的分支距离,设为dist
i
(x)。那么,dist
i
(x)=0时当且仅当x能够覆盖s,分支距离的值可以任意大,为了处理方便,将其进行归一化处理。令
[0068][0069]
由上式可知,0≤g
i
(x)<1,且g
i
(x)=0当且仅当dist
i
(x)=0,即,如果x能够覆盖s,那么,g
i
(x)取值为0。
[0070]
那么,杀死m
i
的测试数据生成问题的数学模型为:
[0071]
min(f
i
(x))
[0072][0073]
采用基于遗传算法求解上式最优解时,程序的输入向量为遗传算法的决策变量,记为x=(x1,x2,

,x
m
),那么,适应值函数定义为,
[0074]
fit
i
(x)=f
i
(x)
×
(g
i
(x)+d)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(3)
[0075]
其中,d是一个很小的常数,它的作用确保括号中的值大于0。由上式可知,进化个体性能越好,fit
i
(x)越小。当fit
i
(x)=0时,种群找到了最优解x。
[0076]
步骤s2:动态确定变异体与输入变量之间的相关性
[0077]
总体上讲,可以把变异体与输入变量之间相关分为不相关和相关。下面给出这些相关性的定义。
[0078]
不相关在d(x
j
)域内,输入变量x
j
取任意值,都不会改变x杀死m
i
情况,那么,x
j
与m
i
不相关。
[0079]
相关设d
*
(x
j
)为d(x
j
)的子域;若输入变量x
j
取值时,且当其他输入变量的值保持不变时,若那么m
i
与x
j
相关;
[0080]
变异体与输入变量之间的相关性非常复杂,不能直接获得。考虑到适应值函数的构建是为了驱动找到测试数据杀死变异体,适应值直接反映了变异体杀死情况,所以,本发明将判定变异体与输入变量之间的相关性,转化为变异体与适应值的相关性。
[0081]
为了判定变异体m
i
与输入变量x
j
的相关性,首先,随机生成一些进化个体,作为基准测试数据,计算它的适应值;然后,对x
j
做很小的扰动,扰动后的值替换x
j
的值,计算新测试数据的适应值;最后,通过计算x
j
扰动前、后对应的适应值,判定变异体与输入变量的相关性。
[0082]
确定扰动值的方法,在d(x
j
)内随机取一个值γ1,接近d(x
j
)上、下边界附近随机各取两个值γ2,γ3。
[0083]
设ρ
ij
为m
i
与x
j
是否相关的标记变量,m
i
与x
j
相关,标记ρ
ij
=1,否则,ρ
ij
=0。
[0084]
设size为种群中进化个体的个数,第k个进化个体为其中对应x
j
的取值。
[0085]
算法1基于适应值判定变异体与输入变量的相关性:
[0086]
输入:m
i
,i=1,2,

,n;x
j
,j=1,2,

,m;
[0087]
输出:ρ
ij
或杀死m
i
的测试用例。
[0088]
a1:随机生成进化个体然后执行g',计算它的目标函数f
i
(u
k
)的值;
[0089]
a2:如果f
i
(u
k
)=0,输出杀死m
i
测试用例u
k
;否则,转a 3;
[0090]
a3:如果g
i
(x)=0,计算fit
i
(u
k
)的值;否则,转a 1;
[0091]
a4:
[0092]
a5:执行g',计算
[0093]
a6:如果ρ
ij
=1;否则,转a 7;
[0094]
a7:如果且
[0095]
那么ρ
ij
=0,否则ρ
ij
=1;
[0096]
a8:输出ρ
ij

[0097]
在a2中,如果f
i
(u
k
)=0,表示杀死m
i
的测试数据找到;在a3中,需要判断判断g
i
(x)是否为0,因为,g
i
(x)=0表示进化个体可达变异体,只有满足可达性条件,计算适应值才意义。
[0098]
按照算法1,可以获得每个变异分支和每个输入变量的ρ
ij

[0099]
步骤s3:分组变异体
[0100]
将变异体与输入变量之间的相关矩阵表示为:
[0101][0102]
其中o
i
=(ρ
i1

i2
,


im
)为λ的行向量,其中ρ
ij
为m
i
与x
j
是否相关标记;
[0103]
算法2:分组变异体
[0104]
输入:m,x,λ;
[0105]
输出:变异体组c1,c2,

,c
β

[0106]
b1:k=1,
[0107]
b2:设
[0108]
b3:在对o1=(ρ
11

12
,


1m
)与o
i
=(ρ
i1

i2
,


im
),i=2,3,

,m,实施异或运算如果第1行和第i行对应的变异体放入c
k
中,将o1&o
i
值为1对应的第j列的相关输入变量保存;最后获得第k组变异体其中为变异体的个数;与其相关的输入变量记为其中l
k
为相关变量个数;
[0109]
b4:从m中删除从λ删除对应的行,删除对应的列;
[0110]
b5:判断λ是否为空;如果不为空,k=k+1;转b2;否则,转b6;
[0111]
b6:输出变异体组c1,c2,

,c
β

[0112]
下面通过示例程序说明本发明的实施过程。
[0113]
图2为示例程序源代码。程序的输入变量为x,y,z,w∈[0,70]4。在程序的前、中和后部,分别选取被测语句,实施变异操作,生成5个变异体,并转化为5个变异分支,插装到原程序中,得到新程序如图2(b)所示。
[0114]
为了分析变异体与输入变量的相关性,基于传统变异测试数据生成方法,计算进化个体的适应值,如图2(c)为针对m3插装后的程序,其中fx用于计算目标函数值,gx用于计
算约束函数值,fitness用于计算适应值。
[0115]
比如,进化到一定代数后,得到某一个体10,70,2,12满足可达性。针对4个输入变量,表1显示了扰动后结果。第1列为扰动操作的输入变量,第2列为扰动后的进化个体,第3

5列为根据图2(c),得到的目标函数值、约束函数值和适应值。最后一列为各输入变量与m3的相关性。
[0116]
从表1可以看出,输入变量x,y做一次扰动后,适应值有变化,判定x,y与m3有相关性。输入变量z第二次扰动后,适应值有变化,但g(x)=1,说明新个体10,70,10,12已经不满足可达性,所以判定z与m3具有相关性。输入变量w扰动三次,适应值都没有变化,判定w与m3没有相关性。
[0117][0118]
假设,可以得到下面相关矩阵,
[0119][0120]
基于上面的λ,采用算法1,可以得到c1={m1,m2,m3,m5},c2={m4,m6},确定m1,m2,m3,m5与x,y相关,m4,m6与z,w相关。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1