CN105302719A - 一种变异测试方法及装置 - Google Patents

一种变异测试方法及装置 Download PDF

Info

Publication number
CN105302719A
CN105302719A CN201510700704.4A CN201510700704A CN105302719A CN 105302719 A CN105302719 A CN 105302719A CN 201510700704 A CN201510700704 A CN 201510700704A CN 105302719 A CN105302719 A CN 105302719A
Authority
CN
China
Prior art keywords
program
variant
measured
code
variation
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.)
Granted
Application number
CN201510700704.4A
Other languages
English (en)
Other versions
CN105302719B (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.)
University of Science and Technology Beijing USTB
Original Assignee
University of Science and Technology Beijing USTB
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 University of Science and Technology Beijing USTB filed Critical University of Science and Technology Beijing USTB
Priority to CN201510700704.4A priority Critical patent/CN105302719B/zh
Publication of CN105302719A publication Critical patent/CN105302719A/zh
Application granted granted Critical
Publication of CN105302719B publication Critical patent/CN105302719B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明提供一种变异测试方法及装置,能够降低执行时间和开销,提高变异测试效率。所述方法包括:将待测程序源代码划分为不同的程序块;确定属于目标程序块的变异体;利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序。所述装置包括:程序块划分模块,用于将待测程序源代码划分为不同的程序块;变异体分布确定模块,用于确定属于目标程序块的变异体;变异程序合成模块,用于利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序。本发明适用于软件测试技术领域。

Description

一种变异测试方法及装置
技术领域
本发明涉及软件测试技术领域,特别是指一种变异测试方法及装置。
背景技术
软件测试的一个根本问题是如何通过较少的测试用例尽可能地检测出软件中潜藏的各种故障。软件测试的实践表明,要想找出程序中潜藏的所有故障几乎是不可能的(即完全充分性测试),目前,一种较为可行的办法是尽可能的缩小故障的搜索范围,以便于专门测试某类故障是否存在(相对充分性测试),为此人们提出了基于故障的软件测试。
变异测试是一种基于故障的软件测试技术,变异测试的基本思想是:测试人员首先根据待测程序的特征向待测程序代码中植入各种类型的故障,从而产生大量的错误程序,产生的一个错误程序称为待测程序的一个变异体,用来模仿某种故障的操作称为“变异算子”,变异算子一般在符合语法前提下仅对待测程序作微小改动。如果执行某个测试用例导致一个变异体与待测程序产生不同的结果,那么称该变异体被“杀死”,即与该变异体相关的故障能够被检测出来,反之称该变异体“存活”。若不存在任何测试用例,使在某一变异体与待测程序上的执行结果不同,则称该变异体为待测程序的一个等价变异体。针对给定的测试用例集,能够被“杀死”的变异体数量占所有产生的非等价变异体数量的百分比,称为该测试用例集的“变异得分”,变异得分可以定量的评估测试用例集的质量,变异得分越高,说明测试用例集杀死的变异体越多,其检测故障的能力越强。
变异测试又称为变异分析,其可行性基于“熟练程序员”假设(通过对待测程序作合乎语法的代码修改,可以模拟熟练程序员的实际编程行为)和“耦合效应”假设(若测试用例可以检测出简单缺陷,则该测试用例也易于检测出更为复杂的缺陷)。变异测试可用于衡量测试用例集的揭错能力,也可以通过植入错误来装置地模拟被测软件的各种真实缺陷,对已有测试用例集进行辅助评估。变异测试不仅成功应用于C、C#、Java、SQL等不同的编程语言中,开发出了Mothra、Proteum、MuJava、Muclipse等测试支持工具,并成功应用于测试规格说明书和程序模型上,主要应用于单元测试,当前在接口测试、面向对象软件的测试和合约测试等方面都有相关研究进展。研究结果表明,变异测试的故障检测能力强,与手工植入故障相比,自动生成的变异体模拟真实软件中的故障效果更佳,具有排错能力强、方便灵活等优点。
尽管如此,作为一种能够有效评估测试用例集质量的变异测试技术并没有广泛应用于工业界,其主要原因包括:变异测试生成的变异体数量庞大,使得分析过程中的计算开销较大、执行时间较长。如何降低变异测试的执行时间及执行开销,成为了变异测试技术必须解决的一个重要问题。
现有技术中,变异测试的研究工作侧重于精简变异体数量和变异体执行优化两个方面,其中,变异体数量精简优化方法主要包括:变异体选择法、变异算子选择法及高阶变异测试方法;变异体执行优化方法主要包括:变异体检测优化、变异体编译优化以及并行执行变异体。然而,变异体数目精简优化方法及变异体检测优化方法降低了构造的测试用例集的测试充分性、影响测试结果的准确性;编译优化方法很难适用于编译时间大于执行时间的变异测试过程;并行方法依赖于并行计算机结构,对基础设施的要求较高。
发明内容
为解决上述技术问题,本发明实施例提供一种变异测试方法,包括:
将待测程序源代码划分为不同的程序块;
确定属于目标程序块的变异体;
利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序。
进一步地,所述将待测程序源代码划分为不同的程序块包括:
对待测程序的结构进行分析,将待测程序源代码划分为不同的程序块,并生成各程序块的分块规则;
其中,所述分块规则,用于描述待测程序源代码的入口行数、出口行数与程序块号之间的关系。
进一步地,所述确定属于目标程序块的变异体包括:
将变异体与待测程序源代码进行比较,得到变异体中变异代码所在的行数,其中,所述变异代码为变异体中与待测程序源代码不同的代码;
根据生成的所述分块规则,获取代码行数与程序块号之间的对应关系,若所述变异代码所在的行数属于目标程序块的行数范围内,则确定所述变异体属于目标程序块。
进一步地,所述利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序包括:
S1,提取待测程序中位于目标程序块之前的代码;
S2,将待测程序处理为父进程,并创建出与父进程执行状态完全相同的子进程,在每个子进程下分别导入相应变异体中该目标程序块的代码,其中,创建的子进程的个数与属于该目标程序块的变异体个数相同;
S3,提取待测程序中该目标程序块代码及位于该目标程序块之后的代码,并将变异代码所在的程序块及其后续程序块处理为并发分支;
S4,将S1、S2、S3中的代码进行合成,得到变异程序。
进一步地,所述变异程序包括:待测程序与属于目标程序块的全部变异体的变异代码;
所述并发分支数与属于该目标程序块的变异体个数相同;
所述变异程序的个数与待测程序源代码的程序块个数相同。
进一步地,所述利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序之后还包括:
将待测的测试用例作为合成后的变异程序的输入,执行所述变异程序,输出结果并保存。
进一步地,所述将待测的测试用例作为合成后的变异程序的输入,执行所述变异程序,输出结果并保存之后还包括:
比较待测程序和变异体在执行相同测试用例后对应的输出结果是否相同,若不相同,则确定相应的变异体被检测出来。
进一步地,所述比较待测程序和变异体在执行相同测试用例后对应的输出结果是否相同,若不相同,则确定相应的变异体被检测出来之后还包括:
测试执行完毕后,统计被检测出的变异体数量及名称,未被检测出的变异体数量及名称,确定本次变异测试的变异得分及执行时间。
为解决上述技术问题,本发明实施例还提供一种变异测试装置,包括:
程序块划分模块,用于将待测程序源代码划分为不同的程序块;
变异体分布确定模块,用于确定属于目标程序块的变异体;
变异程序合成模块,用于利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序。
进一步地,所述变异程序合成模块包括:
第一提取单元,用于提取待测程序中位于目标程序块之前的代码;
进程创建单元,用于将待测程序处理为父进程,并创建出与父进程执行状态完全相同的子进程,在每个子进程下分别导入相应变异体中该目标程序块的代码,其中,创建的子进程的个数与属于该目标程序块的变异体个数相同;
第二提取单元,用于提取待测程序中该目标程序块代码及位于该目标程序块之后的代码,并将变异代码所在的程序块及其后续程序块处理为并发分支;
变异程序合成单元,用于将第一提取单元、进程创建单元、第二提取单元中的代码进行合成,得到变异程序。
本发明的上述技术方案的有益效果如下:
上述方案中,通过将待测程序源代码划分为不同的程序块;确定属于目标程序块的变异体;利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序。与现有技术相比,在执行合成后的变异程序时,能够有效减少变异测试过程中变异体编译和执行的计算开销及时间,从而提高变异测试效率,且不影响变异测试的故障检测能力,有助于变异测试在实践中的推广使用。
附图说明
图1为本发明实施例提供的变异测试方法的流程图一;
图2为本发明实施例提供的变异测试方法的流程图二;
图3为本发明实施例提供的传统的变异测试的执行方式;
图4为本发明实施例提供的合成变异程序后变异测试的执行方式;
图5为本发明实施例提供的变异测试装置的结构示意图。
具体实施方式
为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
本发明针对现有的变异测试执行时间长及执行开销大的问题,提供一种变异测试方法及装置。
实施例一
参看图1所示,本发明实施例提供的一种变异测试方法,包括:
S101,将待测程序源代码划分为不同的程序块;
S102,确定属于目标程序块的变异体;
S103,利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序。
本发明实施例所述的变异测试方法,通过将待测程序源代码划分为不同的程序块;确定属于目标程序块的变异体;利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序。与现有技术相比,在执行合成后的变异程序时,能够有效减少变异测试过程中变异体编译和执行的计算开销及时间,从而提高变异测试效率,且不影响变异测试的故障检测能力,有助于变异测试在实践中的推广使用。
本发明实施例中,通过所述变异测试方法,能够快速的进行变异测试,还可以根据所述变异测试方法开发相应的自动化测试工具,从而进一步提高变异测试的效率。
本发明实施例中,以switch-case结构为主的C语言程序为待测程序进行详细说明,所述待测程序P源代码如下:
在待测程序P中,switch语句是一个控制语句,switch语句可以包括任意数目的case实例,但是任何两个case语句都不能具有相同的值。如果没有任何case表达式与开关值匹配,则控制传递给default标签后的语句。如果没有default标签,则控制传递到switch以外。每一个case块作为该待测程序P的一个程序块。针对该待测程序P生成的变异体,传统的变异测试方法采用所有的测试用例运行所有的变异体,需要很长的时间进行变异测试和分析,且执行并不覆盖某个错误分支的测试用例后并不能检测出相应变异体,耗费大量时间在无效测试用例的执行上。
在前述变异测试方法的具体实施方式中,可选地,所述将待测程序源代码划分为不同的程序块包括:
对待测程序的结构进行分析,将待测程序源代码划分为不同的程序块,并生成各程序块的分块规则;
其中,所述分块规则,用于描述待测程序源代码的入口行数、出口行数与程序块号之间的关系。
本发明实施例中,程序块指代码序列中一组顺序执行的语句序列,只有一个入口和一个出口,而划分程序块的实质就是定义入口和出口语句。
本发明实施例中,首先,对该待测程序进行轻量级分析,将待测程序源代码划分为不同的程序块:待测程序P的输入为需要判断奇偶的一个整数,用a表示;输出信息根据输入数字的奇偶不同输出不同内容,输出消息由一串字符与改变后的a组成。通过分析该待测程序P的源代码,可以将该待测程序P源代码分为五个程序块:
程序块B1的入口语句为第5行的语句,出口语句为第7行的语句;
程序块B2的入口语句为第8行的语句,出口语句为第8行的语句;
程序块B3的入口语句为第10行的语句,出口语句为第13行的语句;
程序块B4的入口语句为第14行的语句,出口语句为第17行的语句。
程序块B5的入口语句为第19行的语句,出口语句为第20行的语句。
本发明实施例中,定义分块规则来描述待测程序源代码行数与程序块号之间的关系,因此,程序块B的分块规则可以分解为程序块B在待测程序源代码中的入口行数RI与出口行数RO构成的二元组,即BR={<RI,RO>},参看图2所示。
本发明实施例中,结合分块规则的定义和待测程序P的分块结果,得到待测程序P不同程序块的分块规则:
程序块B1分块规则:BR1={<5,7>};
程序块B2分块规则:BR2={<8,8>};
程序块B3分块规则:BR3={<10,13>};
程序块B4分块规则:BR4={<14,17>}。
程序块B5分块规则:BR5={<19,20>}。
本发明实施例中,运用上述分块规则,可以得到待测程序的分块规则文件,一个待测程序对应一个分块规则文件,所述分块规则文件则包含多条分块规则。
在前述变异测试方法的具体实施方式中,可选地,所述确定属于目标程序块的变异体包括:
将变异体与待测程序源代码进行比较,得到变异体中变异代码所在的行数,其中,所述变异代码为变异体中与待测程序源代码不同的代码;
根据生成的所述分块规则,获取代码行数与程序块号之间的对应关系,若所述变异代码所在的行数属于目标程序块的行数范围内,则确定所述变异体属于目标程序块。
本发明实施例中,假设待测程序P共生成5个变异体,变异体的变异体名称、变异代码、变异代码所在的行数如表1所示:
表1待测程序P对应的变异体信息
本发明实施例中,确定属于目标程序块的变异体的具体步骤包括:首先,将变异体与待测程序源代码进行比较,得到变异体中变异代码(所述变异代码为变异体中与待测程序源代码不同的代码)所在的行数Rd,其次遍历分块规则文件中的分块规则,判定Rd是否属于一分块规则BRi定义的程序块范围,若不属于,则继续对比下条分块规则;若属于,则该变异体属于程序块Bi。最后,可以将通过上述步骤确定的属于同一程序块的变异体存储于同一独立文件夹下。
本发明实施例中,以待测程序P为例,按照上述方法,确定变异体M1所属的程序块,M1的变异代码所在的行数为11,根据分块规则文件中的分块规则,得到M1的变异代码所在的行数11处于程序块B3的行数范围内,所述确定变异体M1属于程序块B3,按照该方法,确定变异体M2,变异体M3,变异体M4,变异体M5所属的程序块。
本发明实施例中,与待测程序源代码相比,不同变异体中变异代码所在的行数属于同一程序块时,则所述不同变异体属于同一程序块,从而确定所有变异体的分布情况。具体的,程序块Bi的分块规则为BRi={<Ri,I,Ri,O>},与待测程序源代码相比,变异体{M1,M2,…,Mk}的变异代码所在行数Rd∈[Ri,I,Ri,O],则称这k个变异体属于程序块Bi,即与程序块Bi相关的变异体有k个{Mi,1,Mi,2,…,Mi,k}。
本发明实施例中,针对所有非等价变异体,按照上述方法可以对所有变异体进行分组,以待测程序P为例,分组后得到变异体{M1,M2,M3}属于程序块B3、变异体{M4}属于程序块B4、变异体{M5}属于程序块B5
一个程序块中通常含有一定数量的变异体,对于所属同一程序块的变异体执行相同的测试用例,在执行到变异代码之前,其程序的状态与待测程序完全一致,若一个程序块含有k个变异体,则执行了k+1次相同的操作,如图3所示。本发明实施例提供的基于并发机制的变异测试方法的基本思想,考虑缩减从程序入口到变异代码所在程序块之间代码段的执行次数来提高变异测试效率。
本发明实施例中,变异体分组后,为了缩减从程序入口到变异代码所在程序块之间代码段的执行次数,需要解决“程序状态传递”以及“不同变异体执行不同代码”两个关键问题。本发明实施例中,将fork机制引入到目标程序块之前,创建出与父进程几乎相同的子进程来解决程序运行时状态专递的问题;并使用二元数组<fpid,count>控制进程的创建,其中,fpid用来区分父、子进程;count用来控制创建进程的个数并标识子进程,不同子进程下插入与该进程号对应的变异体程序使得不同子进程执行不同的变异体程序,解决不同变异体执行不同程序代码的问题。
进一步地,所述利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序包括:
S1,提取待测程序中位于目标程序块之前的代码;
S2,将待测程序处理为父进程,并创建出与父进程执行状态完全相同的子进程,在每个子进程下分别导入相应变异体中该目标程序块的代码,其中,创建的子进程的个数与属于该目标程序块的变异体个数相同;
S3,提取待测程序中该目标程序代码及位于该目标程序块之后的代码,并将变异代码所在的程序块及其后续程序块处理为并发分支;
S4,将S1、S2、S3中的代码进行合成,得到变异程序。
进一步地,所述变异程序包括:待测程序与属于目标程序块的全部变异体的变异代码;
所述并发分支数与属于该目标程序块的变异体个数相同;
所述变异程序的个数与待测程序源代码的程序块个数相同。
本发明实施例中,采用并发机制将待测程序的所有程序块以及与属于目标程序块的变异体合成变异程序。所述并发机制由Linux内核提供的fork函数实现,调用一次fork函数并成功后,变成两类进程,调用fork函数的进程为父进程,父进程会创建出与其程序执行状态完全相同的子进程。该函数具有两个返回值:在父进程中,fork()返回新创建子进程的进程ID;在子进程中,fork()返回0,利用其返回值的不同,可使父子进程执行不同的操作,即执行一次程序,将得到父子进程的两类输出。
本发明实施例中,如图4所示,有k个属于程序块Bi的变异体{Mi,1,Mi, 2,…,Mi,k},采用并发机制将待测程序的所有程序块以及与属于程序块Bi的变异体合成变异程序的具体方法是:(1)提取待测程序中位于该程序块前的代码{B1,…,Bi-1};(2)插入fork函数,使用<fpid,count>二元组创建出k个子进程,每个子进程下分别导入相应变异体中该程序块Bi的代码;(3)提取待测程序中目标程序块Bi的代码及位于该程序块的后续代码{Bi+1,…,Bn},并将所有代码写入以该程序块号命名的C语言文件中。
本发明实施例中,以待测程序P的程序块B3为例,首先导入fork函数声明头文件#include<sys/types.h>、#include<unistd.h>,提取待测程序P中位于该程序块B3前的代码,接着,插入fork函数,使之创建出与属于程序块B3的变异体个数的子进程,由于程序块B3包含3个变异体,因此需要创建出3个子进程,每个子进程下分别导入相应变异体中该程序块B3的代码,然后提取待测程序中目标程序块B3的代码及位于该程序块B3的后续代码,最终将所有代码写入以该程序块号命名的C语言文件中。
本发明实施例中,还可以向所述并发分支代码中加入重定向输入输出流函数实现准确定位执行结果与变异体名称,合成后的变异程序P’如下所示:
本发明实施例中,合成变异程序后,将待测的测试用例作为所述变异程序的输入内容,并发执行合成后的变异程序,执行后返回的输出结果作为测试输出。假设属于目标程序块的变异体个数为k且测试用例执行变异程序中的变异代码,则在所述变异程序中执行一次测试用例,将得到k+1个输出结果
本发明实施例中,由于一个待测程序包含多个程序块,因此将合成多个基于并发机制的变异程序,可采用如下方式进行测试:(1)选择一个合成后的变异程序,针对该变异程序选择一个测试用例进行执行;(2)执行完毕后,对比待测程序与变异体程序的输出结果,如果输出结果不同,则说明对应变异体被检测出来,删除该变异体初始程序文件;否则保留不做更改;(3)判断是否不存在与该合成的变异程序相关的变异体程序文件或者测试用例已全部执行完毕,若是,则对下一个合成的变异程序重复上述过程,否则针对该变异程序选择新的测试用例重复上述过程,直到所有合成的变异程序均被执行,测试结束。
本发明实施例中,以合成后的变异程序P’为例,假设选取的测试用例集为t1=(4)、t2=(3),对合成后的变异程序P’进行基于程序块的变异体并发测试执行,并对测试结果进行判定:
(1)若输入为t1,则a%2=0;n=1,由于该测试用例并不执行n=0条件下的变异语句,因此并不进行进程的创建以及变异程序的执行,使用优化方法后仅仅执行一遍待测程序,因此可以减少变异测试的执行时间;
(2)由于变异体M1、M2、M3相关变异语句未被执行,不生成除待测程序结果以外的文件,所以无需进行结果对比;
(3)变异体M1、M2、M3仍存在,即存在与该变异程序相关的变异体,且仍有测试用例未被执行,因此执行测试用例t2;
(4)输入为t2,则a%2=1;n=0,该测试用例执行n=0条件下的变异代码,创建子函数,父进程、子进程分别执行原始待测程序(变异程序变异前)以及变异程序中的变异代码,即父进程执行a=a*2;子进程分别执行a=a*1、a=1*2、a=a-2。生成待测程序执行结果文件以及变异体执行结果文件,待测程序执行结果文件存储内容为a=6,变异体执行结果文件存储内容分别为a=3、a=2、a=1;
(5)对比待测程序执行结果文件与变异体执行结果文件的内容,发现3、2、1均不等于6,则说明M1、M2、M3均被检测出来,删除变异体M1、M2、M3对应的初始程序文件;
(6)不存在与程序块3相关的变异体程序文件,则该合成后的变异程序测试完毕,可对下一个合成后的变异程序重复上述测试过程。
本发明实施例中,通过创建多个父进程副本,使得变异代码所在程序块的前序程序块仅执行一遍,变异代码所在的程序块及其后续程序块被处理为并发分支,并发执行,父进程执行待测程序,子进程则分别执行相应变异体程序,能够缩短变异体执行时间,提高变异测试效率。例如,针对给定程序块Bi,属于程序块Bi的变异体有k个{Mi,1,Mi,2,…,Mi,k}。假设待测程序的执行时间为t,则传统方法下,针对一个测试用例,该组变异体执行时间为t×(k+1)。假设从程序入口到程序块Bi前的程序段执行时间为b,则应用基于并发机制的变异测试技术,针对一个测试用例,该组变异体执行时间为t×(k+1)-b×k。针对一个测试用例,执行时间缩减比例为(b×k)÷[t×(k+1)]。因此,上述技术可在保证变异得分不变的情况下,减少变异体的执行时间,提高变异测试效率,对于变异测试技术优化具有十分重要的意义。
本发明实施例中,由于变异测试生成的变异体数量较多,通常需要运行大量的测试数据并保留大量的输出结果,优选地,可以开发一个相应的支持工具,能够根据所选择的待测程序自动生成测试脚本,该脚本能够控制测试的开始与结束、控制测试用例的选取与执行、保存程序输出结果、对比变异体程序与待测程序的输出结果。这样,可以通过该工具导入测试用例集,自动编写的测试脚本,控制测试用例在合成的变异程序上执行与判定,保存相应的输出信息。
本发明实施例中,对合成后的变异程序测试完毕后,可以通过检测未被检测出的变异体相关程序文件,统计被检测出的变异体数量及名称,未检测出的变异体数量及名称,确定本次变异测试的变异得分及执行时间。
实施例二
本发明还提供一种变异测试装置的具体实施方式,由于本发明提供的变异测试装置与前述变异测试方法的具体实施方式相对应,该变异测试装置可以通过执行上述方法具体实施方式中的流程步骤来实现本发明的目的,因此上述变异测试方法具体实施方式中的解释说明,也适用于本发明提供的变异测试装置的具体实施方式,在本发明以下的具体实施方式中将不再赘述。
参看图5所示,本发明实施例还提供一种变异测试装置,包括:
程序块划分模块101,用于将待测程序源代码划分为不同的程序块;
变异体分布确定模块102,用于确定属于目标程序块的变异体;
变异程序合成模块103,用于利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序。
本发明实施例所述的变异测试装置,通过将待测程序源代码划分为不同的程序块;确定属于目标程序块的变异体;利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序。与现有技术相比,在执行合成后的变异程序时,能够有效减少变异测试过程中变异体编译和执行的计算开销及时间,从而提高变异测试效率,且不影响变异测试的故障检测能力,有助于变异测试在实践中的推广使用。
在前述变异测试装置的具体实施方式中,进一步地,所述变异程序合成模块包括:
第一提取单元,用于提取待测程序中位于目标程序块之前的代码;
进程创建单元,用于将待测程序处理为父进程,并创建出与父进程执行状态完全相同的子进程,在每个子进程下分别导入相应变异体中该目标程序块的代码,其中,创建的子进程的个数与属于该目标程序块的变异体个数相同;
第二提取单元,用于提取待测程序中该目标程序块代码及位于该目标程序块之后的代码,并将变异代码所在的程序块及其后续程序块处理为并发分支;
变异程序合成单元,用于将第一提取单元、进程创建单元、第二提取单元中的代码进行合成,得到变异程序。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (10)

1.一种变异测试方法,其特征在于,包括:
将待测程序源代码划分为不同的程序块;
确定属于目标程序块的变异体;
利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序。
2.根据权利要求1所述的方法,其特征在于,所述将待测程序源代码划分为不同的程序块包括:
对待测程序的结构进行分析,将待测程序源代码划分为不同的程序块,并生成各程序块的分块规则;
其中,所述分块规则,用于描述待测程序源代码的入口行数、出口行数与程序块号之间的关系。
3.根据权利要求2所述的方法,其特征在于,所述确定属于目标程序块的变异体包括:
将变异体与待测程序源代码进行比较,得到变异体中变异代码所在的行数,其中,所述变异代码为变异体中与待测程序源代码不同的代码;
根据生成的所述分块规则,获取代码行数与程序块号之间的对应关系,若所述变异代码所在的行数属于目标程序块的行数范围内,则确定所述变异体属于目标程序块。
4.根据权利要求1所述的方法,其特征在于,所述利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序包括:
S1,提取待测程序中位于目标程序块之前的代码;
S2,将待测程序处理为父进程,并创建出与父进程执行状态完全相同的子进程,在每个子进程下分别导入相应变异体中该目标程序块的代码,其中,创建的子进程的个数与属于该目标程序块的变异体个数相同;
S3,提取待测程序中该目标程序块代码及位于该目标程序块之后的代码,并将变异代码所在的程序块及其后续程序块处理为并发分支;
S4,将S1、S2、S3中的代码进行合成,得到变异程序。
5.根据权利要求4所述的方法,其特征在于,所述变异程序包括:待测程序与属于目标程序块的全部变异体的变异代码;
所述并发分支数与属于该目标程序块的变异体个数相同;
所述变异程序的个数与待测程序源代码的程序块个数相同。
6.根据权利要求4所述的方法,其特征在于,所述利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序之后还包括:
将待测的测试用例作为合成后的变异程序的输入,执行所述变异程序,输出结果并保存。
7.根据权利要求6所述的方法,其特征在于,所述将待测的测试用例作为合成后的变异程序的输入,执行所述变异程序,输出结果并保存之后还包括:
比较待测程序和变异体在执行相同测试用例后对应的输出结果是否相同,若不相同,则确定相应的变异体被检测出来。
8.根据权利要求7所述的方法,其特征在于,所述比较待测程序和变异体在执行相同测试用例后对应的输出结果是否相同,若不相同,则确定相应的变异体被检测出来之后还包括:
测试执行完毕后,统计被检测出的变异体数量及名称,未被检测出的变异体数量及名称,确定本次变异测试的变异得分及执行时间。
9.一种变异测试装置,其特征在于,包括:
程序块划分模块,用于将待测程序源代码划分为不同的程序块;
变异体分布确定模块,用于确定属于目标程序块的变异体;
变异程序合成模块,用于利用并发机制,将所述待测程序源代码与属于目标程序块的变异体进行合成,得到变异程序。
10.根据权利要求9所述的装置,其特征在于,所述变异程序合成模块包括:
第一提取单元,用于提取待测程序中位于目标程序块之前的代码;
进程创建单元,用于将待测程序处理为父进程,并创建出与父进程执行状态完全相同的子进程,在每个子进程下分别导入相应变异体中该目标程序块的代码,其中,创建的子进程的个数与属于该目标程序块的变异体个数相同;
第二提取单元,用于提取待测程序中该目标程序块代码及位于该目标程序块之后的代码,并将变异代码所在的程序块及其后续程序块处理为并发分支;
变异程序合成单元,用于将第一提取单元、进程创建单元、第二提取单元中的代码进行合成,得到变异程序。
CN201510700704.4A 2015-10-26 2015-10-26 一种变异测试方法及装置 Active CN105302719B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201510700704.4A CN105302719B (zh) 2015-10-26 2015-10-26 一种变异测试方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201510700704.4A CN105302719B (zh) 2015-10-26 2015-10-26 一种变异测试方法及装置

Publications (2)

Publication Number Publication Date
CN105302719A true CN105302719A (zh) 2016-02-03
CN105302719B CN105302719B (zh) 2017-11-28

Family

ID=55200008

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201510700704.4A Active CN105302719B (zh) 2015-10-26 2015-10-26 一种变异测试方法及装置

Country Status (1)

Country Link
CN (1) CN105302719B (zh)

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107153605A (zh) * 2016-03-02 2017-09-12 阿里巴巴集团控股有限公司 测试样本的生成方法及装置
CN107247663A (zh) * 2017-05-11 2017-10-13 北京科技大学 一种冗余变异体识别方法
CN105868116B (zh) * 2016-04-15 2018-07-24 西北工业大学 基于语义变异算子的测试用例生成和优化方法
CN109347696A (zh) * 2018-09-30 2019-02-15 中国人民解放军国防科技大学 一种基于分级变异的网络协议模糊测试方法
CN110018954A (zh) * 2018-12-25 2019-07-16 阿里巴巴集团控股有限公司 代码质量检测、代码检测质量的评估方法、装置及设备
CN110347600A (zh) * 2019-07-11 2019-10-18 中国人民解放军陆军工程大学 面向卷积神经网络的变异覆盖测试方法及计算机存储介质
CN110879782A (zh) * 2019-11-08 2020-03-13 浪潮电子信息产业股份有限公司 一种基因比对软件的测试方法、装置、设备及介质
CN112699051A (zh) * 2020-08-03 2021-04-23 徐州工程学院 一种基于相关输入变量的变异体分组方法
CN112967059A (zh) * 2021-05-18 2021-06-15 支付宝(杭州)信息技术有限公司 一种测试资损监控系统的变异智能合约生成方法和系统
CN113590474A (zh) * 2021-07-12 2021-11-02 山东建筑大学 一种并行程序顽固变异体的判定方法及系统

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060123272A1 (en) * 2004-12-03 2006-06-08 Arm Limited Scoring mechanism for automatically generated test programs
CN102385550A (zh) * 2010-08-30 2012-03-21 北京理工大学 一种针对软件缺陷的检测方法
CN103605605A (zh) * 2013-11-21 2014-02-26 中国矿业大学 基于语句占优关系和两阶段遗传算法的高阶变异测试方法
CN104317706A (zh) * 2014-10-15 2015-01-28 中国科学院软件研究所 一种基于预运算的程序变异软件错误定位方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060123272A1 (en) * 2004-12-03 2006-06-08 Arm Limited Scoring mechanism for automatically generated test programs
CN102385550A (zh) * 2010-08-30 2012-03-21 北京理工大学 一种针对软件缺陷的检测方法
CN103605605A (zh) * 2013-11-21 2014-02-26 中国矿业大学 基于语句占优关系和两阶段遗传算法的高阶变异测试方法
CN104317706A (zh) * 2014-10-15 2015-01-28 中国科学院软件研究所 一种基于预运算的程序变异软件错误定位方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
JACKSON D, WOODWARD M R: "Parallel firm mutation of Java programs", 《MUTATION TESTING FOR THE NEW CENTURY》 *
宋雨: "《软件工程》", 30 September 2012, 北京:清华大学出版社 *

Cited By (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107153605A (zh) * 2016-03-02 2017-09-12 阿里巴巴集团控股有限公司 测试样本的生成方法及装置
CN107153605B (zh) * 2016-03-02 2021-07-06 阿里巴巴集团控股有限公司 测试样本的生成方法及装置
CN105868116B (zh) * 2016-04-15 2018-07-24 西北工业大学 基于语义变异算子的测试用例生成和优化方法
CN107247663A (zh) * 2017-05-11 2017-10-13 北京科技大学 一种冗余变异体识别方法
CN107247663B (zh) * 2017-05-11 2020-05-08 北京科技大学 一种冗余变异体识别方法
CN109347696A (zh) * 2018-09-30 2019-02-15 中国人民解放军国防科技大学 一种基于分级变异的网络协议模糊测试方法
CN110018954A (zh) * 2018-12-25 2019-07-16 阿里巴巴集团控股有限公司 代码质量检测、代码检测质量的评估方法、装置及设备
CN110018954B (zh) * 2018-12-25 2023-03-31 创新先进技术有限公司 代码质量检测、代码检测质量的评估方法、装置及设备
CN110347600A (zh) * 2019-07-11 2019-10-18 中国人民解放军陆军工程大学 面向卷积神经网络的变异覆盖测试方法及计算机存储介质
CN110347600B (zh) * 2019-07-11 2023-04-07 中国人民解放军陆军工程大学 面向卷积神经网络的变异覆盖测试方法及计算机存储介质
CN110879782B (zh) * 2019-11-08 2022-06-17 浪潮电子信息产业股份有限公司 一种基因比对软件的测试方法、装置、设备及介质
CN110879782A (zh) * 2019-11-08 2020-03-13 浪潮电子信息产业股份有限公司 一种基因比对软件的测试方法、装置、设备及介质
CN112699051A (zh) * 2020-08-03 2021-04-23 徐州工程学院 一种基于相关输入变量的变异体分组方法
CN112732582A (zh) * 2020-08-03 2021-04-30 徐州工程学院 一种基于搜索域缩减的软件测试用例进化生成方法
CN112967059A (zh) * 2021-05-18 2021-06-15 支付宝(杭州)信息技术有限公司 一种测试资损监控系统的变异智能合约生成方法和系统
CN113590474A (zh) * 2021-07-12 2021-11-02 山东建筑大学 一种并行程序顽固变异体的判定方法及系统

Also Published As

Publication number Publication date
CN105302719B (zh) 2017-11-28

Similar Documents

Publication Publication Date Title
CN105302719A (zh) 一种变异测试方法及装置
CN103902456B (zh) 测试脚本处理装置、系统及方法
Gupta et al. Deep reinforcement learning for syntactic error repair in student programs
US9389849B2 (en) Test case pattern matching
CN104794401B (zh) 一种静态分析辅助的符号执行漏洞检测方法
CN101714118B (zh) 一种二进制代码缓冲区溢出漏洞的检测器及其检测方法
McMinn et al. Reducing qualitative human oracle costs associated with automatically generated test data
US7895575B2 (en) Apparatus and method for generating test driver
CN110543421A (zh) 基于测试用例自动生成算法的单元测试自动执行方法
CN106371887A (zh) 一种msvl语言的编译系统及方法
Guo et al. Automated software test data generation with generative adversarial networks
CN102087629A (zh) 一种基于Agent嵌入式软件的不变量测试方法与工具
US5857093A (en) Cross-compiled simulation timing backannotation
CN108563561B (zh) 一种程序隐性约束提取方法及系统
CN107247663B (zh) 一种冗余变异体识别方法
CN113408240A (zh) 芯片验证方法及装置、存储介质
Shrestha Automatic generation of Simulink models to find bugs in a cyber-physical system tool chain using deep learning
CN111474894A (zh) 可变目标plc仿真调试方法、存储介质及功能模块
CN106095663A (zh) 基于切片模型的程序回归错误定位方法
CN113282495B (zh) 一种基于轨迹监控的Java软件故障定位方法
Ayache et al. Certifying and reasoning on cost annotations in C programs
CN109002723A (zh) 一种分段式符号执行方法
CN114281709A (zh) 一种单元测试方法、系统、电子设备及存储介质
US20090112568A1 (en) Method for Generating a Simulation Program Which Can Be Executed On a Host Computer
Nakagawa et al. How compact will my system be? A fully-automated way to calculate Loc reduced by clone refactoring

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant