一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于组合覆盖的循环代码模糊测试方法

2022-11-12 21:15:40 来源:中国专利 TAG:


1.本发明涉及软件测试技术领域,更具体的说是涉及一种基于组合覆盖的循环代码模糊测试方法。


背景技术:

2.随着计算机软件应用的越来越广泛,与此同时,软件的规模和复杂程度随着其功能的强大而剧增,在这些大规模的软件中,循环代码块及其中的判定分支语句是构成函数的重要基础逻辑模块,也是引起软件复杂度上升、测试路径爆炸的主要原因。如果能够全面地对复杂软件的循环代码块及其中的判定分支语句进行充分测试,不仅能合理分配有限的资金和人力等测试资源,有针对性地对容易出错的部分进行分析,还可以更加客观地评价测试结果,对软件质量、开发成本控制都有着重要的指导意义。现有的白盒测试充分性度量有路径覆盖、语句覆盖、分支覆盖、和基本路径覆盖等。对于循环代码,难以使用已有的覆盖指标对测试充分性进行度量。路径覆盖指标关注循环上下边界范围内所有可能的循环路径,在复杂软件中进行穷举测试显然不可行;语句覆盖、分支覆盖和基本路径覆盖关注覆盖所有的语句、分支和基本路径,对循环代码而言又不够充分。而且,上述覆盖指标主要基于软件内部代码逻辑结构,需要持续跟踪测试数据集在整个软件中的执行情况,对于复杂软件而言,这无疑将产生巨大的开销。此外,上述结构覆盖率对测试复杂软件中关键循环代码块缺乏针对性。
3.因此,如何对循环代码块及其中的判定分支语句进行有针对性的模糊测试,以提高测试的充分性,是本领域技术人员亟需解决的问题。


技术实现要素:

4.有鉴于此,本发明设计面向复杂软件循环代码块的组合覆盖测试充分性评价准则,对循环代码块及其中的判定分支语句进行有针对性的模糊测试,从组合覆盖角度来评价循环代码的测试充分性。首先,根据组合覆盖准则的需要对待测试程序进行插桩;然后,筛选初始测试用例插入测试用例队列,并根据所提出的覆盖准则计算测试用例的适应度;最后,变异生成子代测试用例并进行模糊测试。
5.具体的,为了实现上述目的,本发明提供如下技术方案:
6.一种基于组合覆盖的循环代码模糊测试方法,包括以下步骤:
7.步骤1、根据循环代码组合覆盖准则对待测试程序进行插桩,得到插桩后的待测试程序;
8.步骤2、获取初始种子测试用例集合t
ini
,并将其中的初始种子测试用例在已插桩的被测程序上执行并计算其覆盖率,将未触发崩溃的初始种子测试用例加入测试用例队列t
list

9.步骤3、从测试用例队列t
list
中取出一个种子测试用例ti,计算其适应度并为其分配对应资源以变异生成子代测试用例集合
10.步骤4、将子代测试用例集合中的每个子代测试用例在已插桩的被测程序上执行并计算其覆盖率,根据子代测试用例对循环代码块及其中判定分支语句的覆盖情况,决定是否将其插入测试用例队列t
list
中;
11.步骤5、判断是否满足模糊测试停止条件,若是,则结束测试,若否,则返回步骤3。
12.可选的,所述步骤1中,对待测试程序进行插桩的具体步骤为:
13.步骤1.1、输入待测试程序;
14.步骤1.2、对待测试程序进行预处理;
15.步骤1.3、生成待测试程序源代码对应的抽象语法树;
16.步骤1.4、根据所述抽象语法树,得到待测试程序中的循环代码块及其中的判定分支语句;
17.步骤1.5、基于待测试程序中的循环代码块及其中判定分支语句的位置和循环代码组合覆盖准则,使用静态插桩技术进行插桩,植入探针代码;
18.步骤1.6、输出插桩后的待测试程序。
19.可选的,所述步骤1.5中,插桩过程中探针的位置被设置在循环代码块及其中判定分支语句的开始,即循环代码块及其中的判定分支语句后的第一条语句前。
20.可选的,所述步骤1.5中,循环代码组合覆盖准则的方法为:代码块l的循环代码块集合为r={r1,r2,

,rk,

},rk表示深度为k的所有循环代码块集合,rk={r
k,1
,r
k,2


,r
k,v


},其中r
k,v
为深度为k的第v个循环代码块,b
k,v
={b
k,v,1
,b
k,v,2


,b
k,v,u


}为循环代码块r
k,v
中的判定分支语句集合,其中b
k,v,u
为深度为k的第v个循环代码块中的第u个判定分支语句;
21.对于测试用例ti:测试用例ti执行代码块l的覆盖情况记录为执行代码块l的覆盖情况记录为其中为第k层循环代码块的覆盖情况,的值为深度为k的第v个循环代码块被测试用例ti执行的次数,执行的次数,为循环代码块r
k,v
中判定分支语句的覆盖情况,其中表示深度为k的第v个循环代码块中的第u个判定分支语句是否被测试用例ti覆盖,若覆盖则值为1,若未覆盖则值为0。
22.可选的,所述步骤2的具体步骤为:
23.步骤2.1、输入初始种子测试用例集合t
ini

24.步骤2.2、从初始种子测试用例集合t
ini
中选取一个初始种子测试用例ti;
25.步骤2.3、在插桩后的待测试程序上执行所述初始种子测试用例ti,并记录所述初始种子测试用例ti的覆盖情况;
26.步骤2.4、判断所述初始种子测试用例ti的崩溃情况,若所述初始种子测试用例ti导致插桩后的待测试程序发生崩溃,则将所述初始种子测试用例ti加入崩溃测试用例集合te;若所述初始种子测试用例ti未导致插桩后的待测试程序发生崩溃,则计算所述初始种子测试用例ti的循环代码块覆盖情况;
27.步骤2.5、重复步骤2.2至步骤2.4,直至遍历完初始种子测试用例集合t
ini
中的所有初始种子测试用例,将未导致插桩后的待测试程序发生崩溃的初始种子测试用例插入到测试用例队列t
list
中;
28.步骤2.6、输出测试用例队列t
list

29.可选的,所述步骤3的具体步骤为:
30.步骤3.1、从测试用例队列t
list
中取出一个种子测试用例ti在插桩后的待测试程序上执行;
31.步骤3.2、计算种子测试用例ti的适应度;
32.步骤3.3、根据适应度变异生成种子测试用例ti的子代测试用例,存入子代测试用例集合
33.步骤3.4、输出子代测试用例集合
34.可选的,所述步骤3.2中,计算种子测试用例ti的适应度的方法为:
[0035][0036]
其中size(r)为循环代码块集合r中元素的数量,即程序中循环代码块的最大深度;rk为深度为k的循环代码块集合;size(rk)为rk中的元素数量,即深度为k的循环代码块总数;r
k,v
表示深度为k的第v个循环代码块,为种子测试用例ti对循环代码块r
k,v
的执行次数;l
max
为测试关注的最大循环次数阈值;size(b
k,v
)为循环代码块r
k,v
中的判定分支语句数量;表示深度为k的第v个循环代码块中的第u个判定分支语句是否被测试用例ti覆盖,若覆盖则值为1,若未覆盖则值为0。
[0037]
可选的,所述步骤4的具体步骤为:
[0038]
步骤4.1、输入子代测试用例集合
[0039]
步骤4.2、从子代测试用例集合中选取子代测试用例
[0040]
步骤4.3、在插桩后的待测试程序上执行子代测试用例并记录子代测试用例的覆盖情况和崩溃情况;
[0041]
步骤4.4、判断子代测试用例的崩溃情况,若子代测试用例导致插桩后的待测试程序发生崩溃,则将子代测试用例加入崩溃测试用例集合te;若子代测试用例未导致插桩后的待测试程序发生崩溃,则计算子代测试用例的循环代码块覆盖情况;
[0042]
步骤4.5、依据子代测试用例针对循环代码块的覆盖情况,决定是否将子代测试用例插入测试用例队列t
list

[0043]
步骤4.6、重复步骤4.2至步骤4.5,直至子代测试用例集合遍历完毕。
[0044]
可选的,所述步骤5中,判断是否满足模糊测试的停止条件,若已经满足模糊测试的覆盖目标或达到预期执行时间,则停止模糊测试并输出崩溃测试用例集合te和测试报告;若未满足模糊测试停止条件,则转至执行步骤3.1。
[0045]
可选的,所述步骤4.5中,依据子代测试用例的循环代码块覆盖情况,决定是否将子代测试用例插入测试用例队列t
list
,具体方法为:
[0046]
对于循环代码块,当子代测试用例的循环次数小于等于最大循环次数阈值l
max
时,若子代测试用例执行某循环代码块的次数和测试用例队列t
list
中其他测试用例不同,或覆盖到测试用例队列t
list
中其他测试用例尚未覆盖的循环代码块中判定分支语句,则将子代测试用例插入测试用例队列t
list
,否则丢弃该子代测试用例当子代测试用例的循环次数大于最大循环次数阈值l
max
时,若子代测试用例覆盖到测试用例队列t
list
中其他测试用例尚未覆盖的循环代码块中的判定分支语句,则将子代测试用例插入测试用例队列t
list
,否则丢弃该子代测试用例
[0047]
经由上述的技术方案可知,本发明公开了一种基于组合覆盖的循环代码模糊测试方法,与现有技术相比,具有以下有益效果:
[0048]
本发明一方面提出了针对循环代码块的组合覆盖准则。为了解决模糊测试对代码中关键的判定分支及循环代码缺乏针对性的问题,本发明提出了全新的循环代码块的组合覆盖准则,关注测试用例对不同嵌套层次下循环代码块执行次数及其中判定分支的覆盖情况。相较其他模糊测试方法,该准则更清晰的记录了测试用例对循环代码块的覆盖情况,并记录了循环代码块在代码文件中的嵌套层次,有针对性的解决了模糊测试对循环代码块测试不充分问题。
[0049]
进一步的,本发明将循环代码组合覆盖准则应用于模糊测试流程中,用于分析测试用例覆盖率、计算测试用例适应度并制导子代测试用例生成。首先在待测试程序中植入插桩探针用于收集测试用例覆盖准则信息;然后,通过根据覆盖准则信息和公式计算种子测试用例针对循环代码块的覆盖率,并计算种子测试用例的适应度信息;最后,根据种子测试用例的适应度信息制导子代测试用例的生成。相较其他模糊测试流程,本发明更注重对软件中和循环代码块的测试,通过收集每一轮模糊测试中测试用例的覆盖情况,以制导生成更多针对循环代码块的测试用例,实现对程序的针对性模糊测试。
附图说明
[0050]
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
[0051]
图1为本发明的方法步骤流程图;
[0052]
图2为本发明的方法原理示意图;
[0053]
图3为本发明中步骤1的步骤流程图;
[0054]
图4为本发明中步骤2的步骤流程图;
[0055]
图5为本发明中步骤3的步骤流程图;
[0056]
图6为本发明中步骤4的步骤流程图。
具体实施方式
[0057]
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他
实施例,都属于本发明保护的范围。
[0058]
本发明的技术方案原理如图2所示,其中,输入为待测试程序和初始种子测试用例集合,首先,根据循环代码组合覆盖准则的需要对待测试程序进行插桩;然后,使用初始种子测试用例驱动程序执行,依据执行结果筛选得到测试用例队列;最后,根据组合覆盖准则计算测试用例的适应度,并生成子代测试用例,以进行模糊测试。
[0059]
本发明提出的循环代码组合覆盖准则为:
[0060]
代码块l的循环代码块集合为r={r1,r2,

,rk,

},rk表示深度为k的所有循环代码块集合,rk={r
k,1
,r
k,2


,r
k,v


},其中r
k,v
为深度为k的第v个循环代码块,b
k,v
={b
k,v,1
,b
k,v,2


,b
k,v,u


}为循环代码块r
k,v
中的判定分支语句集合,其中b
k,v,u
为深度为k的第v个循环代码块中的第u个判定分支语句。
[0061]
以测试用例ti为例,测试用例ti执行代码块l的覆盖情况记录为执行代码块l的覆盖情况记录为其中为第k层循环代码块的覆盖情况,的值为深度为k的第v个循环代码块被测试用例ti执行的次数。执行的次数。为循环代码块r
k,v
中判定分支语句的覆盖情况,其中表示深度为k的第v个循环代码块中的第u个判定分支语句是否被测试用例ti覆盖,若覆盖则值为1,若未覆盖则值为0。
[0062]
在具体实施例中,参见图1,本发明方案的详细步骤如下:
[0063]
步骤1、根据循环代码组合覆盖准则对待测试程序进行插桩。
[0064]
在模糊测试的过程中,需要获取用于计算覆盖准则的信息,如:程序中判定分支语句被覆盖的情况,循环语句被执行的情况和程序执行路径等。为获取这些信息,需要在待测试程序执行的过程中进行记录,本发明使用静态插桩技术进行插桩。
[0065]
为执行上述插桩过程,需先获取被测代码的抽象语法树(abstract syntax tree,ast)。ast是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一条语句,从中可得到循环代码块及其中判定分支语句的信息。
[0066]
如图3所示,具体步骤为:
[0067]
步骤1.1、输入待测试程序;
[0068]
步骤1.2、对待测试程序进行预处理;
[0069]
在一种实施例中,所述预处理的步骤包括删除空格和注释;
[0070]
步骤1.3、生成待测试程序源代码对应的抽象语法树;
[0071]
步骤1.4、根据所述抽象语法树,得到待测试程序中的循环代码块及其中的判定分支语句;
[0072]
步骤1.5、基于待测试程序中的循环代码块及其中判定分支语句的位置和循环代码组合覆盖准则,使用静态插桩技术进行插桩,植入探针代码;插桩过程中探针的位置被设置在循环代码块及其中判定分支语句的开始,和循环代码块及其中的判定分支语句后的第一条语句前;
[0073]
步骤1.6、输出插桩后的待测试程序。
[0074]
步骤2、获取初始种子测试用例集合t
ini
,执行并计算其覆盖率,筛选后加入测试用例队列t
list

[0075]
本发明中初始种子测试用例集合t
ini
={t1,t2,...,ti,...}来自于预先存储的初
始测试数据,其中ti为一个测试用例。t
ini
会依次在已插桩的待测试程序上执行,以通过插桩探针获取初始测试用例崩溃情况和覆盖情况,ti执行过程的覆盖情况记录在ri中。
[0076]
在t
ini
中初始种子测试用例执行过程中,若初始种子测试用例导致待测试程序出现崩溃,则将该初始种子测试用例加入崩溃测试用例集合te,te用来保存在模糊测试过程中导致待测试程序崩溃的测试用例,并在测试结束后报告给测试人员。若未导致崩溃,则将其插入测试用例队列t
list
以进行后续模糊测试。
[0077]
如图4所示,具体步骤为:
[0078]
步骤2.1、输入初始种子测试用例集合t
ini

[0079]
步骤2.2、从初始种子测试用例集合t
ini
中选取一个初始种子测试用例ti;
[0080]
步骤2.3、在插桩后的待测试程序上执行所述初始种子测试用例ti,并记录所述初始种子测试用例ti的覆盖情况;
[0081]
步骤2.4、判断所述初始种子测试用例ti的崩溃情况,若所述初始种子测试用例ti导致插桩后的待测试程序发生崩溃,则将所述初始种子测试用例ti加入崩溃测试用例集合te;若所述初始种子测试用例ti未导致插桩后的待测试程序发生崩溃,则计算所述初始种子测试用例ti的循环代码块覆盖情况;
[0082]
步骤2.5、重复步骤2.2至步骤2.4,直至遍历完初始种子测试用例集合t
ini
中的所有初始种子测试用例,将未导致插桩后的待测试程序发生崩溃的初始种子测试用例插入到测试用例队列t
list
中;
[0083]
步骤2.6、输出测试用例队列t
list

[0084]
步骤3、从测试用例队列t
list
中逐个取出种子测试用例,计算其适应度并为其分配对应资源以变异生成子代测试用例集合。
[0085]
测试用例的适应度信息代表其在模糊测试过程中的质量。适应度越大,由该测试用例变异得到的子代测试用例就会越多。根据种子测试用例ti对待测程序中循环代码块的覆盖情况,计算其适应度,并将其插入测试用例队列t
list
以进行后续模糊测试。适应度高则意味着种子测试用例ti的子代有更高的概率覆盖更多判定分支语句与循环代码块。因此,将为适应度高的种子测试用例分配更多的测试资源以生成更多的子代测试用例。生成的子代测试用例将存入集合其中为种子测试用例ti变异后得到的子代测试用例。
[0086]
如图5所示,具体步骤为:
[0087]
步骤3.1、从测试用例队列t
list
中取出一个种子测试用例ti在插桩后的待测试程序上执行;
[0088]
步骤3.2、计算种子测试用例ti的适应度;
[0089][0090]
其中size(r)为循环代码块集合r中元素的数量,即程序中循环代码块的最大深度;rk为深度为k的循环代码块集合;size(rk)为rk中的元素数量,即深度为k的循环代码块总数;r
k,v
表示深度为k的第v个循环代码块,为种子测试用例ti对循环代码块r
k,v
的执行
次数;l
max
为测试关注的最大循环次数阈值;size(b
k,v
)为循环代码块r
k,v
中的判定分支语句数量;表示深度为k的第v个循环代码块中的第u个判定分支语句是否被测试用例ti覆盖,若覆盖则值为1,若未覆盖则值为0。
[0091]
步骤3.3、根据适应度变异生成种子测试用例ti的子代测试用例,存入子代测试用例集合
[0092]
步骤3.4、输出子代测试用例集合
[0093]
步骤4、执行并计算子代测试用例覆盖率,根据覆盖率决定是否将其插入测试用例队列t
list
中。
[0094]
得到从种子测试用例ti变异生成的子代测试用例集合后,遍历中所有的子代测试用例,每个子代测试用例都将在已插桩的待测试程序上执行,并通过插桩探针收集其运行期间的崩溃情况和覆盖信息。
[0095]
参见图6,具体步骤为:
[0096]
步骤4.1、输入子代测试用例集合
[0097]
步骤4.2、从子代测试用例集合中选取子代测试用例
[0098]
步骤4.3、在插桩后的待测试程序上执行子代测试用例并记录子代测试用例的覆盖情况和崩溃情况;
[0099]
步骤4.4、判断子代测试用例的崩溃情况,若子代测试用例导致插桩后的待测试程序发生崩溃,则将子代测试用例加入崩溃测试用例集合te;若子代测试用例未导致插桩后的待测试程序发生崩溃,则计算子代测试用例的循环代码块覆盖情况;
[0100]
步骤4.5、依据子代测试用例针对循环代码块的覆盖情况,决定是否将子代测试用例插入测试用例队列t
list
,具体判断依据为:
[0101]
对于循环代码块,当子代测试用例的循环次数小于等于最大循环次数阈值l
max
时,若子代测试用例执行某循环代码块的次数和测试用例队列t
list
中其他测试用例不同,或覆盖到测试用例队列t
list
中其他测试用例尚未覆盖的循环代码块中判定分支语句,则将子代测试用例插入测试用例队列t
list
,否则丢弃子代测试用例当子代测试用例的循环次数大于最大循环次数阈值l
max
时,若子代测试用例覆盖到测试用例队列t
list
中其他测试用例尚未覆盖的循环代码块中的判定分支语句,则将子代测试用例插入测试用例队列t
list
,否则丢弃子代测试用例
[0102]
步骤4.6、重复步骤4.2至步骤4.5,直至子代测试用例集合遍历完毕。
[0103]
步骤5、完成所有子代测试用例的执行和分析后,判断是否满足模糊测试停止条件,若是,则停止模糊测试并输出崩溃测试用例集合te和测试报告;若否,则转至步骤3继续测试。
[0104]
在具体实施例中,满足模糊测试停止的条件为:满足模糊测试的覆盖目标或达到预期执行时间。
[0105]
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。
[0106]
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献