CN108664391B - 一种面向程序状态的故障分类方法、变异测试方法及设备 - Google Patents
一种面向程序状态的故障分类方法、变异测试方法及设备 Download PDFInfo
- Publication number
- CN108664391B CN108664391B CN201810204976.9A CN201810204976A CN108664391B CN 108664391 B CN108664391 B CN 108664391B CN 201810204976 A CN201810204976 A CN 201810204976A CN 108664391 B CN108664391 B CN 108664391B
- Authority
- CN
- China
- Prior art keywords
- fault
- state
- variation
- statement
- program
- 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
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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种面向程序状态的故障分类方法、变异测试方法及设备。所述方法包括:基于待测源程序的语法对应的变异算子,为所述待测源程序的每条语句构造故障节点集和状态变异点集;基于所述故障节点集、所述状态变异点集、所述每条语句的状态变异之间的触发关系和传播关系,构造所述待测源程序的变异流图;根据所述变异流图的直接后向支配关系,构造故障类支配树,以对所述待测源程序进行故障分类。本发明从一般性的故障测试原理出发,对故障程序进行分类排序,同时支持多种类型的变异算子,具有较好的可扩展性,进而减少测试次数、优化故障集、简化故障分析成本,可以提升变异测试效率。
Description
技术领域
本发明涉及软件变异测试领域,更具体地,涉及一种面向程序状态的故障分类方法、变异测试方法及设备。
背景技术
变异测试是一类面向故障的测试评估技术,它通过为被测代码生成一组故障程序,运行测试,来检查测试用例集对程序故障的检测能力。然而变异测试面临的一个问题是,可能生成大量的变异体(故障程序),从而导致评估过程缓慢、需要消耗大量的计算资源和测试成本。为了优化测试效率,已有的研究方案提出了三种解决方案:
1)变异采样:从程序的变异体全集中随机筛选一个数量较小的子集;该方法的缺陷是评估结果可靠性低;
2)选择变异:从所有故障类型(变异算子)中选择一个子集,生成故障程序;该方法的缺陷是移除一类故障,可能降低评估的有效性;
3)变异聚类:该方法将“行为相近”的故障聚为一类,对每一类故障只生成一个变异体,进而减少测试次数;该方法的缺陷是目前的研究缺少对“行为相似性”的建模和进一步地讨论。
面对上述问题,近年来的研究提出使用了故障的分类和去冗余技术,来减少测试次数;其核心思想是通过将行为相近的故障聚为一类,并通过蕴含关系识别出冗余的故障类,将其排除。所谓冗余故障,指的是其测试结果可以通过其它故障的测试结果推断出来的故障,这类故障本身没有进行测试的必要。然而Andras Marki的实验研究证明,目前的基于变异体冗余关系的优化策略存在下面的几大缺陷:
1)包含等价变异的比例较高,评估有效性差;等价变异指的是与原程序语法不同,但语义等价的故障程序,这类变异无法模拟真实的程序故障,在变异测试中需要排除这类等价变异;
2)静态识别冗余变异体是个不可解问题;动态识别冗余变异体要求增加更多的测试次数,与优化测试的目标本末倒置;
实验表明,故障的蕴含关系是稀疏的,因此只有少量的故障可以被删减,目前的技术对变异测试的优化效率并不高。
发明内容
本发明提供一种克服上述问题或者至少部分地解决上述问题的面向程序状态的故障分类方法、变异测试方法及设备。
根据本发明的第一方面,提供一种面向程序状态的故障分类方法,包括:
基于待测源程序的语法对应的变异算子,为所述待测源程序的每条语句构造故障节点集和状态变异点集;
基于所述故障节点集、所述状态变异点集、所述每条语句的状态变异之间的触发关系和传播关系,构造所述待测源程序的变异流图;
根据所述变异流图的直接后向支配关系,构造故障类支配树,以对所述待测源程序进行故障分类。
根据本发明的第二方面,还提供一种面向程序状态的变异测试方法,包括:
为待测源程序构造本发明第一方面所述的故障类支配树;
自上而下遍历故障类支配树的每个故障类,对所述每个故障类进行测试和变异评估,以对所述待测源程序进行变异测试
根据本发明的第三方面,还提供一种面向程序状态的故障分类设备,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中:
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行本发明第一方面所述的面向程序状态的故障分类方法及其任一可选实施例的方法。
根据本发明的第四方面,还提供一种面向程序状态的变异测试设备,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中:
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行本发明第二方面所述的面向程序状态的变异测试方法及其任一可选实施例的方法。
本发明提出一种面向程序状态的故障分类方法,从一般性的故障测试原理出发,对故障程序进行分类排序,同时支持多种类型的变异算子,具有较好的可扩展性。本发明所述面向程序状态的变异测试方法,在本发明故障分类的基础上进行,可以减少测试次数、优化故障集、简化故障分析成本,可以提升变异测试效率。
附图说明
图1为本发明实施例一种面向程序状态的故障分类方法流程示意图;
图2为本发明实施例面向程序状态的故障分类方法整体流程示意图;
图3为本发明实施例一种面向程序状态的变异测试方法流程示意图;
图4为本发明实施例面向程序状态的变异测试方法整体流程示意图;
图5为本发明具体实施例的变异流图示意图;
图6为本发明具体实施例的变异流图对应的故障类支配树示意图;
图7为本发明实施例面向程序状态的故障分类设备的框架示意图;
图8为本发明实施例面向程序状态的变异测试设备的框架示意图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
本发明实施例的主要目的在于提供一种故障分类方法和基于故障分类的变异测试方法,其核心思想是:将所有对同一程序状态(program state)产生相同影响的故障归为一类,如果该影响无法被测试集检测,则该类型所有故障均无法检测。在本发明实施例中,一个程序状态指的是一个变量在某个程序点上的取值,记作二元组<x,t>,其中x为变量名,t为对应的程序点;在故障程序中,变量状态的改变称为状态变异(state mutation),一个状态变异通过三元组<x,t,delta>来表示,其中delta为该变量x的与原状态的相对变化,可以通过算术减法或比特异或的方式评估得到。产生相同状态变异的故障将被归为一类;例如将语句y=(a<=b)替换为a<b和a==b属于一类,它们都能使变量y的值产生相同的变化,即delta=-1(从1变为0)。
图1为本发明实施例一种面向程序状态的故障分类方法流程示意图,基于上述核心思想,本发明实施例提供一种面向程序状态的故障分类方法,如图1所示,包括:
S100,基于待测源程序的语法对应的变异算子,为所述待测源程序的每条语句构造故障节点集和状态变异点集;
所述故障节点集,是根据每条语句对应的变异算子而构造的全部故障节点,是待测源程序的所有语句的故障节点的全集;故障节点也称为变异体,是“故障程序”,是通过在源代码中注入故障生成的故障代码,是一个静态概念。
所述状态变异点集是根据每条语句对应的变异算子而得到的全部发生状态变异的程序点,是待测源程序的所有语句的的状态变异点的全集。状态变异是指程序执行过程中某个变量在某条语句执行前后的值与预期不同的状态,是一种动态概念。在变异测试中,常常所指的故障即是指的变异体,而状态变异点是本发明实施例提出用以对故障(即变异体)进行分类的概念。
具体的,步骤S100之前,可以先对所述待测源程序进行预处理,提取源程序的中间表示(intermediate representation,IR),通过中间表示IR来实现步骤S100、S101和S102。程序的中间表示IR可以是任何描述程序语法的结构化模型,可以是程序的抽象语法树,也可以是中间代码等。中间表示提供了构造程序状态和变异流图,以作为对变异体进行分类的模型基础。本发明实施例所使用的中间表示包括控制流图和数据流的定义/使用链。
本发明实施例的故障分类方法可应用于各种语言的程序代码。具体的,本发明实施例所述待测源程序,可以是C、C++、java、JavaScript、C#,Fortran等等;每种程序语言由于自己的语法特点,都有自己的变异算子,本发明实施例所述变异算子是与程序语言相应的变异算子。
具体的,表1举例了几种C语言支持的变异算子,以下本发明实施例的将以表1所示的变异算子给出具体示例。表1仅仅为变异算子的示例,本发明实施例所支持的变异算子并不限于此。
表1 C语言的变异算子
变异算子 | 变异规则 | 示例 |
CORP | 将常量表达式替换为其它常量值 | Y=X[5]→Y=X[12] |
VARP | 将引用替换为其它兼容类型的变量名 | c=a+b→c=a+c |
SSDL | 将特定的语句从程序中删除 | S1;S2;S3;→S1;S3; |
UORP | 替换前置运算符{++--} | ++x→--x|x--|x++ |
UOIS | 将前置运算符插入{++--} | x→x++|--x |
AROP | 对数值运算符进行替换{+-*/%} | x+y→x/y |
BROP | 对比特运算符进行替换{&|^>><<} | x|y→x<<y |
LORP | 对逻辑运算符进行替换{&&||} | x&&y→x||y |
LCRP | 对逻辑表达式取反 | expr→!(expr) |
REOR | 替换条件运算符{>>=<=<==!=} | x>y→x>=y |
ABS | 将数值表达式替换为绝对值 | expr→abs(expr) |
S101,基于所述故障节点集、所述状态变异点集、所述每条语句的状态变异之间的触发关系和传播关系,构造所述待测源程序的变异流图;
所述变异流图(mutation flow graph,MFG)描述了故障和状态变异之间的因果关系。一个状态变异可能是通过语句中的故障触发(infect)产生的,也可能是通过其它语句中变量的错误状态间接传播(propagate)导致的。变异流图将程序中的故障和状态变异描述为节点,将节点之间的触发和传播的因果关系描述为有向边,从而展示故障是如何影响和改变程序测试输出的。
本发明实施例核心思想是将数据依赖关系中对同一个程序中间状态产生“相同变化”的故障聚为一类。与传统的数据流分析不同的是,本发明对故障的分类基准是基于状态“变化”,而不是基于同一个被作用的存储位置。为了实现故障的分类,通过构造源程序的变异流图,再根据变异流图构造故障类支配树,来对故障全集进行分类。
S102,根据所述变异流图的直接后向支配关系,构造故障类支配树,以对所述待测源程序进行故障分类。
具体的,所述直接后向支配关系为:
基于所述变异流图的任意第一节点和任意第二节点(第一节点和第二节点不相同),若从所述第一节点到所述变异流图的终止点的所有路径都经过所述第二节点,则所述第二节点后向支配所述第一节点;
所述第二节点支配所述第一节点,且所述第一节点并不支配所述第二节点,则所述第二节点严格后向支配所述第一节点;
若所述第二节点严格后向支配所述第一节点,且所有从所述第一节点到所述第二节点的路径上不存在第三节点严格后向支配所述第一节点,则所述第二节点直接后向支配所述第一节点。
所述故障类支配树(fault dominator tree,FDT)是变异流图的后向支配树。在变异流图中,如果b后向支配a,则说明从a到测试输出的所有传播路径都必然经过b。对于所有为状态变异m=<x,s,delta>所直接支配的故障,它们都对同一程序状态产生相同的影响,因此归为一类;类似地,如果测试用例无法检测某个特定程序状态的改变,那么该状态所对应的故障类均无法被检测。
本发明实施例提出一种面向程序状态的故障分类方法,从一般性的故障测试原理出发,对故障程序进行分类排序,同时支持多种类型的变异算子,具有较好的可扩展性。在此基础上进行程序变异测试,可以减少测试次数、优化故障集、简化故障分析成本,可以提升变异测试效率。
在一个可选的实施例中,步骤S100,所述基于待测源程序的语法对应的变异算子,为所述待测源程序的每条语句构造故障节点集和状态变异点集,具体包括:
S100.1,基于待测源程序的语法对应的变异算子,为所述待测源程序的每条语句构造对应于每个变异算子的故障节点,所有故障节点组成故障节点集,记作MT;
具体的,在变异测试中,故障指的是通过特定的语法变异规则(变异算子)改变源代码进而得到的故障代码版本,又称为变异体(mutant)。例如,表1列出的部分C语言变异算子实例,进一步分为:常量变异(对常量值进行替换,如CORP)、引用变异(对变量引用名进行替换,如VARP)、语句变异(删除或增加语句,如STDW)、或者操作符变异(更改表达式的操作符,如AROP)。
S100.2,为所述待测源程序的每条语句构造变量状态变异点,所有变量状态变异点组成状态变异点集,记做SM;
所述变量状态变异点由包括第一数据、第二数据和第三数据的三元组表示,其中,第一数据表示变量名,第二数据表示程序语句点,第三数据表示第一数据的状态值在故障程序与源程序间的相对变化。
具体的,在变异测试中,故障主要通过改变程序变量在某个时刻的状态来间接地影响测试结果。在本发明实施例中,变量状态的改变称为状态变异(state mutation)。形式化地,状态变异通过三元组<var,point,diff>来表示,其中,var为变量名,point为程序语句点,而diff表示该变量在语句point执行后状态值发生的相对变化。例如,状态变异m=<y,s,3>表示在故障程序中,语句s执行后整型变量y的实际状态与原状态的差值为3。
一般而言,对布尔类型变量,只有两种可能的变化,分别是从1变为0(记作delta=-1)以及从0变为1(记作delta=+1);对数值类型变量,可能存在数量庞大的状态变异,这时可以采用抽象符号来表示状态的变化度,例如<x,s,β>表示语句s执行后x状态任何可能的改变(β≠0)。
在一个可选的实施例中,步骤S101,所述基于所述故障节点集、所述状态变异点集、所述每条语句的状态变异之间的触发关系和传播关系,构造所述待测源程序的变异流图,具体包括:
S101.1,对于每条语句,若语句的故障程序的执行会改变所述语句的源程序执行后的变量的取值,则构造所述语句的状态变异之间的触发关系,记作IE;
具体的,如果语句s中故障m的执行改变语句执行后变量x的取值,则构造从m1到状态变异m2=<x,s,delta>的触发(infect)关系,记作m1→I m2。
一个常量替换类型(CORP)故障会直接改变原常量表达式的返回值;引用替换类型(VARP)故障会改变原变量引用的返回值;操作符变异则改变运算后的结果;语句删除变异(STDW)导致语句s中被重定义的变量没有被赋值,因而改变了这些变量的状态值。
即使故障语句被执行了,状态变异也不一定会被触发。例如“y=a<b”的故障“y=(a<=b)”只有在a=b的条件下才会被触发;从故障x触发状态变异m需要满足的状态条件,称为故障触发条件。附表1列举了部分C程序变异算子的故障到状态变异的触发关系以及相应的故障触发条件。
S101.2,对于每条语句,若语句的第一状态变异通过输入和执行会在第二语句的输出变量上产生第二状态变异,则构造从所述第一状态变异到所述第二状态变异之间的传播关系,记作PE;
具体的,如果语句s的状态变异<x,s,delta>通过输入和执行会在语句t的输出变量y上产生新的状态变异<y,t,delta>,则构造从<x,s,delta>到<y,t,delta>的传播(propagate)关系,记作PE。
步骤S101.2中所述第一状态变异到所述第二状态变异之间的传播关系,包括数据传播关系、控制传播关系和操作传播关系;
所述数据传播关系为:若第二语句使用了最后一次在第一语句中重定义的变量,且所述第二语句的直接数据依赖于所述第一语句,则从所述第一语句的状态变异到所述第二语句的状态变异之间的数据传播关系,记作DPE;
具体的,状态变异<x,t,α>数据传播到状态变异<x,sb,α>,当且仅当变量x在语句t中被重定义,在语句s中被使用,且存在控制流图上的一条从t到s的执行路径path(t,s)中,不存在第三条语句w对变量x进行重写;记作:
x∈Def(t)∩Use(s)-Def(path[t+1,s-1]);
其中,sb表示语句s执行前的状态;而path[t+1,s-1]表示语句t到s的一条子路径,但不包含s和t本身。数据传播关系其本质就是程序数据流分析中定义—使用链在变量状态上的表示。
所述控制传播关系为:若第一语句的直接控制依赖于条件谓词,则构造从所述第一语句的输出变量的状态变异到所述条件谓词的状态变异的控制传播关系,记作CPE;
具体的,条件谓词量pr的状态变异<pr,assert,α>控制传播到状态变异<y,s,β>,当且仅当语句s直接控制依赖于条件谓词pr,且y是s的重定义变量,记作:
具体的,直接控制依赖关系是程序依赖图的相关概念,其定义如下:
1)在有向图中,所有从入口节点到语句b的路径都经过a,则称a前向支配b,记作a≤b;
2)在有向图中,语句a前向支配b,而b并不前向支配a,则称a严格前向支配b,记作a<b;
3)在有向图中,语句a严格前向支配b,且对从a到b的任意子路径而言,不存在第三条语句c严格前向支配b,称语句a直接前向支配语句b,记idom(a,b);
4)在控制流图中,语句s直接控制依赖于t,当且仅当t直接支配s,即:
控制传播关系表明:如果条件谓词的状态值发生改变,则可能导致其直接控制的分支语句s被执行(原来没有被执行)或者不被执行(原来被执行);这就导致其重定义变量y被语句s赋值(原来没赋值)或者没有赋值(原来赋值)。因此对y可能产生状态的改变。
所述操作传播关系为:对于指令语句的每个重定义变量和每个使用变量,都构造从使用变量的状态变异到重定义变量直接的状态变异的操作传播关系,记作APE。
具体的,状态变异<x,sb,α>操作传播到状态变异<y,s,β>,当且仅当变量x是语句s使用的变量(输入),而y是语句s的重定义变量(输出),记作:
操作传播关系表明:表达式接受错误的输入可能会计算并产生错误的输出,进而在输出变量上产生新的状态变异;其中sb为语句s执行前的时刻。
以上得到了待测源程序的故障节点集MT、状态变异点集SM、状态变异之间的触发关系IE和传播关系PE,下面通过步骤S101.3构造变异流图MFG。
S101.3,以所述故障节点集和状态变异点集中的点为节点、以所述触发关系和传播关系为有向边,构造所述待测源程序的变异流图MFG。
具体的,传播关系PE包括数据传播关系DPE、控制传播关系CPE和操作传播关系APE。
具体的,所述故障节点集和状态变异点集中的点为变异流图MFG的节点,以触发关系IE、数据传播关系DPE、控制传播关系CPE和操作传播关系APE为有向边集,构造程序的变异流图MFG,其形式定义如下:
MFG=〈MT∪SM,IE∪APE∪CPE∪DPE〉;
SM={〈var,point,Δvalue〉|var∈Vp,point∈Sp};
IE={〈m1,m2〉|m1∈MT,m2∈SM,m1→I m2};
APE={〈m1,m2〉|m1,m2∈SM,m1→AP m2};
CPE={〈m1,m2〉|m1,m2∈SM,m1→CP m2};
DPE={〈m1,m2〉|m1,m2∈SM,m1→DP m2};
其中,Vp和Sp分别为程序p的变量和语句集;SM为程序所有变量的状态变异,MT对应程序的故障(mutant),这两者构造变异流图的节点集;程序的变异流图包括了三类有向关系边,分别是从故障(MT)到状态变异(SM)的触发关系IE,以及状态之间的三类传播关系:APE、CPE和DPE。
变异流图展示了故障程序的触发和传播过程中的因果关系;例如:故障a触发了状态变异b,则说明a是b产生的原因,而b是a造成的结果(故障的执行改变了程序的状态)。
在一个可选的实施例中,步骤S102,所述根据所述变异流图的直接后向支配关系,构造故障类支配树,以对所述待测源程序进行故障分类,具体包括:
S102.1,根据所述变异流图的直接后向支配关系,构造变异支配树MDT。
变异支配树是变异流图的直接后向支配树,具体的,所述直接后向支配关系请参见前述实施例的定义,此处可以通过如下示例加以描述:
1)在有向图中,从节点a到终止节点(出度为0)的路径都经过节点b,则称节点b后向支配节点a,记作b≥a;
2)在有向图中,如果节点b后向支配节点a,而节点a并不后向支配节点b,则称节点b严格后向支配节点a,记作:
3)在有向图中,如果节点b严格后向支配节点a,且对所有从a到b的路径而言,不存在第三个节点c严格后向支配a,则称b直接后向支配节点a,记作:
4)变异支配树是一个有向图,其定义如下:
MDT={MT∪SM,IDOM};
IDOM={〈m1,m2〉|idomMFG(m1,m2)}。
S102.2,根据所述变异支配树MDT,对于状态变异点集SM中的每个变量状态变异点,为变量状态变异点m构造一个故障类,记作Cm;
具体的,每个状态变异点m对应一簇故障子集,称为m的故障类,记作Cm,所有被m直接后向支配的故障m’∈MT将归纳到该故障类Cm中,Cm={mk∈MT|idomMFG(m,mk)}。
S102.3,根据所有的故障类,构造故障类支配树(fault dominator tree,FDT),并将所有被所述变量状态变异点后向支配的故障归纳到所述故障类Cm中,以实现对所述待测源程序进行故障分类。
具体的,所述故障类支配树FDT是变异流图MFG的后向支配树,其定义如下:
FDTp={C,DM};
C={Cm,m∈SM};
DM={〈Cm,Cn〉|idomMFG(m,n)}。
下面给出故障类支配树的一些相关概念和性质。
定义变量的状态变异m=<x,s,delta>被测试用例t杀死,当且仅当存在某个具体变化度delta=β在该测试用例的执行下可以改变测输出,记作kill(t,m)。状态变异m总是对应一组故障类子集Cm,其变异分数称为故障类检测率,其定义如下:
如果状态变异m∈SM无法被测试集T杀死,那么其故障类Cm中的所有变异体也均无法被测试集T杀死;原因是m后向支配故障类Cm的所有故障,这些故障要影响和改变测试输出必然首先引起状态变异m,然而已知状态变异点m无法被测试集T检测,因而任何这些故障都无法被测试集检测。
如果状态变异m∈SM无法被测试集T杀死,那么所有被m支配的其他状态变异m’也无法被测试集T杀死,理由是:其它状态变异m’也是首先通过产生状态变异m再间接影响和改变程序测试输出的,由于测试集无法检测m的任何变化,因此这些状态变异无法被检测。
显然,如果能证明,在测试中,某个状态变异m无法被测试集T杀死,那么就没有必要进一步测试被该状态变异支配的所有子故障类节点了。而如果状态变异无法被检测,其最基本的现象是该故障类Cm的检测率为0。需要注意的是,如果Cm的故障检测率为0,并不意味着状态变异m就一定无法检测,但是从概率统计的角度分析,当故障类Cm的故障数较多,且故障检测率为0时,仍然可以“合理地”假设该状态变异m无法被测试集杀死。其理由如下:
设状态变异m被某个随机测试集T杀死的概率为α,而Cm包含了n个故障,这n个故障在随机测试集T下均匀随机地触发m的不同变化度的状态变异,则这n个故障均无法被检测的概率为:
其中,谓词kill(T,mk)表示测试集杀死了故障mk。具体而言,如果T中的某个测试用例在执行故障程序mk时的输出与原程序输出不一致,则称该故障mk被测试集T杀死。
上述公式表明,在α>0的条件下,故障类的故障数n越多,则Cm的故障类检测率为0的概率就越低,因此反过来,就有更大的概率认为该状态变异m无法被测试集T杀死。
本发明实施例所述面向程序状态的故障分类方法,其核心思想是:对同一个变量在同一程序点产生相同影响的故障将被归为一类;如果该影响无法被测试集检测,则该类型所有故障均无法检测。基于该思想,本发明实施例所述故障分类方法,根据待测源程序的语法所对应变异算子,为每条程序语句构建故障节点集和状态变异点集,然后识别每条语句的状态变异之间的触发关系和传播关系,通过故障节点集、状态变异点集、触发关系和传播关系,构建变异流图;通过变异流图的后向直接后向支配关系,构造故障类支配树,实现对所述待测源程序进行故障分类,具有较好的可扩展性。在此基础上进行程序变异测试,可以减少测试次数、优化故障集、简化故障分析成本,可以提升变异测试效率。
图2为本发明实施例面向程序状态的故障分类方法整体流程示意图,请参考图2,本发明实施例所述面向程序状态的故障分类方法可分为三部分:
首先,预处理源程序,提取中间表示IR;
其次,根据IR构造程序的变异流图MFG,包括:构造变异程序集即故障节点集MT、构造状态变异点集SM、构造从MT到SM的触发关系变IE、构造SM节点之间的操作传播APE、构造SM节点之间的控制传播CPE、构造SM之间的数据传播DPE以及组合节点和关系变,构造有向图,从而生成变异流图CFG。
最后,提取MFG的后向支配树,并进行故障分类,包括:识别节点间的后向支配关系、构造变异支配树MDT、为每个节点构造故障类、根据IE将故障归类到不同的故障类、根据SM直接的支配关系构造故障类支配树FDT,从而实现对故障进行分类。
需要说明的是,变异支配树MDT是变异流图MFG的后向支配树,等于是从MFG直接获得的数据结构;MDT中的一个节点对应一个状态变异点或者一个变异体故障。
故障类支配树FDT是根据MDT转换过来的,在FDT中,每个变异体故障会被聚类到直接支配它的状态变异点上,换言之,FDT的一个节点是一个二元组,表示为(m,Cm),其中m是状态变异点,Cm是在MDT中被状态变异点m直接支配的变异体的集合。FDT相当于根据MDT中识别的后向支配关系,对故障(即变异体节点)进行了聚类,将它们按照变量的状态变异进行分类,进而根据每个分类变异体的检测率来判断测试集对该状态变异点相关的故障的检测和暴露程度。
本发明实施例所述故障分类树的具有下述两类基本应用:
一、简化变异分析
在变异测试中,由于变异体数量非常巨大,即使对于检测率较高的测试,仍然存在数量庞大的待分析故障集有待测试人员进行逐一排查。通过分类,可以在变异测试后对一整个类型的故障集的检测率进行评估。如果一个类别x对应故障集的检测率接近于0,而它所对应的父类型y(y→x)的检测率则并不接近0,这就说明,以x为分类的故障集由于某种“共同的原因”均为被检测出来。通过识别分类树中最高级别的低检测率类型点可以有效的缩小分析的范畴。
二、优化变异测试
以状态变异进行分类的故障分类系统的一个优势,是可以直接通过检查类型对应的状态变异是否被检测,来确定其故障集的可检测性。它利用了如下性质:如果类别x所对应的任何可能的状态变异均无法被测试检测到,则该类别的所有对应的故障程序均无法杀死。而检测状态变异的检测率可以通过动态符号执行或者采样测试进行估计,这是缩减测试次数的一种方法。
基于本发明实施例所述故障分类树的诸多优点,本发明实施例还提供一种基于故障分类树的变异测试方法。图3为本发明实施例一种面向程序状态的变异测试方法流程示意图,如图3所示的一种面向程序状态的变异测试方法,包括:
S200,为待测源程序构造故障类支配树;所述故障类支配树为本发明实施例所述面向程序状态的故障分类方法及其任一实施例所述的障类支配树。
S201,自上而下遍历故障类支配树的每个故障类,对所述每个故障类进行测试和变异评估,以对所述待测源程序进行变异测试。
本发明实施例所述面向程序状态的变异测试方法,首先根据本发明实施例所述面向程序状态的故障分类方法为待测源程序构造一故障类支配树,通过遍历故障分类树来对所述待测源程序进行变异测试。与传统的故障分类测试相比,可以减少测试次数、优化故障集、简化故障分析成本,可以提升变异测试效率。
在一个可选的实施例中,步骤S201,所述自上而下遍历故障类支配树的每个故障类,对所述每个故障类进行测试和变异评估,以对所述待测源程序进行变异测试,具体包括:
自上而下遍历故障类支配树的每个故障类Cm;
测试所述每个故障类Cm的故障,获得所述每个故障类Cm的变异评估分数score(Cm,T),其中T为待评估的测试用例集;
进一步,所述测试所述每个故障类Cm的故障,获得所述每个故障类Cm的变异评估分数score(Cm,T),还包括:若故障类Cm的分数为0,则将所述故障类Cm支配的所有故障子类的变异分数都设置为0。
图4为本发明实施例面向程序状态的变异测试方法整体流程示意图,具体过程如下:
1、自上而下遍历故障类支配树FDT;
2、获取下一个状态变异点m∈SM;
3、如果m已被访问,则返回步骤2;
4、测试m的故障类检测率score(Cm,T),并标记m为已访问;
5、如果故障类检测率不为0,则返回步骤2;
6、标记m的所有子孙节点child为已访问,并设置其检测率为0;
score(Cchild,T)=0;
7、回到步骤2直到所有节点均被访问。
8、根据下面公式计算程序的整体变异分数:
在本发明实施例基于故障类的变异测试中,故障检测率为0的故障类的支配故障类子集不需要进行测试,因此该策略将减少测试次数。
下面以一个C程序的逻辑表达式为例,基于表1的变异算子,表2的C语言部分变异体的触发关系及其条件约束,表3的C语言部分表达式中变异传播关系及其约束,来解释其变异流图和故障分类图。
表2C语言部分变异体的触发关系及其条件约束
表3C语言部分表达式中变异传播关系及其约束
作为一个具体示例,C程序的逻辑表达式为:
(year%4==0&&year%100!=0)||(year%400==0);
根据表1的变异算子得到的所述C程序的逻辑表达式的程序变异体如表4所示。
表4程序变异体编号
根据表2的触发关系和表3的传播关系得到的所述C程序的逻辑表达式的状态变异点集如表5所示。例如,计算表达式E1&&E2需要首先评估子表达式E1和E2的值,如果子表达式E1的评估值存在错误,则表示为(E1+△)&&E2,类似有E1&&(E2+△)。最顶层的表达式E1&&E2的状态变异记作E1&&E2+△。在本示例中,每个子表达式的计算值作为一个中间变量的计算结果。
表5状态变异点集
图5展示了该程序的变异流图。其中,方块节点对应状态变异,而圆形节点对应变异体(故障);其ID对应见表2和表3,其中year(△)表示输入变量year的值与原程序的值不同,存在错误的情况(从外部注入的状态变异)。本发明实施例中,△表示故障执行过程中表达式的计算值与(未注入故障的)原程序在同一个表达式上计算值的差异度。
图6展示了该程序的变异支配树,这个树是MFG的后向支配树,其中,圆形节点对应故障类集,矩形节点对应状态变异点。由于本案例中的MFG除了节点18外均为树形结构,因此生成的FHC与MDG非常近似。变异点18移动到根节点1的下面,原因是该变异可能同时影响所有的子表达式,因而其最近的支配节点就是表达式值的变异点。
通过以上具体实例可见,本发明实施例所述故障分类方法提供了按类别分析检测率低的原因的方法,上述案例为例总共40个变异体,实际上需要分析原因的类型却少于18个,有效的减少了变异测试的次数,提高了变异测试的效率。
图7示出了本发明实施例面向程序状态的故障分类设备的框架示意图。请参照图7,所述设备,包括:处理器(processor)701、存储器(memory)702和总线703;其中,所述处理器701和存储器702通过所述总线703完成相互间的通信;
所述处理器701用于调用所述存储器702中的程序指令,以执行上述各方法实施例所提供的方法,例如包括:基于待测源程序的语法对应的变异算子,为所述待测源程序的每条语句构造故障节点集和状态变异点集;基于所述故障节点集、所述状态变异点集、所述每条语句的状态变异之间的触发关系和传播关系,构造所述待测源程序的变异流图;根据所述变异流图的直接后向支配关系,构造故障类支配树,以对所述待测源程序进行故障分类。
本发明另一实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:基于待测源程序的语法对应的变异算子,为所述待测源程序的每条语句构造故障节点集和状态变异点集;基于所述故障节点集、所述状态变异点集、所述每条语句的状态变异之间的触发关系和传播关系,构造所述待测源程序的变异流图;根据所述变异流图的直接后向支配关系,构造故障类支配树,以对所述待测源程序进行故障分类。
本发明另一实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:基于待测源程序的语法对应的变异算子,为所述待测源程序的每条语句构造故障节点集和状态变异点集;基于所述故障节点集、所述状态变异点集、所述每条语句的状态变异之间的触发关系和传播关系,构造所述待测源程序的变异流图;根据所述变异流图的直接后向支配关系,构造故障类支配树,以对所述待测源程序进行故障分类。
图8示出了本发明实施例面向程序状态的变异测试设备的框架示意图。请参照图8,所述设备,包括:处理器(processor)801、存储器(memory)802和总线803;其中,所述处理器801和存储器802通过所述总线803完成相互间的通信;
所述处理器801用于调用所述存储器802中的程序指令,以执行上述各方法实施例所提供的方法,例如包括:为待测源程序构造本发明实施例所述的故障类支配树;自上而下遍历故障类支配树的每个故障类,对所述每个故障类进行测试和变异评估,以对所述待测源程序进行变异测试。
本发明另一实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:为待测源程序构造本发明实施例所述的故障类支配树;自上而下遍历故障类支配树的每个故障类,对所述每个故障类进行测试和变异评估,以对所述待测源程序进行变异测试。
本发明另一实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:为待测源程序构造本发明实施例所述的故障类支配树;自上而下遍历故障类支配树的每个故障类,对所述每个故障类进行测试和变异评估,以对所述待测源程序进行变异测试。
本领域普通技术人员可以理解:实现上述设备实施例或方法实施例仅仅是示意性的,其中所述处理器和所述存储器可以是物理上分离的部件也可以不是物理上分离的,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (9)
1.一种面向程序状态的故障分类方法,其特征在于,包括:
基于待测源程序的语法对应的变异算子,为所述待测源程序的每条语句构造故障节点集和状态变异点集;
基于所述故障节点集、所述状态变异点集、所述每条语句的状态变异之间的触发关系和传播关系,构造所述待测源程序的变异流图;
根据所述变异流图的直接后向支配关系,构造故障类支配树,以对所述待测源程序进行故障分类;
所述基于所述故障节点集、所述状态变异点集、所述每条语句的状态变异之间的触发关系和传播关系,构造所述待测源程序的变异流图,具体包括:
对于每条语句,若语句的故障程序的执行会改变所述语句的源程序执行后的变量的取值,则构造所述语句的状态变异之间的触发关系;
对于每条语句,若语句的第一状态变异通过输入和执行会在第二语句的输出变量上产生第二状态变异,则构造从所述第一状态变异到所述第二状态变异之间的传播关系;
以所述故障节点集和状态变异点集中的点为节点、以所述触发关系和传播关系为有向边,构造所述待测源程序的变异流图。
2.根据权利要求1所述的方法,其特征在于,所述基于待测源程序的语法对应的变异算子,为所述待测源程序的每条语句构造故障节点集和状态变异点集,具体包括:
基于待测源程序的语法对应的变异算子,为所述待测源程序的每条语句构造对应于每个变异算子的故障节点,所有故障节点组成故障节点集;
为所述待测源程序的每条语句构造变量状态变异点,所有变量状态变异点组成状态变异点集;所述变量状态变异点由包括第一数据、第二数据和第三数据的三元组表示,其中,第一数据表示变量名,第二数据表示程序语句点,第三数据表示第一数据的状态值在故障程序与源程序间的相对变化。
3.根据权利要求2所述的方法,其特征在于,所述第一状态变异到所述第二状态变异之间的传播关系,包括数据传播关系、控制传播关系和操作传播关系;
所述数据传播关系为:若第二语句使用了最后一次在第一语句中重定义的变量,且所述第二语句的直接数据依赖于所述第一语句,则从所述第一语句的状态变异到所述第二语句的状态变异之间的数据传播关系;
所述控制传播关系为:若第一语句的直接控制依赖于条件谓词,则构造从所述第一语句的输出变量的状态变异到所述条件谓词的状态变异的控制传播关系;
所述操作传播关系为:对于指令语句的每个重定义变量和每个使用变量,都构造从使用变量的状态变异到重定义变量直接的状态变异的操作传播关系。
4.根据权利要求2所述的方法,其特征在于,所述根据所述变异流图的直接后向支配关系,构造故障类支配树,以对所述待测源程序进行故障分类,具体包括:
根据所述变异流图直接后向支配关系,构造变异支配树;
根据所述变异支配树,对于状态变异点集中的每个变量状态变异点,为变量状态变异点构造一个故障类;
根据所有的故障类,构造故障类支配树,将所有被所述变量状态变异点后向支配的故障归纳到所述故障类中,以实现对所述待测源程序进行故障分类。
5.一种面向程序状态的变异测试方法,其特征在于,包括:
为待测源程序构造权利要求1-4任一项所述一种面向程序状态的故障分类方法的故障类支配树;
自上而下遍历故障类支配树的每个故障类,对所述每个故障类进行测试和变异评估,以对所述待测源程序进行变异测试。
7.根据权利要求6所述的方法,其特征在于,所述测试所述每个故障类Cm的故障,获得所述每个故障类Cm的变异评估分数score(Cm,T),还包括:若故障类Cm的分数为0,则将所述故障类Cm支配的所有故障子类的变异分数都设置为0。
8.一种面向程序状态的故障分类设备,其特征在于,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中:
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如权利要求1至4任一所述的方法。
9.一种面向程序状态的变异测试设备,其特征在于,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中:
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如权利要求5至7任一所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810204976.9A CN108664391B (zh) | 2018-03-13 | 2018-03-13 | 一种面向程序状态的故障分类方法、变异测试方法及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810204976.9A CN108664391B (zh) | 2018-03-13 | 2018-03-13 | 一种面向程序状态的故障分类方法、变异测试方法及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108664391A CN108664391A (zh) | 2018-10-16 |
CN108664391B true CN108664391B (zh) | 2021-03-23 |
Family
ID=63785164
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810204976.9A Expired - Fee Related CN108664391B (zh) | 2018-03-13 | 2018-03-13 | 一种面向程序状态的故障分类方法、变异测试方法及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108664391B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109977205B (zh) * | 2019-03-08 | 2021-06-22 | 中南大学 | 一种计算机自主学习源代码的方法 |
CN110334020B (zh) * | 2019-06-24 | 2020-08-11 | 北京科技大学 | 一种冗余变异体识别方法及识别装置 |
CN110347600B (zh) * | 2019-07-11 | 2023-04-07 | 中国人民解放军陆军工程大学 | 面向卷积神经网络的变异覆盖测试方法及计算机存储介质 |
CN112699050A (zh) * | 2020-08-03 | 2021-04-23 | 徐州工程学院 | 一种基于变异体分组的软件测试用例多种群进化生成方法 |
CN112214411B (zh) * | 2020-10-20 | 2024-05-14 | 腾讯科技(深圳)有限公司 | 一种容灾系统测试方法、装置、设备及存储介质 |
CN113778876A (zh) * | 2021-09-09 | 2021-12-10 | 南京大学 | 一种源代码层面的程序变异的生成方法和装置 |
CN115981711B (zh) * | 2023-03-20 | 2023-06-27 | 花瓣云科技有限公司 | 一种代码处理方法及电子设备 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104360938A (zh) * | 2014-10-21 | 2015-02-18 | 北京邮电大学 | 一种故障确认方法及其系统 |
CN105868116A (zh) * | 2016-04-15 | 2016-08-17 | 西北工业大学 | 基于语义变异算子的测试用例生成和优化方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20090112520A1 (en) * | 2007-10-30 | 2009-04-30 | Applied Materials, Inc. | Self-aware semiconductor equipment |
-
2018
- 2018-03-13 CN CN201810204976.9A patent/CN108664391B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104360938A (zh) * | 2014-10-21 | 2015-02-18 | 北京邮电大学 | 一种故障确认方法及其系统 |
CN105868116A (zh) * | 2016-04-15 | 2016-08-17 | 西北工业大学 | 基于语义变异算子的测试用例生成和优化方法 |
Non-Patent Citations (2)
Title |
---|
一种变异测试中冗余变异体的寻找方法;钱茛南等;《电子学报》;20170831;第45卷(第8期);第1970-1975页 * |
基于变量影响分析与数据变异的回归测试用例生成;杨波等;《计算机学报》;20161130;第39卷(第11期);第2372-2873页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108664391A (zh) | 2018-10-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108664391B (zh) | 一种面向程序状态的故障分类方法、变异测试方法及设备 | |
CN109063477B (zh) | 一种自动化的智能合约代码缺陷检测系统和方法 | |
US10853231B2 (en) | Detection and correction of coding errors in software development | |
Hofer et al. | On the empirical evaluation of fault localization techniques for spreadsheets | |
CN102073587B (zh) | 一种程序中不可达路径的静态检测方法 | |
US7797687B2 (en) | Parameterized unit tests with behavioral purity axioms | |
US11386154B2 (en) | Method for generating a graph model for monitoring machinery health | |
US8732676B1 (en) | System and method for generating unit test based on recorded execution paths | |
US7669188B2 (en) | System and method for identifying viable refactorings of program code using a comprehensive test suite | |
KR20190041912A (ko) | 바이너리 기반 보안 취약점 탐색 시스템, 그 방법 및 프로그램 | |
CN101286132A (zh) | 一种基于软件缺陷模式的测试方法及系统 | |
Wang et al. | Lightweight global and local contexts guided method name recommendation with prior knowledge | |
CN113157565B (zh) | 一种基于种子用例突变的反馈式js引擎模糊测试方法及装置 | |
US20170161035A1 (en) | Method of Adding Local Variables In Place of Global in JavaScript | |
Liuying et al. | Test selection from UML statecharts | |
Kreutzer et al. | Language-agnostic generation of compilable test programs | |
Letarte et al. | Security model evolution of PHP web applications | |
Perez et al. | A survey on fault localization techniques | |
Ray et al. | Source code prioritization using forward slicing for exposing critical elements in a program | |
Tahmid et al. | Code sniffer: a risk based smell detection framework to enhance code quality using static code analysis | |
US20170109457A1 (en) | Verification of system assertions in simulation | |
CN114253853A (zh) | 一种基于网络谱的软件故障定位方法 | |
CN112699376A (zh) | 源代码逻辑漏洞检测方法、装置、计算机设备及存储介质 | |
Oskouei et al. | Comparing Bug Finding Tools for Java Open Source Software | |
CN115904946A (zh) | 一种基于MoMuTUML的测试用例自动生成方法及系统 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20210323 |