CN115328803A - 一种映射关系制导的循环代码模糊测试方法 - Google Patents
一种映射关系制导的循环代码模糊测试方法 Download PDFInfo
- Publication number
- CN115328803A CN115328803A CN202211068715.1A CN202211068715A CN115328803A CN 115328803 A CN115328803 A CN 115328803A CN 202211068715 A CN202211068715 A CN 202211068715A CN 115328803 A CN115328803 A CN 115328803A
- Authority
- CN
- China
- Prior art keywords
- test
- test case
- cases
- neuron
- executing
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3676—Test management for coverage analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
- G06N3/084—Backpropagation, e.g. using gradient descent
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Biomedical Technology (AREA)
- Evolutionary Computation (AREA)
- Artificial Intelligence (AREA)
- Health & Medical Sciences (AREA)
- Biophysics (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Life Sciences & Earth Sciences (AREA)
- General Health & Medical Sciences (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Mathematical Physics (AREA)
- Software Systems (AREA)
- Feedback Control In General (AREA)
Abstract
本发明公开了一种映射关系制导的循环代码模糊测试方法,应用于软件测试领域,包括:将测试用例不断变异,输入到测试用例队列,发送至经插桩循环代码结构得到的被测程序运行,当满足模糊测试终止条件时输出覆盖情况统计表;训练深度学习模型并反向计算权重距离和,构建并输出测试用例的字节序列与循环代码结构覆盖情况之间的映射关系;基于映射关系,对与循环代码结构覆盖情况对应的测试用例中的相应字节序列分配变异概率并进行变异,生成子代测试用例,并将其作为被测程序的输入,进行模糊测试,直到满足模糊测试终止条件,输出模糊测试报告。本方法基于映射关系对测试用例字节序列进行变异,能够针对性地生成提高循环代码结果覆盖率的测试用例。
Description
技术领域
本发明涉及软件测试领域,特别涉及一种映射关系制导的循环代码模糊测试方法。
背景技术
工业软件随着自身的演化与迭代,导致软件规模不断扩大,软件中存在的缺陷也随之增多。软件缺陷是在软件编码实现过程中引入的错误,这些软件缺陷可能会导致软件非正常运行,甚至造成经济损失或危及生命安全。
软件测试是能够减少软件缺陷的有效手段,根据是否运行被测软件可分为静态分析和动态测试两种类型。静态分析指分析代码的控制流、数据流等信息判断是否存在软件缺陷。动态分析指运行被测程序,并观察运行情况和运行结果判断是否存在软件缺陷。
模糊测试是动态分析中的一种,模糊测试的主要思想是产生大量有效或部分有效的输入作为测试用例,发送给被测程序使其执行,通过监控被测软件的执行情况,收集测试对象(如函数、基本块、循环代码或其他代码结构等)的覆盖情况,发现如程序崩溃、违反断言等现象,从而判断是否存在软件缺陷。
模糊测试技术的核心在于测试用例的质量,高质量的测试用例能够覆盖更多的软件代码,从而更全面地对软件代码进行分析和测试。现有的模糊测试技术中,AFL等覆盖率制导的模糊测试工具使用遗传算法作为测试用例的保留策略,将能够覆盖到更多代码的测试用例保留,然后使用字节级操作(如位反转等)对被保留的测试用例进行变异,从而生成能够提高代码覆盖率的测试用例。
然而,AFL等覆盖制导的模糊测试工具没有充分利用程序中的控制流等语义信息,盲目地生成测试输入,可能会产生大量无效测试用例,导致测试效率较低,并且该类方法难以有针对性地对代码进行覆盖和分析,不能有效地检测软件代码中含有的软件缺陷。AFLGo等目标制导的模糊测试工具将特定基本块作为目标,通过保留与目标基本块距离较近的种子从而生成能够接近目标基本块的测试用例,但检测效率较低,并且无法确定基本块的覆盖情况与测试用例之间的关联关系。
循环代码结构是软件基本结构之一,能够重复执行循环体内的语句直到满足循环终止条件。相较于其他基本结构,循环代码结构中出现缺陷所引发的影响更大,且由于循环次数无法确定、循环体内部语句的执行间接影响循环终止条件等问题,现有的模糊测试方法难以有针对性地对循环代码结构进行充分测试。
为此,如何提供一种能够根据循环代码结构的覆盖情况对测试用例进行针对性变异,从而提高测试准确性以及测试效率的映射关系制导的循环代码模糊测试方法是本领域技术人员亟需解决的问题。
发明内容
有鉴于此,本发明提出了一种映射关系制导的循环代码模糊测试方法。本方法通过输入测试用例,运行经过插桩循环代码结构的被测程序,判断测试用例是否满足模糊测试终止条件,若满足,则输出覆盖情况统计表;若不满足,则对测试用例进行变异,生成子代测试用例,以满足模糊测试终止条件;基于输出的覆盖情况统计表,训练深度学习模型并反向计算权重距离和,构建并输出测试用例的字节序列与循环代码结构覆盖情况之间的映射关系;基于映射关系,对与循环代码结构覆盖情况对应的测试用例中的相应字节序列进行针对性变异,生成下一子代测试用例;将下一子代测试用例作为被测程序的输入,进行模糊测试,直到满足模糊测试终止条件,输出模糊测试报告。本发明基于映射关系对测试用例字节序列进行变异,能够更有针对性地生成高质量的测试用例,不仅提高了测试用例对循环代码结构的覆盖次数,对被测项目中的循环代码结构进行了更充分地测试,提高了测试准确性,还因减少了盲目地生成测试用例输入,避免了大量无效测试用例,提高了测试效率。
为了实现上述目的,本发明采用如下技术方案:
一种映射关系制导的循环代码模糊测试方法,包括:
S1:输入被测项目,插桩循环代码结构,编译并输出被测程序;
S2:输入初始测试用例并进行变异,将变异后的测试用例加入到测试用例队列,发送到被测程序运行,判断测试用例队列是否满足模糊测试终止条件,若满足,则输出覆盖情况统计表;若不满足,则对测试用例队列中的测试用例进行变异,生成子代测试用例,以满足模糊测试终止条件;
S3:输入覆盖情况统计表,训练深度学习模型并反向计算权重距离和,构建并输出测试用例的字节序列与循环代码结构覆盖情况之间的映射关系;
S4:基于映射关系,对与循环代码结构覆盖情况对应的测试用例中的相应字节序列进行变异,生成子代测试用例;
S5:将S4子代测试用例作为S2被测程序的输入,进行模糊测试,直到满足模糊测试终止条件,输出模糊测试报告。
可选的,S1具体为:
S1-1:输入被测项目;
S1-2:读取并遍历被测项目的测试对象序列,判断该测试对象Objecti是否为循环代码结构,若是,则执行步骤S1-3;否则执行步骤S1-4;
S1-3:对测试对象Objecti执行插桩,插桩完成后执行步骤S1-4;
S1-4:判断测试对象序列是否全部遍历,若全部遍历则执行S1-5,否则执行S1-2;
S1-5:将插桩后的被测项目编译为被测程序;
S1-6:输出被测程序。
可选的,S2具体为:
S2-1:输入初始测试用例和被测程序,将初始测试用例加入到测试用例队列中;
S2-2:判断是否满足模糊测试终止条件,若尚未满足终止条件则执行步骤S2-3,否则执行S2-13;
S2-3:将测试用例队列中的测试用例进行变异,将生成的子代测试用例加入到测试用例队列中;
S2-4:从测试用例队列中依次读取队列中的子代测试用例,将子代测试用例发送至被测程序,作为被测程序的输入,直到测试用例队列为空;
S2-5:运行被测程序并收集每条子代测试用例的覆盖情况;
S2-6:遍历子代测试用例,若子代测试用例尚未被完全遍历则执行S2-7,否则执行S2-2;
S2-7:读取测试用例队列Te中的第i个子代测试用例ti,以及子代测试用例ti对应的覆盖情况;
S2-8:判断子代测试用例ti是否触发崩溃,若触发崩溃则执行步骤S2-10,否则执行S2-9;
S2-9:判断子代测试用例ti是否覆盖到更多循环代码结构,若覆盖到更多循环代码则执行S2-11,否则执行S2-5;
S2-10:将子代测试用例ti保存到本地;
S2-11:将子代测试用例ti加入到测试用例队列;
S2-12:将子代测试用例以及对应的覆盖情况保存到覆盖情况统计表中;执行S2-6;
S2-13:输出覆盖情况统计表。
可选的,S3具体为:
S3-1:输入由测试用例集Te=(t1,t2,…,tn)T和测试用例的覆盖情况集S=(s1,s2,…,sn)T组成的覆盖情况统计表;
其中,n为测试用例数量,Te中的元素为测试用例,S中的元素为测试用例的覆盖情况;
S3-2:将测试用例集Te和测试用例的覆盖情况集S转化为深度学习模型可以识别的训练数据;
ti为第i个测试用例,将测试用例集Te=(t1,t2,…,tn)T中的测试用例ti进行二进制转化,选择前k个二进制字节作为测试用例ti的二进制字节序列,ti=(xi,1,xi,2,…,xi,k);得到测试用例ti的特征矩阵Mfeature:
其中,k由使用者决定,为将测试用例转化为二进制字节,所选择的字节数量;
si则为测试用例ti作为被测程序的输入时各个循环代码结构的覆盖情况,si=(yi,1,yi,2,…,yi,m),其中,m为被测项目中循环代码结构的数量;基于si,可得到测试用例ti作为被测程序的输入时各个循环代码结构的覆盖情况的的标签矩阵Mlabel;
其中,yi,j为测试用例ti作为输入时第j个循环代码结构Objectj的覆盖情况;
S3-3:基于特征矩阵Mfeature和标签矩阵Mlabel训练深度学习模型;模型的训练数据由n对二元组构成,第i对二元组为特征矩阵和标签矩阵中的第i行,分别作为特征向量和标签向量,其中1≤i≤n;深度学习模型采用全连接神经网络模型;
S3-4:对训练好的深度神经网络模型N进行反向计算,N的输入层X由k个神经元组成,X=(x1,x2,…,xk),其中,k为特征的数量,为选取的测试用例字节序列长度;N的输出层Y由m个神经元组成组成,Y=(y1,y2,…,ym),其中,m为标签的数量,为循环代码结构的数量;
对于输出层的每一个神经元yj以及输入层的每一个神经元xi,可通过公式(4)计算yj与每一个xi之间的权重距离和;
公式(4)中的Ui,j为输出层神经元yj与输入层神经元xi之间的权重距离和;p为xi与yj之间的神经元连接路径的数量,对于全连接神经网络,p可通过公式(5)计算;
其中,d表示深度神经网络N中隐藏层的层数;SizeOfLayer(index)表示第index层隐藏层的神经元数量,将各隐藏层的神经元数量累乘,可得到从输入层神经元xi到输出层神经元yj之间连接路径的数量;
公式(4)中的为输入层神经元xi与输出层神经元yj之间的第l条神经元路径所构成的权重坐标,每个坐标即为神经元路径中的每一个权重,由输入层到输出层的顺序依次将权重值作为坐标轴上的数值,构建为权重坐标,权重坐标的具体形式可通过公式(6)计算;
其中,xi和yj分别为任意输入层和输出层的神经元,ξl(s)为第l条神经元连接路径中的第s个神经元,即xi、o1:h、o2:u、od:k和yj,d为深度神经网络模型中的隐藏层层数,为神经元ok:h与下一层神经元ok+1:u之间的权重值;将权重值按照由输入层到输出层的顺序排列,可得到一组表示xi到yj之间神经元路径的权重坐标;权重坐标中的第s个坐标值使用表示,其中0≤s≤d;
S3-5:基于公式(4)得到的权重距离和构建测试用例的字节序列与循环代码结构覆盖情况之间的映射关系M;
其中,Ui,j表示输出层神经元yj与输入层神经元xi之间的权重距离和,k为输入层的神经元数量,也是选取的测试用例字节序列长度,m表示输出层的神经元数量,也是循环代码结构的数量;
S3-6:输出映射关系M。
可选的,S4具体为:
S4-1:输入覆盖情况统计表;
S4-2:根据适应度函数计算种子测试用例的适应度;
S4-3:输入测试用例的字节序列与循环代码结构覆盖情况之间的映射关系M;
S4-4:结合映射关系M中权重距离和,分配测试用例的字节序列的变异概率并选择变异位置;
S4-5:根据变异位置变异测试用例,生成子代测试用例;
S4-6:输出子代测试用例。
经由上述的技术方案可知,与现有技术相比,本方法通过输入测试用例,运行经过插桩循环代码结构的被测程序,判断测试用例是否满足模糊测试终止条件,若满足,则输出覆盖情况统计表;若不满足,则对测试用例进行变异,生成子代测试用例,以满足模糊测试终止条件;基于输出的覆盖情况统计表,训练深度学习模型并反向计算权重距离和,构建并输出测试用例的字节序列与循环代码结构覆盖情况之间的映射关系;基于映射关系,对与循环代码结构覆盖情况对应的测试用例中的相应字节序列进行针对性变异,生成下一子代测试用例;将下一子代测试用例作为被测程序的输入,进行模糊测试,直到满足模糊测试终止条件,输出模糊测试报告。本发明基于映射关系对测试用例字节序列进行变异,能够更有针对性地生成高质量的测试用例,不仅提高了测试用例对循环代码结构的覆盖次数,对被测项目中的循环代码结构进行了更充分地测试,提高了测试准确性,还因减少了盲目地生成测试用例输入,避免了大量无效测试用例,提高了测试效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明的流程示意图。
图2为本发明的S1流程示意图。
图3为本发明的S2流程示意图。
图4为本发明的S3流程示意图。
图5为本发明的S4流程示意图。
图6为本发明的S3中的全连接神经网络结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例公开了一种映射关系制导的循环代码模糊测试方法,包括:
S1:输入被测项目,插桩循环代码结构,编译并输出被测程序,如图2所示,具体为:
S1-1:输入被测项目,如能够进行编译的被测项目源代码文件等。
S1-2:读取并遍历被测项目的测试对象序列,测试对象序列由函数、基本块、循环代码等代码结构组成。判断测试对象Objecti是否为循环代码结构,若是则执行步骤S1-3;否则执行步骤S1-4。
S1-3:对测试对象Objecti执行插桩,即在测试对象中***部分指令,这些指令能够在保证被测程序原有逻辑完整性完整的基础上,收集被测程序的执行信息。插桩完成后执行步骤S1-4,判断测试对象是否全部遍历。
S1-4:判断测试对象序列是否全部遍历,若全部遍历则执行S1-5,否则执行S1-2。
S1-5:将插桩后的被测项目编译为被测程序。
S1-6:输出被测程序。
S2:输入初始测试用例和被测程序,将初始测试用例加入到测试用例队列中,判断测试用例队列是否满足模糊测试终止条件,若满足,则输出覆盖情况统计表;若不满足,则对测试用例队列中的测试用例进行变异,生成子代测试用例发送给被测程序运行,以满足模糊测试终止条件,如图3所示,具体为:
S2-1:输入初始测试用例和被测程序,将初始测试用例加入到测试用例队列中。其中,测试用例由用户输入,被测程序由S1-5得到。
S2-2:判断是否满足模糊测试终止条件(如测试达到预定的时间,或测试达到预定的指标等),若尚未满足终止条件则执行步骤S2-3,否则执行S2-13。
S2-3:将测试用例队列中的测试用例进行变异,生成子代测试用例。
S2-4:将子代测试用例发送至被测程序,作为被测程序的输入。
S2-5:运行被测程序并收集每条子代测试用例的覆盖情况。其中,覆盖情况指被测程序中***桩的循环代码结构的执行情况,即子代测试用例是否覆盖***桩的循环代码。
S2-6:遍历子代测试用例,若子代测试用例尚未被完全遍历则执行S2-7,否则执行S2-2。
S2-7:读取子代测试用例队列Te中的第i个子代测试用例ti,以及子代测试用例ti对应的覆盖情况。其中,覆盖情况即子代测试用例ti覆盖各个循环代码的情况。
S2-8:判断子代测试用例ti是否触发崩溃,若触发崩溃则执行步骤S2-10,否则执行S2-9。
S2-9:判断子代测试用例ti是否覆盖到更多循环代码结构,若覆盖到更多循环代码结构则执行S2-11,否则执行S2-5。
S2-10:将子代测试用例ti保存到本地。其中,子代测试用例ti即触发被测程序缺陷的测试用例。
S2-11:将子代测试用例ti加入到测试用例队列。
S2-12:将子代测试用例以及对应的覆盖情况保存到覆盖情况统计表中;执行S2-6。
S2-13:输出覆盖情况统计表。
S3:输入覆盖情况统计表,训练深度学习模型并反向计算权重距离和,构建并输出测试用例的字节序列与循环代码结构覆盖情况之间的映射关系,如图4所示,具体为:
S3-1:输入由测试用例集Te=(t1,t2,…,tn)T和测试用例的覆盖情况集S=(s1,s2,…,sn)T组成的覆盖情况统计表。
其中,n为测试用例数量,Te中的元素为测试用例,S中的元素为测试用例的覆盖情况。
S3-2:将测试用例集Te和测试用例的覆盖情况集S转化为深度学习模型可以识别的训练数据。
ti为第i个测试用例,将测试用例集Te=(t1,t2,…,tn)T中的测试用例ti进行二进制转化,由于各测试用例二进制字节序列的长度不同,而训练深度学习模型所需的特征向量长度需要保持一致,所以选择前k个二进制字节作为测试用例ti的二进制字节序列,ti=(xi,1,xi,2,…,xi,k);其中k由使用者决定,k越大,模型越能学习到更准确的测试用例字节序列与覆盖情况之间的关联关系,但模型训练的时间越长。当ti的二进制字节序列长度小于k时,在原二进制字节序列后补0,使长度达到k。将测试用例集Te中的测试用例全部转换为二进制字节序列后,可得到测试用例ti的特征矩阵Mfeature。
si则为测试用例ti作为被测程序的输入时各个循环代码结构的覆盖情况,si=(yi,1,yi,2,…,yi,m),其中,m为***桩的循环代码结构数量;基于si,可得到测试用例ti作为被测程序的输入时各个循环代码结构的覆盖情况的的标签矩阵Mlabel。
其中,yi,j为测试用例ti作为输入时第j个循环代码结构Objectj的覆盖情况。
S3-3:基于特征矩阵Mfeature和标签矩阵Mlabel训练深度学习模型;模型的训练数据由n对二元组构成,第i对二元组为特征矩阵和标签矩阵中的第i行,分别作为特征向量和标签向量,其中1≤i≤n;深度学习模型采用全连接神经网络模型如图6所示,全连接神经网络的结构可由使用者指定。
S3-4:对训练好的深度神经网络模型N进行反向计算,反向计算指从全连接神经网络中的输出层神经元出发,反向遍历所有与输出层神经元相连接的神经元,直到遍历到输入层,记录每两个神经元之间的权重,组成权重坐标并计算权重之间的距离,将距离的累加和作为输入层与输出层之间权重的差异值。由反向计算所得出的差异值越大,说明相较于其他输入层神经元,该输入层神经元的取值对输入层的结果影响越大。
反向计算的具体计算过程如下,对于已经训练完成的深度神经网络N,N的输入层X由k个神经元组成,X=(x1,x2,…,xk),其中,k为特征的数量,为选取的测试用例字节序列长度;N的输出层Y由m个神经元组成组成,Y=(y1,y2,…,ym),其中,m为标签的数量,为循环代码结构的数量。
对于输出层的每一个神经元yj以及输入层的每一个神经元xi,可通过公式(4)计算yj与每一个xi之间的权重距离和。
公式(4)中的Ui,j为输出层神经元yj与输入层神经元xi之间的权重距离和;p为xi与yj之间的神经元连接路径的数量,对于全连接神经网络,p可通过公式(5)计算。
其中,d表示深度神经网络N中隐藏层的层数,如:单隐藏层神经网络模型中的d=1。SizeOfLayer(index)表示第index层隐藏层的神经元数量,将各隐藏层的神经元数量累乘,可得到从输入层神经元xi到输出层神经元yj之间连接路径的数量,如图6所示的单隐藏层神经网络模型结构,输入层神经元xi到输出层神经元yj之间存在3条神经元连接路径,即ξ1=(x1,o1:1,y1),ξ2=(x1,o1:2,y1),ξ3=(x1,o1:3,y1),其中,ok:m为第k层隐藏层中的第m个神经元,ξh为第h条神经元连接路径,为了便于后续描述,神经元路径ξh中的第s个神经元使用ξh(s)表示,其中1≤s≤(d+2)。
公式(4)中的为输入层神经元xi与输出层神经元yj之间的第l条神经元路径所构成的权重坐标,每个坐标即为神经元路径中的每一个权重,由输入层到输出层的顺序依次将权重值作为坐标轴上的数值,构建为权重坐标,权重坐标的具体形式可通过公式(6)计算。
其中,xi和yj分别为任意输入层和输出层的神经元,ξl(s)为第l条神经元连接路径中的第s个神经元,即xi、o1:h、o2:u、od:k和yj,d为深度神经网络模型中的隐藏层层数,为神经元ok:h与下一层神经元ok+1:u之间的权重值;将权重值按照由输入层到输出层的顺序排列,可得到一组表示xi到yj之间神经元路径的权重坐标;权重坐标中的第s个坐标值使用表示,其中0≤s≤d。
S3-5:基于公式(4)得到的权重距离和构建测试用例的字节序列与循环代码结构覆盖情况之间的映射关系M。
其中,Ui,j表示输出层神经元yj与输入层神经元xi之间的权重距离和,k为输入层的神经元数量,也是选取的测试用例字节序列长度,m表示输出层的神经元数量,也是循环代码结构的数量。
S3-6:输出映射关系M。
S4:基于映射关系M,对与循环代码结构覆盖情况对应的测试用例中的相应字节序列进行变异,生成子代测试用例,具体为:
S4-1:输入覆盖情况统计表。
S4-2:根据适应度函数计算种子测试用例的适应度。其中,适应度函数指根据种子测试用例的质量调整测试资源的函数,适应度越高的种子能生成更多的子代,越低则生成的子代越少。可使用传统模糊测试工具中的适应度函数,如AFL等覆盖制导的适应度函数、AFLGo等目标制导的适应度函数等。
S4-3:输入测试用例的字节序列与循环代码结构覆盖情况之间的映射关系M,其中,映射关系M由S3-6得到。
S4-4:结合映射关系M中权重距离和,分配测试用例的字节序列的变异概率并选择变异位置。映射关系M中权重距离和Uji越大,则输入层神经元xi对输出层yj的影响越大,即测试用例序列的第i个位置的字节对循环代码结构Objectj覆盖情况的影响越大。因此在变异阶段,对测试用例字节序列的第i个位置的字节变异应分配较大的变异概率。分配变异概率后,在零至变异概率累加和之间内随机选取一个值作为变异概率阈值,遍历每一个字节序列位置,并累加该字节序列位置对应的权重距离和作为累加概率,若累加概率大于变异概率阈值,则选取该字节序列位置作为变异位置。
S4-5:根据变异位置变异测试用例,生成子代测试用例。
S4-6:输出子代测试用例。
S5:将子代测试用例作为S2被测程序的输入,进行模糊测试,直到达到模糊测试终止条件(如测试达到预定的时间,或测试达到预定的指标等),输出模糊测试报告。模糊测试报告中包括生成的测试用例、程序覆盖情况以及软件缺陷的触发情况等,可供使用者查看、分析或复现缺陷。
本发明实施例公开了一种映射关系制导的循环代码模糊测试方法。本方法通过输入测试用例,运行插桩循环代码结构的被测程序,判断测试用例队列是否满足模糊测试终止条件,若满足,则输出覆盖情况统计表;若不满足,则对测试用例队列中的测试用例进行变异,生成子代测试用例,以满足模糊测试终止条件;基于输出的覆盖情况统计表,训练深度学习模型并反向计算权重距离和,构建并输出测试用例的字节序列与循环代码结构覆盖情况之间的映射关系;基于映射关系,对与循环代码结构覆盖情况对应的测试用例中的相应字节序列进行针对性变异,生成子代测试用例;将子代测试用例作为被测程序的输入,进行模糊测试,直到满足模糊测试终止条件,输出模糊测试报告。本发明基于映射关系对测试用例字节序列进行变异,能够更有针对性地生成高质量的测试用例,不仅提高了测试用例对循环代码结构的覆盖次数,提高了测试准确性,还因减少了盲目地生成测试用例输入,避免了大量无效测试用例,提高了测试效率。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (5)
1.一种映射关系制导的循环代码模糊测试方法,其特征在于,包括:
S1:输入被测项目,插桩循环代码结构,编译并输出被测程序;
S2:输入初始测试用例并进行变异,将变异后的测试用例加入到测试用例队列,发送到所述被测程序运行,判断所述测试用例队列是否满足模糊测试终止条件,若满足,则输出覆盖情况统计表;若不满足,则对所述测试用例队列中的测试用例进行变异,生成子代测试用例,以满足所述模糊测试终止条件;
S3:输入所述覆盖情况统计表,训练深度学习模型并反向计算权重距离和,构建并输出所述测试用例的字节序列与循环代码结构覆盖情况之间的映射关系;
S4:基于所述映射关系,对与所述循环代码结构覆盖情况对应的所述测试用例中的相应字节序列进行变异,生成子代测试用例;
S5:将S4所述子代测试用例作为所述S2被测程序的输入,进行模糊测试,直到满足所述模糊测试终止条件,输出模糊测试报告。
2.根据权利要求1所述的一种映射关系制导的循环代码模糊测试方法,其特征在于,S1具体为:
S1-1:输入所述被测项目;
S1-2:读取并遍历所述被测项目的测试对象序列,判断该测试对象Objecti是否为循环代码结构,若是,则执行步骤S1-3;否则执行步骤S1-4;
S1-3:对所述测试对象Objecti执行插桩,插桩完成后执行步骤S1-4;
S1-4:判断测试对象序列是否全部遍历,若全部遍历则执行S1-5,否则执行S1-2;
S1-5:将插桩后的被测项目编译为被测程序;
S1-6:输出所述被测程序。
3.根据权利要求1所述的一种映射关系制导的循环代码模糊测试方法,其特征在于,S2具体为:
S2-1:输入所述初始测试用例和所述被测程序,将初始测试用例加入到测试用例队列中;
S2-2:判断是否满足所述模糊测试终止条件,若尚未满足所述终止条件则执行步骤S2-3,否则执行S2-13;
S2-3:将所述测试用例队列中的测试用例进行变异,将生成的子代测试用例加入到测试用例队列中;
S2-4:从所述测试用例队列中依次读取队列中的子代测试用例,将子代测试用例发送至所述被测程序,作为所述被测程序的输入,直到所述测试用例队列为空;
S2-5:运行所述被测程序并收集每条所述子代测试用例的覆盖情况;
S2-6:遍历所述子代测试用例,若所述子代测试用例尚未被完全遍历则执行S2-7,否则执行S2-2;
S2-7:读取所述测试用例队列Te中的第i个子代测试用例ti,以及所述子代测试用例ti对应的覆盖情况;
S2-8:判断所述子代测试用例ti是否触发崩溃,若触发崩溃则执行步骤S2-10,否则执行S2-9;
S2-9:判断所述子代测试用例ti是否覆盖到更多循环代码结构,若覆盖到更多循环代码则执行S2-11,否则执行S2-5;
S2-10:将所述子代测试用例ti保存到本地;
S2-11:将所述子代测试用例ti加入到测试用例队列;
S2-12:将所述子代测试用例以及对应的覆盖情况保存到覆盖情况统计表中;执行S2-6;
S2-13:输出覆盖情况统计表。
4.根据权利要求1所述的一种映射关系制导的循环代码模糊测试方法,其特征在于,S3具体为:
S3-1:输入由测试用例集Te=(t1,t2,…,tn)T和测试用例的覆盖情况集S=(s1,s2,…,sn)T组成的所述覆盖情况统计表;
其中,n为所述测试用例数量,Te中的元素为所述测试用例,S中的元素为所述测试用例的覆盖情况;
S3-2:将所述测试用例集Te和所述测试用例的覆盖情况集S转化为深度学习模型可以识别的训练数据;
ti为第i个测试用例,将所述测试用例集Te=(t1,t2,…,tn)T中的测试用例ti进行二进制转化,选择前k个二进制字节作为所述测试用例ti的二进制字节序列,ti=(xi,1,xi,2,…,xi,k);得到所述测试用例ti的特征矩阵Mfeature:
其中,k由使用者决定,为将所述测试用例转化为二进制字节,所选择的字节数量;
si则为所述测试用例ti作为被测程序的输入时各个循环代码结构的覆盖情况,si=(yi,1,yi,2,…,yi,m),其中,m为被测项目中循环代码结构的数量;基于所述si,可得到所述测试用例ti作为被测程序的输入时各个循环代码结构的覆盖情况的的标签矩阵Mlabel;
其中,yi,j为测试用例ti作为输入时第j个循环代码结构Objectj的覆盖情况;
S3-3:基于所述特征矩阵Mfeature和所述标签矩阵Mlabel训练深度学习模型;模型的训练数据由n对二元组构成,第i对二元组为特征矩阵和标签矩阵中的第i行,分别作为特征向量和标签向量,其中1≤i≤n;深度学习模型采用全连接神经网络模型;
S3-4:对训练好的深度神经网络模型N进行反向计算,N的输入层X由k个神经元组成,X=(x1,x2,…,xk),其中,k为特征的数量,为选取的所述测试用例字节序列长度;N的输出层Y由m个神经元组成组成,Y=(y1,y2,…,ym),其中,m为标签的数量,为循环代码结构的数量;
对于输出层的每一个神经元yj以及输入层的每一个神经元xi,可通过公式(4)计算yj与每一个xi之间的权重距离和;
公式(4)中的Ui,j为输出层神经元yj与输入层神经元xi之间的权重距离和;p为xi与yj之间的神经元连接路径的数量,对于全连接神经网络,p可通过公式(5)计算;
其中,d表示深度神经网络N中隐藏层的层数;SizeOfLayer(index)表示第index层隐藏层的神经元数量,将各隐藏层的神经元数量累乘,可得到从输入层神经元xi到输出层神经元yj之间连接路径的数量;
公式(4)中的为输入层神经元xi与输出层神经元yj之间的第l条神经元路径所构成的权重坐标,每个坐标即为神经元路径中的每一个权重,由输入层到输出层的顺序依次将权重值作为坐标轴上的数值,构建为权重坐标,权重坐标的具体形式可通过公式(6)计算;
其中,xi和yj分别为任意输入层和输出层的神经元,ξl(s)为第l条神经元连接路径中的第s个神经元,即xi、o1:h、o2:u、od:k和yj,d为深度神经网络模型中的隐藏层层数,为神经元ok:h与下一层神经元ok+1:u之间的权重值;将权重值按照由输入层到输出层的顺序排列,可得到一组表示xi到yj之间神经元路径的权重坐标;权重坐标中的第s个坐标值使用表示,其中0≤s≤d;
S3-5:基于公式(4)得到的所述权重距离和构建所述测试用例的字节序列与循环代码结构覆盖情况之间的映射关系M;
其中,Ui,j表示输出层神经元yj与输入层神经元xi之间的权重距离和,k为输入层的神经元数量,也是选取的所述测试用例字节序列长度,m表示输出层的神经元数量,也是循环代码结构的数量;
S3-6:输出所述映射关系M。
5.根据权利要求1所述的一种映射关系制导的循环代码模糊测试方法,其特征在于,S4具体为:
S4-1:输入所述覆盖情况统计表;
S4-2:根据适应度函数计算种子测试用例的适应度;
S4-3:输入所述测试用例的字节序列与循环代码结构覆盖情况之间的映射关系M;
S4-4:结合所述映射关系M中权重距离和,分配所述测试用例的字节序列的变异概率并选择变异位置;
S4-5:根据所述变异位置变异所述测试用例,生成所述子代测试用例;
S4-6:输出所述子代测试用例。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211068715.1A CN115328803A (zh) | 2022-09-02 | 2022-09-02 | 一种映射关系制导的循环代码模糊测试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211068715.1A CN115328803A (zh) | 2022-09-02 | 2022-09-02 | 一种映射关系制导的循环代码模糊测试方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115328803A true CN115328803A (zh) | 2022-11-11 |
Family
ID=83930811
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211068715.1A Pending CN115328803A (zh) | 2022-09-02 | 2022-09-02 | 一种映射关系制导的循环代码模糊测试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115328803A (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116166538A (zh) * | 2022-12-28 | 2023-05-26 | 山东大学 | 一种跨版本预测变异测试方法及*** |
CN116541280A (zh) * | 2023-05-06 | 2023-08-04 | 中国电子技术标准化研究院 | 一种基于神经网络的模糊测试用例生成方法 |
CN117033248A (zh) * | 2023-10-08 | 2023-11-10 | 中国海洋大学 | 一种基于程序状态反馈和控制流图的Web模糊测试方法 |
-
2022
- 2022-09-02 CN CN202211068715.1A patent/CN115328803A/zh active Pending
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116166538A (zh) * | 2022-12-28 | 2023-05-26 | 山东大学 | 一种跨版本预测变异测试方法及*** |
CN116166538B (zh) * | 2022-12-28 | 2023-08-22 | 山东大学 | 一种跨版本预测变异测试方法及*** |
CN116541280A (zh) * | 2023-05-06 | 2023-08-04 | 中国电子技术标准化研究院 | 一种基于神经网络的模糊测试用例生成方法 |
CN116541280B (zh) * | 2023-05-06 | 2023-12-26 | 中国电子技术标准化研究院 | 一种基于神经网络的模糊测试用例生成方法 |
CN117033248A (zh) * | 2023-10-08 | 2023-11-10 | 中国海洋大学 | 一种基于程序状态反馈和控制流图的Web模糊测试方法 |
CN117033248B (zh) * | 2023-10-08 | 2024-01-26 | 中国海洋大学 | 一种基于程序状态反馈和控制流图的Web模糊测试方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN115328803A (zh) | 一种映射关系制导的循环代码模糊测试方法 | |
Hu et al. | Deepmutation++: A mutation testing framework for deep learning systems | |
McMinn et al. | Input domain reduction through irrelevant variable removal and its effect on local, global, and hybrid search-based structural test data generation | |
Harman et al. | A theoretical and empirical study of search-based testing: Local, global, and hybrid search | |
Yang et al. | Population-based incremental learning with associative memory for dynamic environments | |
Wegener et al. | Verifying timing constraints of real-time systems by means of evolutionary testing | |
Lefticaru et al. | Automatic state-based test generation using genetic algorithms | |
Jones et al. | A strategy for using genetic algorithms to automate branch and fault-based testing | |
CN110377511B (zh) | 一种面向数据流的测试用例生成方法 | |
Bouchachia | An immune genetic algorithm for software test data generation | |
Samarah et al. | Automated coverage directed test generation using a cell-based genetic algorithm | |
Tonella et al. | Finding the optimal balance between over and under approximation of models inferred from execution logs | |
Luo et al. | Graph-based fuzz testing for deep learning inference engines | |
CN105913125A (zh) | 异质信息网络元路径确定、链路预测方法及装置 | |
CN112364352A (zh) | 可解释性的软件漏洞检测与推荐方法及*** | |
Liu et al. | Genetic programming model for software quality classification | |
Yang et al. | Cognitive diagnosis-based personalized exercise group assembly via a multi-objective evolutionary algorithm | |
Gross et al. | Structural performance measure of evolutionary testing applied to worst-case timing of real-time systems | |
Snel et al. | Multi-task evolutionary shaping without pre-specified representations | |
Hong et al. | Improving performance insensitivity of large-scale multiobjective optimization via monte carlo tree search | |
McGraw et al. | Generating software test data by evolution | |
Ji et al. | Neural network based test case generation for data-flow oriented testing | |
Dutra et al. | Guidedsampler: coverage-guided sampling of SMT solutions | |
KR101775824B1 (ko) | 유전적 알고리즘을 이용한 확산제 역추적에서 최적 측정자 형성 방법 및 장치 | |
CN115328804A (zh) | 一种基于组合覆盖的循环代码模糊测试方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |