CN102141958B - 面向缺陷的路径覆盖测试数据进化生成方法 - Google Patents

面向缺陷的路径覆盖测试数据进化生成方法 Download PDF

Info

Publication number
CN102141958B
CN102141958B CN201110061538.XA CN201110061538A CN102141958B CN 102141958 B CN102141958 B CN 102141958B CN 201110061538 A CN201110061538 A CN 201110061538A CN 102141958 B CN102141958 B CN 102141958B
Authority
CN
China
Prior art keywords
defect
test data
path
variable
defects
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN201110061538.XA
Other languages
English (en)
Other versions
CN102141958A (zh
Inventor
巩敦卫
张岩
姚香娟
吴川
罗永金
田甜
任丽娜
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
China University of Mining and Technology CUMT
Original Assignee
China University of Mining and Technology CUMT
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by China University of Mining and Technology CUMT filed Critical China University of Mining and Technology CUMT
Priority to CN201110061538.XA priority Critical patent/CN102141958B/zh
Publication of CN102141958A publication Critical patent/CN102141958A/zh
Application granted granted Critical
Publication of CN102141958B publication Critical patent/CN102141958B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明公布了一种面向缺陷的路径覆盖测试数据进化生成方法,目的是使生成的测试数据更多地暴露目标路径中的缺陷,从而有效提高测试数据的质量。首先,以测试数据执行被测程序过程中发现的缺陷个数最多、缺陷的危险程度最大为目标,以测试数据必须穿越目标路径为约束,建立面向缺陷的路径覆盖测试数据生成问题的数学模型;然后,设计了解决该问题的约束多目标优化方法,使用遗传算法进化生成穿越目标路径同时能有效暴露缺陷的测试数据。本发明提出的方法解决了以往方法生成测试数据只是穿越目标路径,不能很好暴露目标路径中缺陷,尤其是一些小概率缺陷的问题;可用于白盒测试或回归测试的测试数据生成中,能大大提高软件测试的效力。

Description

面向缺陷的路径覆盖测试数据进化生成方法
技术领域
本发明涉及计算机软件测试领域,设计了一种为指定的程序路径自动生成测试数据的新方法。该方法区别于原有方法的特色在于,生成的测试数据能有效暴露被测程序中的缺陷。
背景技术
软件测试是保障软件质量的重要手段,分为静态测试和动态测试,都是为了发现程序代码中可能存在的缺陷,但是前者不执行程序代码,而后者则基于测试数据运行程序代码,测试数据的生成是该类测试的关键。软件自动测试的核心是在短时间内不通过大量的采样,生成有效的测试数据,以发现软件存在的缺陷,如何自动生成软件的测试数据成为软件工程界非常重要的研究课题。
按照生成测试数据所依据的信息来源,动态测试又分为黑盒测试、白盒测试,以及二者融合的测试,其中,黑盒测试面向软件的功能,而白盒测试面向程序的结构。路径覆盖测试属于白盒测试,它要求产生的测试数据尽可能覆盖程序的所有路径。单锦辉等认为,许多软件测试问题都可以归结为路径覆盖测试的数据生成问题,该问题描述为:给定程序的一条目标路径,在程序的输入空间中寻找测试数据,使得以该数据为输入,所经过的路径为目标路径,并在中国专利说明书CN1402133(2003年3月12日公布)公开的发明专利中给出了一种路径覆盖测试数据的自动生成方法。该方法能保证生成测试数据穿越目标路径,但是并不能保证生成的测试数据发现被测程序中的缺陷。
在路径覆盖的软件测试中,一个缺陷(故障)能否被检测出,除了取决于测试数据外,还与该缺陷被检测出的概率大小密切相关。宫云战等认为对于软件中的所有缺陷而言,通常以缺陷检测的百分比衡量软件测试的效率。容易知道,一般的路径覆盖测试方法难以检测出小概率缺陷,鉴于此,宫云战等提出了面向故障的软件测试方法;研究了软件缺陷相关问题;给出了内存泄露静态检测模型、JAVA语言中数组越界的故障模型和非法计算故障的通用检测模型,建立了基于软件缺陷模型的测试系统。该方法属于缺陷的静态查找方法,往往会错报或(和)漏报一些缺陷。近年来,关于软件缺陷的研究成果很多,缺陷查找除了静态方法以外,还有动态方法,如王青等研究和讨论了软件缺陷预测技术,对典型的软件缺陷的分布模型给出了案例研究;Arcuri提出将被测程序和单元测试联合进化,达到自动修复程序中的缺陷的目的;Novark等设计了一个能自动高效纠正C和C++中内存错误的系统;刘海等根据软件缺陷管理的一般目标和过程,提出软件缺陷数据定义的准则和缺陷管理工具应具有的特性,并举例说明了缺陷数据定义的方法。总体看来,动态方法虽然能比较准确的检测缺陷,但是,基于程序的实际运行使得该方法的缺陷检测时间变长。
软件测试的主要目的是发现被测程序中存在的缺陷。缺陷的表现形式很多,有些缺陷直接导致程序不能正常运行或是可以被编译系统发现,这类缺陷也同样容易被软件开发人员发现从而得到修正,因此投入测试的被测程序中一般不包含这类缺陷;有些缺陷隐含在被测程序中不能被编译系统检测出来,不影响程序的运行,只要测试数据穿越该缺陷所在的路径,就会被引发,从而导致程序运行结果不正确,因而也容易被测试数据发现;还有一类缺陷,不能被编译系统检测出来,而且不是穿越该缺陷所在路径的测试数据都能发现它,需要特殊的测试数据才能将其有效地检测出来,这类缺陷被称为小概率缺陷,因此生成能有效检测小概率缺陷的测试数据将对软件测试工作具有巨大的意义。已有的路径覆盖测试数据生成方法虽然能生成穿越目标路径的测试数据,但是未必能发现被测程序隐含在目标路径中的缺陷,尤其是小概率缺陷。考虑到生成路径覆盖的测试数据需要插装并运行被测程序,本发明在被测程序中也插装关于各类故障的检测函数,那么,生成测试数据覆盖目标路径的同时,也检测该数据能否发现目标路径中的缺陷,在穿越目标路径的数据中选择暴露缺陷个数多、危险程度大的作为最终测试数据,使生成测试数据的质量大大提高。
发明内容
本发明提出一种面向缺陷的路径覆盖测试数据进化生成方法。首先,以测试数据执行被测程序过程中发现的缺陷个数最多、缺陷的危险程度最大为目标,以该数据穿越的路径必须是目标路径为约束,建立面向缺陷的路径覆盖测试数据生成问题的数学模型;然后,设计了约束多目标优化方法解决该问题,用遗传算法进化生成测试数据。
本发明所要解决的技术问题:克服现有路径覆盖测试数据生成方法的不足,基于遗传算法提出一种有效的进化优化方法,使生成的测试数据不仅穿越目标路径,而且能尽可能多地发现目标路径中的缺陷。
本发明的技术解决方案:一种基于遗传算法的面向缺陷的路径覆盖测试数据生成方法,其特征在于包含以下步骤:
步骤1.数学模型的建立
以测试数据为程序输入执行被测程序时发现的缺陷个数最多、缺陷的危险程度最大作为优化目标,以测试数据穿越路径与目标路径的层接近度为1(即为目标路径)作为约束,建立面向缺陷的路径覆盖测试数据生成问题的数学模型如下:
max f 1 ( x ) = Σ i = 1 | p ( x ) | γ i
s . t . α ( x ) | p 0 | = 1
其中x为由被测程序的输入构成的决策变量,p(x)为以决策变量x为输入数据运行被测程序时穿越的路径,|p(x)|表示路径p(x)的节点个数,ri表示运行x时穿越路径的的第i个节点上发现的缺陷个数,f1(x)表示统计以决策变量x为输入执行被测程序时发现的缺陷个数总和;ηij表示在第i各节点的第j个缺陷的危险程度,∨表示取大运算,f2(x)表示统计决策变量x发现被测程序中的缺陷的最大危险程度;α(x)表示x穿越路径与目标路径p0比较从前向后相同节点的个数,约束条件表示要求决策变量穿越路径就是目标路径。
此模型将路径覆盖测试数据生成问题转化为一个多目标约束优化问题。即优化的目的是要在穿越目标路径的情况下选择发现缺陷多的,危险程度大的最优解作为最终的测试数据。
可以看出,虽然目前已有的一些路径覆盖测试数据生成方法也将测试数据生成问题建模成(含有约束的)多目标优化问题,但是,它们没有将缺陷,特别是缺陷的个数或(和)缺陷的危险程度作为目标函数,因此,对于“检测缺陷”这一目的来讲,它们的目的性不强。本发明建立的含约束多目标优化问题的数学模型,将缺陷个数、缺陷的危险程度作为目标函数,就是为了生成能检测缺陷的测试数据,因此,本文的数学模型目的性更强,这是本发明与已有研究成果的明显区别。
步骤2.优化方法设计
本发明采用遗传算法求解上述的约束多目标优化问题。在遗传算法中,为了比较不同进化个体的优劣,需要设计一个能反映个体优劣的适应值函数。一般来讲,进化个体的适应值与要优化的目标函数密切相关,对于上述含有约束的多目标优化问题,本发明采用将约束多目标优化问题转化为约束单目标优化问题。对每一个目标采用Gen等人提出的自适应权重方法先将每个目标进行适当的调整后,仍记调整后的目标函数为f1(x)和f2(x),再进行加权求和计算得到优化的目标函数。将约束转化成惩罚项ψ(x)加入到目标函数中。具体表示如下:
F(x)=w1f1(x)+w2f2(x)+w3ψ(x)
其中w1,w2和w3分别是归一化后的目标函数,ψ(x)是约束转化成的罚函数。
步骤3.使用遗传算法进化生成测试数据
本发明采用步骤2所述的进化优化方法,借助遗传算法进化生成测试数据,具体步骤如下:首先,在程序的输入空间随机生成一定数量的输入数据,对其分别进行编码成为进化个体作为初始种群,然后循环执行以下操作:将解码后的进化个体作为程序的输入,执行插桩后的被测试程序;如果没达到终止条件则通过适应度函数评价进化个体的优劣,并采用遗传算子生成新的进化种群。如此反复,解码后的最优解就可能是穿越目标路径的测试数据。
本发明解决的是面向缺陷的路径覆盖测试数据生成问题,在生成路径覆盖的测试数据的同时,直接查找程序中的缺陷,针对性强。评价数据时一次运行程序代码既确定了该数据穿越的路径,又判断和统计了该数据能发现的缺陷个数和缺陷危险程度,综合考虑两方面因素生成的测试数据效率更高,从根本上解决了原有路径覆盖测试数据生成方法能保证生成穿越目标路径的测试数据,但是较难发现路径中隐藏的缺陷的弱点。可用于白盒测试的测试数据生成中,也可以用于回归测试中生成能证明缺陷是否得到修正的测试数据,能有效提高测试数据的质量,从而提高软件测试的效力。
附图说明
图1是本发明的总流程图。
图2是遗传算法流程图。
图3是不含缺陷的示例程序。
图4是含有缺陷语句的示例程序。
图5是插装了缺陷检测语句的示例程序。
具体实施方式
下面结合具体附图和实例对本发明的实施方式进行详细说明。
步骤1.数学模型的建立
1.1决策变量
考虑某被测程序,由于不同的输入数据将穿越程序的不同路径,并可能检测该路径上的不同缺陷,因此,在建立面向缺陷的路径覆盖测试数据生成问题的数学模型时,选择被测程序的输入作为决策变量,记为x=(x1,x2,…,xn),其中,n为运行被测程序需要输入的数据个数,xi,i=1,2,…,n为输入数据的分量,可以是实数、整数,甚至是字符等,比如,在5个整数的冒泡排序程序中,n=5,xi,i=1,2,…,5为整数。
1.2约束函数
计算层接近度时路径的表示方法参考了Ahmed等人在2008年《Computers & OperationsResearch》第35期发表的文章“GA-based multiple paths test data generator”中的方法,但根据实际情况对其进行了简化。
如图3所示冒泡排序程序,当N=2时,若测试数据是{5,8},则穿越路径可以完整表示为:{①T①T①F②T③T④F③F②F}。若测试数据是{8,5},其穿越的路径可表示成{①T①T①F②T③T④T③F②F},可见,对于冒泡排序程序,当N固定后,所有的测试数据穿越路径节点顺序相同,且节点①、②、③的执行结果相同,只有节点④是不同的,所以可将路径简化成只包含节点④的判断结果,上述测试数据{5,8}穿越的路径可以简化表示成{F},而测试数据是{8,5}穿越的路径可以简化表示成{T}。又用“1”表示“T”,用“0”表示“F”,前述两个测试数据穿越的路径可以分别表示为{0}和{1}。
再如当N=3时,节点④被执行2+1=3次,若个体数据为{8,5,1},其穿越的路径可以简化表示成{111},代表3次执行节点④结果都是真。
标记目标路径为p0,有|p0|个节点,其中,|·|表示路径所含节点的个数。记决策变量x穿越的路径为p(x)。从p(x)的第一个节点开始,比较p(x)与p0的节点是否相同,并计算相同节点个数,记为α(x),那么,p(x)与p0的层接近度可以表示为如上所述,若N=3时目标路径表示为:{111},某测试数据穿越路径为:{110},则节点个数|p0|=3,两个路径相同节点数α(x)=2,则层接近度为:
由于目的是找到穿越目标路径并能检测到更多缺陷的测试数据,因此,本发明用测试数据穿越路径与目标路径的接近程度,即层接近度为1(即测试数据穿越路径与目标路径完全相同)作为约束,则约束条件为:
α ( x ) | p 0 | = 1
1.3与缺陷相关的目标函数
缺陷模式与编程语言相关,不同的编程语言会有完全不同的缺陷模式。宫云战等在2008年出版的《软件测试教程》中提到了C或C++编程语言的缺陷模式,本发明以其中的5种类型为例:
使用未初始化变量缺陷(Uninitialized Variable Fault,UVF):如果在程序的某一条路径上使用前面没有被赋初值的变量,那么,就存在使用未初始化变量缺陷。
数组越界缺陷(Out of Bounds Array Access Fault,OBAF):假设程序中定义了数组A[m],如果引用A[i],且i<0或者i≥m,那么,就存在数组越界缺陷。
空指针使用缺陷(Null Pointer Dereference Fault,NPDF):如果引用空指针,或者给空指针赋值,那么,就存在空指针使用缺陷。
非法计算缺陷(Illegal Computing Fault,ILCF):如果程序执行不允许的计算,那么,就存在非法计算缺陷。
数据溢出缺陷(Data Overflow Fault,DOF):如果有可能导致数据溢出的计算,那么,就存在数据溢出缺陷。
不同的缺陷对软件的影响程度(危害程度)不同,有的会导致程序运行错误,有的会终止程序运行。鉴于此,将不同缺陷对软件的危害程度分别用“高”、“低”等语言表示,并分别采用0.9、0.5等数值进行量化,不同缺陷的危险程度及其量化值如下表:
现在考虑被穿越的路径上检测出的缺陷。p(x)包含|p(x)|个节点,如果第i个节点的语句体中检测出γi个缺陷,其危险程度分别为ηi1,ηi2,…,那么,该节点的语句体中检测出的缺陷的最大危险程度为ηi1∨ηi2∨…这里,“∨”表示取大运算,这样一来,p(x)上检测出的缺陷个数为:
f 1 ( x ) = Σ i = 1 | p ( x ) | γ i
p(x)上检测出的缺陷的危险程度为:
由于生成测试数据的目标是查找穿越目标路径同时能检测到较多缺陷的测试数据,一个测试数据检测出的缺陷越多,并且检测出的缺陷的危险程度越高,该测试数据的质量就越高,面向缺陷的路径覆盖测试数据生成问题的数学模型可以表示为:
max f 1 ( x ) = Σ i = 1 | p ( x ) | γ i
s . t . α ( x ) | p 0 | = 1
步骤2.优化方法设计
2.1将多目标函数加权求和转化成单目标函数
考虑到缺陷个数和缺陷的危险程度之间是不矛盾的,因此,采用加权求和将这两个目标函数转化为一个目标函数,从而将约束多目标优化问题转化为约束单目标优化问题。由于不同的目标函数有不同的取值范围,为了在加权单目标函数中均衡不同目标的影响,本发明采用Gen等提出的自适应权重方法,对于每一个目标,基于当前种群的最大值和最小值进行适当的调整,使得调整后的目标函数的取值在[0,1)中。为此,考虑进化过程中的某一代种群,其第i个目标函数的最大值和最小值分别为个体x的第i个目标函数调整前后分别为fi(x)和fi′(x),则有:
f i ′ ( x ) = f i ( x ) - f i min f i max - f i min + ϵ , i=1,2        (2)
式中,ε是一个小的正数,保证式(2)的分母大于零。在不引起混淆的情况下,仍记调整后的第i个目标函数为fi(x)。
为了平衡两个目标函数的权重,设定它们的权重系数分别为w1和w2,这样一来,决策变量x的加权单目标函数为:
f(x)=w1f1(x)+w2f2(x)
w1和w2的值可以根据具体被测程序的情况确定。
2.2基于罚函数方法的约束函数处理
在含有约束的多目标进化优化中,通常采用一定的策略把约束函数表示在目标函数中,其中,最常采用的策略是罚函数,即决策变量对约束的满足程度通过惩罚项体现,本发明即采用该策略,记惩罚项为ψ(x),其表达式为:
ψ ( x ) = α ( x ) | p 0 | - 1
容易看出,如果被穿越的路径与目标路径相同,那么ψ(x)=0,在目标函数中不体现该惩罚项,不惩罚该测试数据;相反,如果被穿越的路径与目标路径不同,则ψ(x)<0,通过目标函数中的惩罚项惩罚该测试数据,而且测试数据穿越路径与目标路径差别越大,惩罚越严重。
本发明采用遗传算法求解式(1)描述的约束多目标优化问题。在遗传算法中,为了比较不同进化个体的优劣,需要设计一个能评价个体好坏的适应值函数。一般来讲,进化个体的适应值与要优化的目标函数密切相关,对于含有约束的优化问题,通常采用一定的方法,将约束包含在目标函数中,标记决策变量x对应的适应值为F(x),那么,F(x)可表示为:
F(x)=w1f1(x)+w2f2(x)+w3ψ(x)        (3)
其中w3为针对惩罚项的权重,需要根据具体被测程序事先确定。
步骤3.使用遗传算法进化生成测试数据
如图1所示,在生成测试数据之前需要对被测程序进行检测路径的插装和检测缺陷的插装。检测路径的插装采用常用的插装方法,下面介绍检测几种类型缺陷的插装方法。
3.1检测缺陷的插装方法
(1)使用未初始化变量缺陷(UVF)
程序中人为设定一个变量未初始化变量,除了出现在赋值表达式左边的变量,判断其他位置使用的变量是否与该变量相同,如果相同,则存在变量未初始化缺陷,如果不同则不存在,不同类型的各定义一个。
如对程序中的整型变量i和字符型变量c判断是否使用未初始化变量i和c,可在程序中插装如下代码:
在定义部分插装int uvfi;char uvfc;
在程序中出现i或c的地方分别插装如下语句进行判断:
if(i==uvfi){存在UVF,进行相应的处理};
if(c==uvfc){存在UVF,进行相应的处理};
(2)数组越界缺陷(OBAF)
首先,在需要判断数组越界的被测程序中,插装一个如下的带参数的宏定义:
#define OBAF(j,N)(j>=0&&j<N)?j:(c[k]++,(w=(w>0.5?w:0.5)),j)
其中j为要判断的数组下标,N为数组的上界,(c[k]++,(w=(w>0.5?w:0.5)),j)处理有越界的情况,k为分支节点的序号,c[k]标记发现缺陷的个数,w记录发现缺陷的最大危险程度,w=(w>0.5?w:0.5)对缺陷的危险程度w进行取大运算,因为越界的危险程度是0.5,如果当前缺陷的危险程度比0.5小,那么w=0.5;否则,w值不变;
然后在使用数组元素的语句处,例如原语句为printf(“%d”,a[i]);语句中有个对含有5个元素的数组a中元素的使用,为了检测该语句在运行中是否存在数组越界缺陷,做如下插装处理,带下划线为插装部分:
printf(“%d”,a[OBAF(i,5)]);
(3)空指针使用缺陷(NPDF)
通过与空指针常量的比较来判断此类缺陷。例如,假设p是一个指针变量,q是一个同类型的空指针,要检查p是否是一个空指针,可以采用插装如下语句来判断:
if(p=q){存在NPDF,进行相应的处理};
(4)非法计算缺陷(ILCF)
此类故障表现形式较多,如存在除运算或求余运算时除数为0都不能运行,在调试时可以直接发现,不需要我们考虑;但是对于对数自变量为0或负数,以及根号内为负数的故障系统内不报错,能运行,运算结果却为一个无效数字,即“-1.#IND00”,对其进行任何计算都是这个值;可以使用系统函数_isnan来判断,该函数的形式为:int_isnan(double x);当x是一个无效值时,返回非零值,否则返回0。
例如要判断一结果值a是否是无效值,插装
if(_isnan(a)!=0){存在ILCF,进行相应的处理};
(5)数据溢出缺陷(DOF)
C或C++语言中,短整型数据的范围是[-32768,32767],如果某个短整型变量超出这个范围,就会出现溢出现象,这种缺陷虽然程序能够运行,但是,运行结果却是严重错误的。根据溢出的运算具有不可逆的特点,对每个运算的结果进行逆运算,如果逆运算结果正确,说明没有数据溢出发生;否则,说明有数据溢出缺陷。例如,假设a、b、s均为短整型变量,a=32767,b=1,赋值语句为s=a+b。由于a+b超过32767,因此,出现数据溢出现象,系统将溢出结果-1赋给s,此时,s-b不等于a,因此,判断此类缺陷可以通过插装如下语句:
if(s-b!=a){存在DOF,进行相应的处理};
以数据溢出缺陷和数组越界缺陷为例,图4显示了含有这两类缺陷的被测程序,图5显示了检测这两类缺陷的插装实例。
3.2遗传参数的设置及终止运行条件
对于插装后的被测程序选择了目标路径后,本发明使用遗传算法进化生成测试数据。如图2所示,需要先设定遗传参数,以及算法终止运行条件。本发明采用轮盘赌方式选择,单点交叉,单点变异,交叉概率和变异概率分别为0.9和0.3,根据具体被测程序输入数据的类型选择实数编码或是二进制编码。
进化过程中如果生成了穿越目标路径的测试数据就结束算法的运行;另外,如果达到事先设定的一定运行代数还没有找到测试数据,则认为该路径可能为不可行路径,也结束算法的运行。
3.3遗传算法具体步骤
如图2所示,遗传算法的具体步骤描述如下:
(1)对算法所需的控制参数赋值,编码被测程序的语句,确定目标路径,插装被测程序;
(2)初始化种群;
(3)解码进化个体,执行插桩后的被测程序,根据式(3)计算进化个体适应值;
(4)判断是否满足算法终止条件,若满足,转(6);
(5)实施选择、交叉和变异等遗传操作,生成子代种群,转(3);
(6)终止算法运行,输出测试数据、穿越的路径以及检测到的缺陷。
本发明提出了一种面向缺陷的路径覆盖测试数据进化生成方法,该方法使用遗传算法生成能检测出指定类型缺陷的测试用例。

Claims (2)

1.面向缺陷的路径覆盖测试数据进化生成方法,其特征在于如下步骤:
步骤1.1:针对路径覆盖测试数据生成问题,建立了一个面向缺陷的含约束多目标优化数学模型,其特征在于以测试数据执行被测程序过程中发现的缺陷个数最多、缺陷的危险程度最大为目标,以该数据穿越的路径必须是目标路径为约束,建立面向缺陷的路径覆盖测试数据生成问题的数学模型如下:
max f 1 ( x ) = Σ i = 1 | p ( x ) | γ i
s . t . α ( x ) | p 0 | = 1
其中x为由被测程序的输入构成的决策变量,p(x)为以决策变量x为输入数据运行被测程序时穿越的路径,|p(x)|表示路径p(x)的节点个数,γi表示运行x时穿越路径的第i个节点上发现的缺陷个数,f1(x)和f2(x)分别统计以决策变量x为输入执行被测程序时发现缺陷的总个数和最大危险程度,ηij表示在第i个节点的第j个缺陷的危险程度,∨表示取大运算,α(x)表示x穿越路径与目标路径p0比较从前向后相同节点的个数,约束条件要求决策变量穿越路径就是目标路径;
步骤1.2:针对步骤1.1的数学模型设计了一种含约束的多目标进化优化的求解方法:分别将多个目标规范化处理后加权求和转化成单目标,再将约束转化成惩罚项,加入到该单目标中;
步骤1.2.1:由于每个目标取值范围差别很大,首先将其分别进行规范化处理:考虑进化过程中的某一代种群,其第i个目标函数的最大值和最小值分别为个体x的第i个目标函数调整前后分别为fi(x)和fi′(x),则有:
f i ′ ( x ) = f i ( x ) - f i min f i max - f i min + ϵ , i = 1,2
式中,ε是一个小的正数,保证上式的分母大于零;
步骤1.2.2:将步骤1.2.1中规范化后的多目标加权求和转化成单目标,在不引起混淆的情况下,仍记调整后的第i个目标函数为fi(x),为了平衡两个目标函数的权重,设定它们的权重系数分别为ω1和ω2,决策变量x的加权单目标函数f(x)为:
f(x)=ω1f1(x)+ω2f2(x);
步骤1.2.3:将约束转化成惩罚函数,记为ψ(x),即决策变量对约束的满足程度通过惩罚函数来体现,其表达式为:
ψ ( x ) = α ( x ) | p 0 | - 1 ,
标记决策变量x对应的适应值为F(x),那么,F(x)可表示为:
F(x)=ω1f1(x)+ω2f2(x)+ω3ψ(x),
其中ω3为针对惩罚函数的权重,需要根据具体被测程序事先确定;
步骤1.3:使用遗传算法实现上述方法,进化生成能够有效暴露被测程序中指定类型缺陷的测试数据,并针对C以及C++语言给出了5种类型缺陷的查找与认定的插装方法以及它们的危险程度表示方法:
(1)变量未初始化缺陷UVF
在程序的说明部分为每一个未初始化的被检测变量设定一个相同类型的变量,将其赋值为与被检测变量相同,在程序中对被检测变量进行非赋值使用时,判断被检测变量的值是否与后设定变量的值相同,如果相同,则存在变量未初始化缺陷,如果不同则不存在,如对程序中的整型变量i和字符型变量c判断是否使用未初始化变量i和c,可在程序中插装如下代码:
在定义部分插装如下定义:
int uvfi=i;char uvfc=c;
在程序中出现i和c的地方插装如下语句进行判断:
if(i==uvfi){存在UVF,进行相应的处理};
if(c==uvfc){存在UVF,进行相应的处理};
(2)数组越界缺陷OBAF
首先,在需要判断数组越界的被测程序中,插装一个如下的带参数的宏定义:
#define OBAF(i,N)(i>=0&&i<N)?i:(c[k]++,(w=(w>0.5?w:0.5)),i)
其中i为要判断的数组下标,N为数组的上界,(c[k]++,(w=(w>0.5?w:0.5)),i)处理有越界的情况,k为分支节点的序号,c[k]标记发现缺陷的个数,w记录发现缺陷的最大危险程度,w=(w>0.5?w:0.5)对缺陷的危险程度w进行取大运算,因为越界的危险程度是0.5,如果当前缺陷的危险程度比0.5小,那么w=0.5;否则,w值不变;
然后在使用数组元素的语句处,例如原语句为printf(“%d”,a[i]);语句中有一个对含有5个元素的数组a中元素的使用,为了检测该语句在运行中是否存在数组越界缺陷,做如下插装处理,带下划线为插装部分:
printf(“%d”,a[OBAF(i,5)]);
(3)空指针引用缺陷NPDF
此类缺陷通过与另一个指针常量的比较来实现,例如,假设p是一个未初始化的基本整型指针变量,在程序说明部分变量p的定义之后,定义一个同类型的指针变量npdfp,并使得npdfp的初值与p相同,要检查p是否是一个空指针,可以采用插装如下语句来判断:
/*程序说明部分插装*/
int*npdfp=p;
……
/*程序执行部分变量p出现在非赋值处之前插装*/
if(p==npdfp){存在NPDF,进行相应的处理};
……
(4)非法运算缺陷ILCF
此类缺陷表现形式较多,如存在除数为0的故障不能运行;求余时除数为0也不能运行,在调试时可以直接发现;对数自变量为0或负数故障,系统内不报错,能运行,但是取对数结果为-1.#IND00,代表是一个无效数字,对其进行任何计算都是这个值;根号内为负数的故障,系统不报错,但是结果也为无效数字-1.#IND00,可以使用系统函数_isnan来判断,其基本形式为:int_isnan(double x);当x是一个无效值时,返回非零值,否则返回0,例如要判断一结果值a是否是无效值,插装如下语句来判断:
If(_isnan(a)!=0){存在ILCF,进行相应的处理};
(5)数据溢出缺陷DOF
根据溢出的运算具有不可逆的特点,对每个运算的结果进行逆运算,如果逆运算结果正确,说明没有数据溢出发生;否则,说明有数据溢出缺陷,例如,假设a、b、s均为短整型变量,若有赋值语句为s=a+b,则做如下插装处理,带下划线为插装部分:
s=a+b;
if(s-b!=a){c[k]++;w=(w>0.9?w:0.9)}
2.根据权利要求1中所述面向缺陷的路径覆盖测试数据进化生成方法中的缺陷危险程度表示法,其特征在于给出了各类缺陷的危险程度模糊值,具体表示如下表:
上表中给出了具体量化值以区分各类缺陷的危险程度。
CN201110061538.XA 2011-03-09 2011-03-09 面向缺陷的路径覆盖测试数据进化生成方法 Expired - Fee Related CN102141958B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201110061538.XA CN102141958B (zh) 2011-03-09 2011-03-09 面向缺陷的路径覆盖测试数据进化生成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201110061538.XA CN102141958B (zh) 2011-03-09 2011-03-09 面向缺陷的路径覆盖测试数据进化生成方法

Publications (2)

Publication Number Publication Date
CN102141958A CN102141958A (zh) 2011-08-03
CN102141958B true CN102141958B (zh) 2014-07-30

Family

ID=44409492

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201110061538.XA Expired - Fee Related CN102141958B (zh) 2011-03-09 2011-03-09 面向缺陷的路径覆盖测试数据进化生成方法

Country Status (1)

Country Link
CN (1) CN102141958B (zh)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102708047B (zh) * 2012-04-23 2014-12-10 福建师范大学 数据流测试用例生成方法
CN103885874B (zh) * 2012-12-20 2018-03-23 百度在线网络技术(北京)有限公司 一种用于确定程序文件所对应的测试数据的方法与设备
CN103605605B (zh) * 2013-11-21 2016-05-25 中国矿业大学 基于语句占优关系和两阶段遗传算法的高阶变异测试方法
CN103902457A (zh) * 2014-04-17 2014-07-02 中国矿业大学 基于协同进化的并行程序路径覆盖测试数据生成方法
CN103942147B (zh) * 2014-05-06 2017-04-05 南京大学 一种线性拟合函数驱动的测试数据自动生成方法
CN104199773B (zh) * 2014-09-03 2017-08-25 腾讯科技(深圳)有限公司 获取代码覆盖信息的方法及装置
CN104281522B (zh) * 2014-10-14 2017-09-05 中国矿业大学 基于语句覆盖和缺陷检测的多目标测试数据缩减方法
CN104731709B (zh) * 2015-03-31 2017-09-29 北京理工大学 一种基于jcudasa_bp算法的软件缺陷预测方法
CN105718368A (zh) * 2016-01-15 2016-06-29 西安邮电大学 一种软件测试数据扩增方法
CN105893165B (zh) * 2016-03-29 2020-01-14 杭州和利时自动化有限公司 一种指令cache的故障诊断方法及系统
CN109376075B (zh) * 2018-09-19 2022-04-22 奇安信科技集团股份有限公司 一种生成测试对象最优测试覆盖路径的处理方法及装置
CN109947652A (zh) * 2019-03-26 2019-06-28 中山大学 一种软件缺陷预测的改进排序学习方法
CN110147325B (zh) * 2019-05-22 2023-04-07 电信科学技术第十研究所有限公司 一种基于自动化测试的数据生成方法及装置
CN111736846B (zh) * 2020-06-15 2021-06-22 南京航空航天大学 一种面向动态分析的源代码插桩改进方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1908893A (zh) * 2005-08-01 2007-02-07 王彤 程序逻辑结构图示方法及程序路径统计方法
CN1908892A (zh) * 2005-08-01 2007-02-07 王彤 测试用例设计方法和系统
CN101216803A (zh) * 2008-01-09 2008-07-09 四川大学 基于基路径的测试程序控制流路径集生成方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1908893A (zh) * 2005-08-01 2007-02-07 王彤 程序逻辑结构图示方法及程序路径统计方法
CN1908892A (zh) * 2005-08-01 2007-02-07 王彤 测试用例设计方法和系统
CN101216803A (zh) * 2008-01-09 2008-07-09 四川大学 基于基路径的测试程序控制流路径集生成方法

Also Published As

Publication number Publication date
CN102141958A (zh) 2011-08-03

Similar Documents

Publication Publication Date Title
CN102141958B (zh) 面向缺陷的路径覆盖测试数据进化生成方法
Harman The relationship between search based software engineering and predictive modeling
EP4075281A1 (en) Ann-based program test method and test system, and application
Bouchachia An immune genetic algorithm for software test data generation
CN107832219A (zh) 基于静态分析和神经网络的软件故障预测技术的构建方法
Mohammadi et al. Machine learning assisted stochastic unit commitment during hurricanes with predictable line outages
CN108563555B (zh) 基于四目标优化的故障更改代码预测方法
CN110377511B (zh) 一种面向数据流的测试用例生成方法
Le Thi My Hanh et al. Mutation-based test data generation for simulink models using genetic algorithm and simulated annealing
CN104281522B (zh) 基于语句覆盖和缺陷检测的多目标测试数据缩减方法
CN111695754A (zh) 一种电力物联网信息安全风险评估方法和装置
CN110111606A (zh) 一种基于eemd-iaga-bp神经网络的船舶交通流预测方法
Clarke Improving SLEUTH calibration with a genetic algorithm
Pruyt et al. A bright future for system dynamics: From art to computational science and beyond
Arasteh et al. Traxtor: an automatic software test suit generation method inspired by imperialist competitive optimization algorithms
CN105930272A (zh) 基于重要语句的分支覆盖测试数据生成方法
McMinn Evolutionary search for test data in the presence of state behaviour
Wang et al. An empirical classification-based framework for the safety criticality assessment of energy production systems, in presence of inconsistent data
Bezerra et al. Predicting software defects: A cost-sensitive approach
Xu et al. Application of genetic algorithms in software testing
Ptitsyna et al. A neural network approach to overcoming a priori uncertainty in optimal action planning of intelligent information agents for soft architectures of service-oriented systems
Compton Simulating expertise
CN111026661B (zh) 一种软件易用性全面测试方法及系统
CN113642226A (zh) 基于多目标进化算法的公平机器学习模型的训练方法
Saheed et al. Genetic algorithm technique in program path coverage for improving software testing

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20140730

Termination date: 20160309

CF01 Termination of patent right due to non-payment of annual fee