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

一种面向持续集成过程的模糊测试方法

2022-10-22 01:08:17 来源:中国专利 TAG:


1.本发明涉及软件协同开发领域领域,更具体的说是涉及一种面向持续集成过程的模糊测试方法。


背景技术:

2.软件演化是指软件系统在其生命周期内得到维护和增强的动态行为,是软件生命周期中的重要过程之一。软件系统在开发过程直至交付之后一直在不断地进行演化,以使软件能够适应业务的不断变化,延长软件使用寿命。随着敏捷软件开发、极限编程等软件开发方式的普及,软件的迭代频率越来越高。因此,需要一种高效的协同工作方式以开发软件。持续集成是一种可以尽早发现集成缺陷,提升软件质量的软件开发实践,最早由grady booch提出,可有效解决软件进行系统集成时面临的各种问题。在持续集成过程中,团队成员通常每天会进行多次集成,每次集成都会进行自动化构建与测试,以尽可能快地检测到集成错误。通过这种方式,可以在开发过程中显著减少集成问题,进而提升所开发软件的质量。
3.在持续集成过程中会进行回归测试,以尽早发现集成错误。然而,持续集成过程中的频繁集成导致需要进行频繁的回归测试。在回归测试开始前,通常需要手动选择、修改已有测试用例、创建大量新的测试用例,才能对持续集成过程中产生变更位置进行充分测试。因此,频繁的回归测试会造成大量的人力开销。模糊测试是一种自动生成大量测试用例并进行测试的技术,有着运行高效、自动化程度高等优点,在近年来受到了研究人员的广泛关注。模糊测试技术在一定程度上可以帮助用户减少频繁回归测试中需要频繁构造大量测试用例所带来的开销。然而,现有的模糊测试方法没有考虑到持续集成过程中产生的信息,若直接将模糊测试应用于持续集成将难以针对持续集成过程产生的变更点进行充分测试,并产生多余的开销。


技术实现要素:

4.有鉴于此,本发明提供了一种面向持续集成过程的模糊测试方法。首先,对被测项目的一次提交进行持续集成差异分析,获取该次提交产生的变更点;第二,在构建过程中,将变更点作为污点源进行污点分析,并获得各基本块与污点源间的距离;第三,根据基本块与污点源的距离进行程序插桩;第四,进行模糊测试,在模糊测试过程中根据种子测试用例的执行信息计算其适应度,为其分配相应的测试资源,以更有针对性地对持续集成产生的变更点进行测试。
5.为了实现上述目的,本发明采用如下技术方案:
6.一种面向持续集成过程的模糊测试方法,包括以下步骤:
7.步骤1:在应用持续集成的项目中,对相邻的两次提交进行差异分析,获取两者的差异信息,并根据差异信息获取变更点,存入变更点集合;
8.步骤2:在构建项目的过程中,根据变更点信息进行数据流分析,获取数据流分析
结果;
9.步骤3:利用数据流分析结果进行程序插桩,获得已插桩的被测程序;
10.步骤4:对被测程序进行模糊测试,在测试过程中计算种子测试用例的适应度,并根据适应度为其分配相应的测试资源。
11.可选的,步骤1包括:
12.步骤1-1:设定起始状态,输入被测项目p;
13.步骤1-2:对被测项目p中相邻的两次提交进行差异分析,获得变更点集合c={c1,c2,

,cn};
14.步骤1-3:输出变更点集合c。
15.可选的,步骤2包括:
16.步骤2-1:设置起始状态,输入被测项目p;
17.步骤2-2:判断被测项目p中的语句是否已经遍历完毕,若遍历完毕,跳转至步骤2-6;若没有遍历完毕,跳转至步骤2-3;
18.步骤2-3:访问被测项目p中的下一条语句;
19.步骤2-4:判断当前语句stat是否与变更点相关,若与变更点相关,则跳转至步骤2-5;若与变更点无关,则跳转至步骤2-3;
20.步骤2-5:对当前语句stat进行定义-使用关系分析;如果stat对内存进行了读取,则认为stat对某一变量进行了“使用”操作;如果stat对内存进行了修改,则认为stat对某一变量进行了“定义”操作;stat分析完毕后,跳转至步骤2-2;
21.步骤2-6:输出被测项目p中所有与变更点相关的定义使用关系信息d;
22.步骤2-7:输入步骤1中获得的变更点集合c;
23.步骤2-8:计算各基本块与污点源之间的距离;将变更点集合c中的每个变更点作为污点源,并结合步骤2-6中获得的定义-使用关系信息d进行污点分析,获取各基本块中变量受污染的情况,如果一个基本块中的变量受到了污染,则认为该基本块受到了污染;如果一个基本块中的变量没有受到污染,则认为该基本块没有受到污染。
24.可选的,计算各基本块与污点源之间的距离,具体步骤如下:
25.获取每个污点源所在的基本块,并存入队列ts={ts1,ts2,

,tsn},其中,tsi表示第i个污点源所在基本块;
26.计算每个基本块与污点源之间的距离,公式如下:
[0027][0028]
式中,bb表示待计算距离的基本块,tsi表示第i个污点源所在基本块,shortest(bb,tsi)表示基本块与污点源所在基本块tsi之间的最短距离。如果bb被tsi污染了,则计算bb与tsi之间的最短距离并加1,作为bb与tsi之间的距离d(bb,tsi),如果该基本块没有被tsi污染,则默认bb与tsi之间的距离d(bb,tsi)为无穷大;
[0029]
根据基本块与每个污点源所在基本块之间的距离,计算该基本块的最终距离,有三种策略,如公式(1)-(4)所示:
[0030][0031]
dist
max
(bb,ts)=max(d(bb,tsi)),1≤i≤n&d(bb,ti)<∞
ꢀꢀꢀꢀꢀꢀꢀ
(2)
[0032]
dist
min
(bb,ts)=min(d(bb,tsi)),1≤i≤n
ꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(3)
[0033]
dist(bb,ts)=dist
avg
(bb,ts)||dist
max
(bb,ts)||dist
min
(bb,ts)
ꢀꢀꢀ
(4)
[0034]
式中,dist(bb,ts)表示基本块bb与污点源队列ts之间的距离。
[0035]
可选的,步骤3包括:
[0036]
步骤3-1:输入各基本块的距离,开始程序插桩;
[0037]
步骤3-2:判断基本块是否已遍历完毕,若已遍历完毕,跳转至步骤3-5;若没有遍历完毕,跳转至步骤3-3;
[0038]
步骤3-3:获取当前访问的基本块的距离,并将距离插入当前基本块中;
[0039]
步骤3-4:获取下一个要访问的基本块,然后跳转至步骤3-2;
[0040]
步骤3-5:输出已经插桩完毕的被测程序。
[0041]
可选的,步骤4包括:
[0042]
步骤4-1:设置初始状态,输入初始种子测试用例;
[0043]
步骤4-2:判断是否已经满足模糊测试停止条件,若已满足,跳转至步骤4-8;若未满足,跳转至步骤4-3;
[0044]
步骤4-3:选择种子测试用例,从种子测试用例队列中选择一个种子测试用例,将其作为父代以产生子代测试用例。
[0045]
步骤4-4:对种子适应度计算,种子测试用例需要根据其适应度为其分配相应的测试资源,种子测试用例s的适应度计算如公式(6)所示:
[0046][0047]
式中,s是种子测试用例,p
fuzz
(s)是afl等传统模糊测试工具评价s的适应度,ξ(s)是s的执行路径,是s的执行路径中各基本块距离的倒数之和,|ξ(s)|表示s执行路径中基本块的个数;
[0048]
步骤4-5:子代测试用例生成。根据步骤4-4中得到的适应度,为种子分配相应的测试资源,从而生成子代测试用例s';
[0049]
步骤4-6:测试用例执行,将步骤4-5中生成的子代测试用例s'发送至已插桩的被测程序中,并监视测试用例的运行情况;
[0050]
步骤4-7:反馈结果分析,分析子代测试用例s'在被测程序中的运行结果,根据运行结果决定将子代测试用例保留或者丢弃,分析结束后,跳转至步骤4-2。
[0051]
步骤4-8:模糊测试已经满足指定的停止条件,停止模糊测试。
[0052]
经由上述的技术方案可知,与现有技术相比,本发明公开提供了一种面向持续集成过程的模糊测试方法,具有以下有益效果:
[0053]
1、能有效地利用测试资源,针对持续集成项目中的变更点进行模糊测试,以提升将模糊测试应用于持续集成的效率;
[0054]
2、通过对被测项目进行数据流分析,并将变更点作为污点源,进行污点分析,计算各基本块与污点源之间的距离,以有效地引导模糊测试自动生成大量测试用例以针对持续集成产生的变更点进行测试。
[0055]
3、可以有效地减少持续集成过程中人工构建大量测试用例所产生的开销,以降低开发和维护成本。
附图说明
[0056]
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
[0057]
图1为本发明的技术路线图;
[0058]
图2为本发明的持续集成差异分析流程图;
[0059]
图3为本发明的数据流分析流程图;
[0060]
图4为本发明的程序插桩流程图;
[0061]
图5为本发明的持续集成信息制导的模糊测试流程图。
具体实施方式
[0062]
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0063]
在持续集成过程中,每天可能会进行多次集成。每次集成都会进行自动化构建与测试,以尽可能快地检测到集成错误。为了充分测试持续集成过程中产生的变更点,在测试开始前需要手动构建大量测试用例,这会产生多余的人力开销,增加维护与开发的成本。因此,针对持续集成过程中产生的变更点自动生成测试用例,进而对变更点进行充分测试,显得尤为必要。
[0064]
本发明实施例公开了一种面向持续集成的模糊测试方法,如图1所示,包括:
[0065]
步骤1:在应用持续集成的项目中,对相邻的两次提交进行差异分析,获取两者的差异信息,并根据差异信息获取变更点,存入变更点集合。
[0066]
步骤2:在构建项目的过程中,根据变更点信息进行数据流分析,获取数据流分析结果。
[0067]
步骤3:利用数据流分析结果进行程序插桩,获得已插桩的被测程序。
[0068]
步骤4:对被测项目进行模糊测试,在测试过程中计算种子测试用例的适应度,并根据适应度为其分配相应的测试资源。
[0069]
如图2所示,步骤1包括:
[0070]
步骤1-1:起始状态,输入被测项目p;
[0071]
步骤1-2:对被测项目p中相邻的两次提交进行差异分析,获得变更点集合c={c1,c2,

,cn};
[0072]
步骤1-3:输出变更点集合c。
[0073]
如图3所示,步骤2包括:
[0074]
步骤2-1:起始状态,输入被测项目p;
[0075]
步骤2-2:判断被测项目p中的语句是否已经遍历完毕,若遍历完毕,跳转至步骤2-6;若没有遍历完毕,跳转至步骤2-3;
[0076]
步骤2-3:访问被测项目p中的下一条语句;
[0077]
步骤2-4:判断当前语句stat是否与变更点相关,若与变更点相关,则跳转至步骤2-5;若与变更点无关,则跳转至步骤2-3;
[0078]
步骤2-5:对当前语句stat进行定义-使用关系分析。如果stat对内存进行了读取,则认为stat对某一变量进行了“使用”操作;如果stat对内存进行了修改,则认为stat对某一变量进行了“定义”操作。对stat分析完毕后,跳转至步骤2-2。
[0079]
步骤2-6:输出被测项目p中所有与变更点相关的定义-使用关系信息d;
[0080]
步骤2-7:输入步骤1中获得的变更点集合c;
[0081]
步骤2-8:计算各基本块与污点源之间的距离。将变更点集合c中的每个变更点作为污点源,并结合步骤2-6中获得的定义-使用关系信息d进行污点分析,获取各基本块中变量受污染的情况,如果一个基本块中的变量受到了污染,则认为该基本块受到了污染;如果一个基本块中的变量没有受到污染,则认为该基本块没有受到污染。计算各基本块距离的具体步骤如下所示:
[0082]
首先,获取每个污点源所在的基本块,并存入队列ts={ts1,ts2,...,tsn},其中,tsi表示第i个污点源所在基本块。
[0083]
然后,计算每个基本块与污点源之间的距离,公式如下:
[0084][0085]
式中,bb表示待计算距离的基本块,tsi表示第i个污点源所在基本块,shortest(bb,tsi)表示基本块与污点源所在基本块tsi之间的最短距离。如果bb被tsi污染了,则计算bb与tsi之间的最短距离并加1(避免距离为0),作为bb与tsi之间的距离d(bb,tsi),如果该基本块没有被tsi污染,则默认bb与tsi之间的距离d(bb,tsi)为无穷大。
[0086]
然后,根据基本块与每个污点源所在基本块之间的距离,计算该基本块的最终距离,有三种策略,如公式(1)-(4)所示:
[0087][0088]
dist
max
(bb,ts)=max(d(bb,tsi)),1≤i≤n&d(bb,ti)<∞
ꢀꢀꢀ
(2)
[0089]
dist
min
(bb,ts)=min(d(bb,tsi)),1≤i≤n
ꢀꢀꢀꢀꢀꢀꢀꢀꢀ
(3)
[0090]
dist(bb,ts)=dist
avg
(bb,ts)||dist
max
(bb,ts)||dist
min
(bb,ts)(4)
[0091]
式中,dist(bb,ts)表示基本块bb与污点源队列ts之间的距离。对于计算基本块与污点源队列之间的距离,总共有三种策略:
[0092]
第一,对于策略(1),分母cnt表示基本块bb与所有污点源中,两者距离不是无穷大的污点源个数;分子表示基本块bb与所有污点源中,两者距离不是无穷大的距离总和。
[0093]
第二,对于策略(2),最终结果为基本块bb与所有污点源的距离中,两者距离的最大值且不为无穷大。如果基本块bb与所有污点源的距离均为无穷大,那么就认为dist(bb,ts)的值为无穷大。
[0094]
第三,对于策略(3),最终结果为基本块bb与所有污点源的距离中,两者距离的最小值。
[0095]
如图4所示,步骤3包括:
[0096]
步骤3-1:输入各基本块的距离,开始程序插桩;
[0097]
步骤3-2:判断基本块是否已遍历完毕,若已遍历完毕,跳转至步骤3-5;若没有遍历完毕,跳转至步骤3-3;
[0098]
步骤3-3:获取当前访问的基本块的距离,并将距离插入当前基本块中;
[0099]
步骤3-4:获取下一个要访问的基本块,然后跳转至步骤3-2;
[0100]
步骤3-5:输出已经插桩完毕的被测程序。
[0101]
如图5所示,步骤4包括:
[0102]
步骤4-1:初始状态,输入初始种子测试用例;
[0103]
步骤4-2:判断是否已经满足模糊测试停止条件,若已满足,跳转至步骤4-8;若未满足,跳转至步骤4-3;
[0104]
步骤4-3:选择种子测试用例。从种子测试用例队列中选择一个种子测试用例,将其作为父代以产生子代测试用例。
[0105]
步骤4-4:种子适应度计算。种子测试用例需要根据其适应度为其分配相应的测试资源,种子测试用例s的适应度计算如公式(6)所示:
[0106][0107]
式中,s是种子测试用例,p
fuzz
(s)是afl等传统模糊测试工具评价s的适应度,ξ(s)是s的执行路径,是s的执行路径中各基本块距离的倒数之和,|ξ(s)|表示s执行路径中基本块的个数。
[0108]
步骤4-5:子代测试用例生成。根据步骤4-4中得到的适应度,为种子分配相应的测试资源,从而生成子代测试用例s'。
[0109]
步骤4-6:测试用例执行。将步骤4-5中生成的子代测试用例s'发送至已插桩的被测程序中,并监视测试用例的运行情况。
[0110]
步骤4-7:反馈结果分析。分析子代测试用例s'在被测程序中的运行结果,以决定将该子代测试用例保留或者丢弃。分析结束后,跳转至步骤4-2。
[0111]
步骤4-8:模糊测试已经满足指定的停止条件,停止模糊测试。
[0112]
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
[0113]
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。
对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
再多了解一些

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

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

相关文献