CN105868116A - 基于语义变异算子的测试用例生成和优化方法 - Google Patents
基于语义变异算子的测试用例生成和优化方法 Download PDFInfo
- Publication number
- CN105868116A CN105868116A CN201610234663.9A CN201610234663A CN105868116A CN 105868116 A CN105868116 A CN 105868116A CN 201610234663 A CN201610234663 A CN 201610234663A CN 105868116 A CN105868116 A CN 105868116A
- Authority
- CN
- China
- Prior art keywords
- test case
- semantic
- test
- critical zone
- variant
- 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
Links
- 238000012360 testing method Methods 0.000 title claims abstract description 118
- 238000000034 method Methods 0.000 title claims abstract description 95
- 238000005457 optimization Methods 0.000 title claims abstract description 26
- 230000035772 mutation Effects 0.000 title claims abstract description 15
- 238000013101 initial test Methods 0.000 claims abstract description 27
- 230000003068 static effect Effects 0.000 claims description 20
- 238000005516 engineering process Methods 0.000 claims description 16
- 230000001360 synchronised effect Effects 0.000 claims description 16
- 230000008859 change Effects 0.000 claims description 14
- 230000004888 barrier function Effects 0.000 claims description 10
- 230000007246 mechanism Effects 0.000 claims description 9
- 230000000694 effects Effects 0.000 claims description 7
- 230000008034 disappearance Effects 0.000 claims description 6
- 208000006011 Stroke Diseases 0.000 claims description 4
- 238000007689 inspection Methods 0.000 claims description 4
- 238000012795 verification Methods 0.000 claims description 4
- 206010008190 Cerebrovascular accident Diseases 0.000 claims description 3
- 230000002159 abnormal effect Effects 0.000 claims description 3
- 230000001174 ascending effect Effects 0.000 claims description 3
- 238000011156 evaluation Methods 0.000 claims description 3
- 230000011218 segmentation Effects 0.000 claims description 3
- 238000004904 shortening Methods 0.000 claims description 3
- IEMCJUJOHAEFFW-UHFFFAOYSA-M potassium 2-[(2-acetyloxybenzoyl)amino]ethanesulfonate Chemical compound CC(=O)OC1=CC=CC=C1C(=O)NCCS(=O)(=O)[O-].[K+] IEMCJUJOHAEFFW-UHFFFAOYSA-M 0.000 claims 1
- 108091008597 receptor serine/threonine kinases Proteins 0.000 claims 1
- 230000008569 process Effects 0.000 description 7
- 230000006399 behavior Effects 0.000 description 4
- 238000012163 sequencing technique Methods 0.000 description 4
- FLDSMVTWEZKONL-AWEZNQCLSA-N 5,5-dimethyl-N-[(3S)-5-methyl-4-oxo-2,3-dihydro-1,5-benzoxazepin-3-yl]-1,4,7,8-tetrahydrooxepino[4,5-c]pyrazole-3-carboxamide Chemical compound CC1(CC2=C(NN=C2C(=O)N[C@@H]2C(N(C3=C(OC2)C=CC=C3)C)=O)CCO1)C FLDSMVTWEZKONL-AWEZNQCLSA-N 0.000 description 3
- 238000004458 analytical method Methods 0.000 description 3
- 238000013461 design Methods 0.000 description 3
- 238000012913 prioritisation Methods 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 230000007812 deficiency Effects 0.000 description 2
- 238000001514 detection method Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 230000008901 benefit Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000000151 deposition Methods 0.000 description 1
- 238000002474 experimental method Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 238000012804 iterative process Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 238000003860 storage Methods 0.000 description 1
- 230000002123 temporal effect Effects 0.000 description 1
- 230000007704 transition Effects 0.000 description 1
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/3684—Test management for test design, e.g. generating new test cases
-
- 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
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
技术领域
本发明属于软件测试中测试用例生成和优化方法,涉及变异测试方法,测试用例生成方法,测试用例集优化方法等。
背景技术
文献“Lingming Zhang,Tao Xie,Lu Zhang Test Generation via DynamicSymbolic Execution for Mutation Testing,ICSM'10Proceedings of the 2010IEEEInternational Conference on Software Maintenance,Pages1-10“公开了一种基于变异测试和动态符号执行结合的测试用例生成方法。该方法通过搜集随机生成测试用例的执行路径,对执行路径上的最后一个谓词进行取反操作,并生成一个新的路径条件。如果该执行路径不存在,则调用约束求解器求解生成新的测试用例。若存在,则对其之前的谓词进行取反,依次类推。当不能生成新的路径条件时,使用动态符号执行进行的测试用例生成过程结束。在生成的测试用例中将满足强变异测试条件的用例输入,其他用例则抛弃。利用该方法生成的测试用例虽然具有较高的变异评分,但由于其使用了传统的语法变异测试技术,在应用过程中时间和资源消耗较为严重,而且由于动态符号执行引发的过程阻塞也经常发生。
发明内容
要解决的技术问题
为了克服现有基于语法变异的测试用例生成方法中变异代价高、资源消耗严重以及生成测试用例充分性不强的不足,本发明提出一种基于语义变异算子的测试用例生成和优化方法。该方法引入了语义变异算子来代替传统的语法变异算子,利用高效的程序语义变异来降低生成变异体的时间、资源消耗,在此基础上通过混合执行对语义变异体的执行路径进行求解,生成对应的测试用例。通过实际测试结果证明,本发明 提出的方法能够利用较少资源和时间消耗生成充分性较高的测试用例。
技术方案
本发明解决其技术问题所采用的技术方案是:一种基于语义变异算子的测试用例生成和优化方法,其特点是主要包括两个部分:一是测试用例的生成,即结合语义变异算子和混合执行生成覆盖率尽可能高的初始测试用例集;二是对初始测试用例集进行优化,即通过对初始测试用例集在各语义变异体执行中的故障检测结果和运行状态捕获,根据本发明提出的相关指标对其进行优化,并评估优化后的测试用例集。
一种基于语义变异算子的测试用例生成和优化方法,其特征在于步骤如下:
步骤1:将被测源程序作为输入,将语义变异算子作用于源程序,生成相对应的语义变异体;
步骤2:使用基于混合执行的测试用例自动化生成工具jCUTE中的jcutec命令对语义变异体进行插桩和编译,生成.class文件,然后使用jcute命令对.class文件进行混合执行,生成与语义变异体相对应的初始测试用例;
步骤3:将每个初始测试用例作为输入,使用程序验证工具Java PathFinder执行所有的语义变异体,得到每个初始测试用例相对应的执行结果:产生变异体总数量Tm,单个测试用例执行一个变异体的时间消耗tn,杀死变异体总数量Km,等价变异体个数Em;
步骤4:依据执行结果对初始测试用例先进行MS优化,再进行AC优化,得到优化的测试用例排序:
所述的MS优化,即将测试用例按照变异评分降序排列,定义为:
其中,Km为杀死变异体总数量,Tm为产生变异体总数量,Em为等价变异体个数;
所述的AC优化,即将测试用例按照平均时间消耗升序排列,定义为:
其中,tn为单个测试用例执行一个变异体的时间消耗,Tm为执行变异体总数量。
所述步骤1中的语义变异算子包括以下20种:
1)RVK:移除volatile关键字:将volatile移除后,变量会被线程保存在本地的内存空间中,而并非直接在主存中进行读写,最终导致数据读写的不一致;
2)SPCR:分割临界区,将一个临界区分割为两个临界区,每个临界区中的代码都仍然是受保护的,但是原临界区的代码集合会改变属性;
3)MSBP:Synchronizaed同步块的参数通常有this关键字或相关对象,该变异算子是将this关键字或相关对象替换;
4)SHCR:移动临界区,将临界区上移或下移可能会引起冲突故障,这时共享的资源不在是同步的了;
5)SKCR:缩小临界区,将临界区的代码移动到非临界区,会引发数据竞争;
6)ASTK:添加Static关键词,在一个同步方法中使用static关键词表示这个类对象不是一个实例对象,如果将一个非静态同步方法变为静态同步方法就会使之变为实例对象,引起错误的锁故障;
7)RSTK:移除静态方法中的static关键词;
8)RSB:移除同步块,引起程序缺失必要的锁,从而导致同步错误;
9)MSL:改变同步块的位置,使未被初始化完成的对象被引用,可以导致双重验证的故障;
10)MXT:作用于wait()、sleep()和join()方法,改变这些方法包含的时间参数,该变异算子使用相同类型不同值替换了时间参数,使线程等待的时间延长或是缩短,从而改变了线程等待的时间;
11)RTXC:将wait()、join()、sleep()、yield()、notify()和notifyAll()方法调用移除,移除wait()方法可以引起可能的冲突,移除join()和sleep()方法能够引起sleep()故障;
12)RJS:将join()方法替换为sleep()方法;
13)RCXC:将以下并行机制移除:Locks(lock()、unlock()),Condition(signal()、signalAll()),Semaphore(acquire()、release()),Latch(countDown()),ExecutorService(submit()),在该语义变异算子的作用下,会导致临界区缺失故障;
14)RFU:将unlock周围的finally语句移除,finally保证了锁最后被释放,如果该语句被移除,那么发生异常的时候不能保证锁被最终释放,会导致临界资源缺失的故障;
15)ASK/RSK:添加/移除方法中的Synchronized关键词,如果该方法中存在临界区,则ASK会引发死锁故障,而RSK则是程序员经常会犯的错误,可能会引发锁缺失的故障;
16)EXCR:扩展临界区,将非临界区的代码添加到临界区中,当另一个临界区也包含这些代码时,会引发死锁;
17)RNA:将notifyAll()方法替换为notify()方法;
18)MSF:改变信号量的公平性,信号量维护了进入资源的许可集合,在信号量的构造函数中有一个可选的Boolean参数,当这个参数设为false时允许不公平地获得许可,MSF是将该参数的true值替换为false或者false替换为true;
19)MXC:作用于并发机制:Semaphores、Latches和Barriers,改变其使用数量;
20)MBR:改变CyclicBarrier类中构造函数中runnable参数,这个参数是在所有的线程完成并且到达这个barrier时发生的,如果这个可执行线程参数存在的话将它移除。
一种对优化测试用例排序进行评估的方法,其特征在于使用APFD评估标准对候选的测试用例集排序进行评估;所述的APFD为故障检测平均百分比,定义为:
其中,n是测试用例的数量,m表示程序中错误的个数,TFi是第一个检测到故障的测试用例的位置;APFD越大,测试用例集发现错误的速度越快,这样的测试用例序列就越好。
有益效果
本发明提出的一种基于语义变异算子的测试用例生成和优化方法,有益效果:
语义变异能够使用较少的开销达到理想的变异效果,本发明提出的方法通过设计一系列的语义变异算子,实现了对程序的语义变异,从而进一步利用混合执行方法生成语义变异体的测试用例,最后基于变异评分和消耗对测试用例集进行优化。该方法克服了传统语法变异测试高消耗的不足,也弥补基于动态符号执行测试用例生成技术过程阻塞的缺陷,经测试使用该方法提高了测试用例生成的效率和覆盖率。
附图说明
图1是基于语义变异算子的测试用例生成和优化方法总流程图;
图2是AirLine程序实验结果;
图3是Account程序实验结果;
图4是DiningPhi程序实验结果;
图5是LinkedList程序实验结果;
图6是UnsortedTree程序实验结果;
图7是RayTracer程序实验结果;
图8是MoldDyn程序实验结果。
具体实施方式
现结合实施例、附图对本发明作进一步描述:
参照图1。基于语义变异算子的测试用例生成和优化方法主要包括以下步骤:
1、生成语义变异体
语义变异体的生成是以被测源程序作为输入,将语义变异算子作用于源程序,生成相对应的语义变异体。那么。该过程首先依赖于语义变异算子的设计和实现,具体的,我们定义程序描述语言为N,程序语义为L,程序的执行行为为(N,L)。不同于传统的语法变异操作(N,L)→(N’,L),语义变异算子的操作方式为(N,L)→(N,L’)。如果更改前后分别执行一个测试用例t,其程序的行为不一致,则认为t杀死了这个变异体。为了描述这种行为不一致,我们引入了程序的语义错误模型。对于每一个程序P,定义其输入域为集合D,输出范围为集合R,以及一个规约说明S,表示从D到R的映射。P是对D上的一个超集进行计算,如果一个输入不在D内,那么其在P上的输出也不在R内。程序错误的语义特征描述了一个在输入域子集上生成不正确输出的计算结果,也就是从输入到输出的一个不正确的映射关系。这种正确与否的标准模型表示,能更好地描述程序行为的不一致性,便于我们寻找程序的错误场景。
对于特定的错误场景,需要对应的语义变异算子实现模拟程序真实的故障,来评估现有的测试集或者指导生成新的测试用例集。因此,如何将错误植入程序,即通过语义变异算子生成变异体,是语义变异最为关键的问题。本发明针对目前最为流行的Java并行程序,分析研究了Java并行程序的故障模式,并在此基础上设计了面向Java并行程序的语义变异算子。具体的,本发明设计了20个语义变异算子,定义如下:
1)RVK(Remove Volatile Keyword):移除volatile关键字。将volatile移除后,变量会被线程保存在本地的内存空间中,而并非直接在主存中进行读写,最终导致数据读写的不一致。
2)SPCR(Split Critical Region):分割临界区,将一个临界区分割为两个临界区, 每个临界区中的代码都仍然是受保护的,但是原临界区的代码集合会改变属性。
3)MSBP(Modify Synchronized Block Parameter):Synchronizaed同步块的参数通常有this关键字或相关对象,该变异算子是将this关键字或相关对象替换。
4)SHCR(Shift Critical Region):移动临界区,将临界区上移或下移可能会引起冲突故障,这时共享的资源不在是同步的了。
5)SKCR(Shrink Critical Region):缩小临界区,将临界区的代码移动到非临界区,会引发数据竞争。
6)ASTK(Add Static Keyword to Method):添加Static关键词,在一个同步方法中使用static关键词表示这个类对象不是一个实例对象,如果将一个非静态同步方法变为静态同步方法就会使之变为实例对象,引起错误的锁故障。
7)RSTK(Remove Static Keyword to Method):移除静态方法中的static关键词。
8)RSB(Remove Synchronized Bolock):移除同步块,引起程序缺失必要的锁,从而导致同步错误。。
9)MSL(Modify Synchronized Location):改变同步块的位置,使未被初始化完成的对象被引用,可以导致双重验证的故障。
10)MXT(Modify Method-X Time):作用于wait()、sleep()和join()方法,改变这些方法包含的时间参数,该变异算子使用相同类型不同值替换了时间参数,使线程等待的时间延长或是缩短,从而改变了线程等待的时间。
11)RTXC(Remove Thread Method-X Call):将wait()、join()、sleep()、yield()、notify()和notifyAll()方法调用移除,移除wait()方法可以引起可能的冲突,移除join()和sleep()方法能够引起sleep()故障。
12)RJS(Replace Join()with Sleep()):将join()方法替换为sleep()方法。
13)RCXC(Remove Concurrency Mechanism Method-X Call):将以下并行机制移除: Locks(lock()、unlock()),Condition(signal()、signalAll()),Semaphore(acquire()、release()),Latch(countDown()),ExecutorService(submit()),在该语义变异算子的作用下,会导致临界区缺失故障。
14)RFU(Remove Finally Around Unlock):将unlock周围的finally语句移除,finally保证了锁最后被释放,如果该语句被移除,那么发生异常的时候不能保证锁被最终释放,会导致临界资源缺失的故障。
15)ASK/RSK(Add/Remove Synchronized Keyword from Method):添加/移除方法中的Synchronized关键词,如果该方法中存在临界区,则ASK会引发死锁故障。而RSK则是程序员经常会犯的错误,可能会引发锁缺失的故障。
16)EXCR(Expand Critical Region):扩展临界区,将非临界区的代码添加到临界区中,当另一个临界区也包含这些代码时,会引发死锁。
17)RNA(Replace NotifyAll()with Notify()):将notifyAll()方法替换为notify()方法。
18)MSF(Modify Semaphore Fairness):改变信号量的公平性,信号量维护了进入资源的许可集合,在信号量的构造函数中有一个可选的Boolean参数,当这个参数设为false时允许不公平地获得许可。MSF是将该参数的true值替换为false或者false替换为true。
19)MXC(Modify Concurrency Mechanism-X Count):作用于并发机制:Semaphores、Latches和Barriers,改变其使用数量。
20)MBR(Modify Barrier Runnable Parameter):改变CyclicBarrier类中构造函数中runnable参数,这个参数是在所有的线程完成并且到达这个barrier时发生的。如果这个可执行线程参数存在的话将它移除。
本发明使用了基于Python语言结合自然语言处理和文本信息匹配的方法,对源程序进行基于特定故障场景的语义变异,生成相对应的语义变异体。
2、生成初始测试用例集
将基于混合执行的测试用例生成方法作用于生成的语义变异体,本发明采用基于混合执行的测试用例自动化生成工具jCUTE作用于源程序和语义变异体生成初始测试用例集。具体做法是将具体执行和符号执行相结合,使用变量符号代替具体的用例输入执行程序,得到程序路径约束的符号表达式,然后对符号表达式进行求解,以得到能够执行指定程序路径的具体输入值。然后用一个随机给定的输入(可以为空值)将程序启动,然后跟踪程序的执行路径,生成该输入数据的条件约束表达式。再对该约束表达式进行约束求解得到新的输入数据,新输入数据是原来输入数据的反例,最后再用该新测试用例跟踪执行路径进行测试,一直重复执行这个迭代过程直到所有的路径都执行完毕或者消耗完规定的时间。这些初始测试用例集基本覆盖源程序和每个变异体程序所有可达路径。
使用jCUTE,只需要基本的Java运行环境,在***变量中加入jCUTE的bin目录即可,无需其它配置。具体的,使用“jcutec”命令对源程序进行插桩和编译,生成.class文件,然后使用“jcute”命令对***桩和编译过的可执行中间程序进行混合执行,生成相对应的测试用例。
3、收集变异体执行信息
以使用jCUTE生成的初始测试用例集作为输入,使用程序验证工具JPF(JavaPathFinder)执行所有的语义变异体,检测程序执行时的可能发生的故障和状态信息。JPF基于形式化的分析与验证技术,即模型检测技术。其基本思想是:将要分析的***抽象表示为状态迁移图,模态和时序逻辑公式表示所要检查***的性质,***是否具有所要求的性质就归结为是否成立。在JPF模型检测工具中,Java的字节码文件为被验证的对象,通过JPF内核的搜索机制,从被验证对象中搜索出与原工具***等价的部分状态,交给Java虚拟机检测。在JPF中自定义的Java虚拟机,可以用来 执行普通的Java字节码,通过存储、匹配和恢复程序状态,JPF可以***地遍历所有的程序状态,从而查找出软件中的缺陷。用户需要提供可执行的Java字节码以及一个配置文件用来指定需要验证的属性。JPF返回一个报告,记录下所需验证的属性是否被满足从而进行进一步的分析,对不符合***性质的检测结果,JPF将在验证报告中显示错误路径及性质违例。
本发明使用Python脚本实现了全过程的自动化,执行结束后产生执行结果及执行信息统计文件,该文件记录了执行变异体数量、测试用例数量、执行消耗时间、消耗内存大小以及有无错误发生等信息。其中,执行变异体总数量记为Tm,变异体执行消耗时间记为Tn,杀死变异体总数量记为Km,测试用例总量记为n,程序故障总数记为m。
4、优化测试用例集
基于变异体执行结果和状态信息,制定测试用例集的优化策略。
(1)MS优化,即将测试用例按照变异评分降序排列。其中,变异评分是衡量一个测试用例发现程序语义故障的能力的大小,随着分值的增大,单个测试用例发现错误的能力也就越大,定义为:
Km为杀死变异体的个数,Tm为变异体总数,Em为等价变异体个数。
(2)AC优化,即将测试用例按照平均时间消耗升序排列。其中,平均时间消耗是指单个测试用例执行变异体的平均时间消耗。该指标表示测试用例执行时的时间消耗,在变异评分相等的情况下,时间消耗越低,优先级越高,定义为:
tn为单个测试用例执行一个变异体的时间消耗,Tm为变异体总数。
以初始测试用例集作用下的语义变异体执行结果和状态信息作为输入,首先执行MS优化,再对结果执行AC优化,最后得到候选的测试用例排序。使用APFD评估标准评估产生的候选的测试用例集排序,APFD(Average of the Percentage of Faults Detected),即故障检测平均百分比,定义为:
其中n是测试用例的数量,m表示程序中错误的个数,TFi是第一个检测到故障的测试用例的位置。APFD越大,测试用例集发现错误的速度越快,这样的测试用例序列就越好。
为了验证本发明提出方法的效果,本发明采用了7个实验程序进行了验证。其中5个小程序(Airline、Account、LinkedList、DiningPhi和UnSortedTree)包含了可以体现Java并行设计理念的多个类,虽然小却在运行时可以产生很多个线程,充分利用了Java的并行机制,这些小程序也是并行程序测试中经常被优先使用的实验程序。另外两个实验程序RayTracer和MolDyn是来自英国爱丁堡大学并行计算中心(Edinburgh ParallelComputing Centre)开发的标准测试集(Java Grande multi-thread benchmark suite),是非常著名的并行程序标准测试集。表1列出了这些实验程序的详细信息,其中包括代码规模和产生变异体的数量。
表1实验程序
程序名 | 代码行数 | 变异体数量 |
AirLine | 38 | 6 |
Account | 52 | 9 |
LinkedList | 179 | 6 |
DiningPhi | 43 | 6 |
UnSortedTree | 122 | 38 |
RayTracer | 1867 | 20 |
MoldDyn | 1352 | 54 |
本发明首先对个实验程序进行语义变异,获得各实验程序的语义变异体;然后使用基于混合执行的方法自动生成7个实验程序的初始测试用例集。表2列出了各实验程序对应的变异体数量和生成的初始测试用例的数量,在此过程中我们剔除了极其少量的垃圾数据。
表2初始测试用例集
程序名 | 变异体数量 | 初始测试用例数量 |
AirLine | 6 | 20 |
Account | 9 | 31 |
LinkedList | 6 | 20 |
DiningPhi | 6 | 20 |
UnSortedTree | 38 | 54 |
RayTracer | 20 | 38 |
MoldDyn | 54 | 74 |
基于上述实验结果,使用初始测试用例集执行各程序语义变异体,然后再使用故障检测方法对初始测试用例集进行故障分析,计算得到每个测试用例集的变异评分和平均消耗。最后使用测试用例优化策略对初始测试用例集进行优化,得到最终的优化序列。表3给出了7个实验程序对应的最终实验结果。
表3 APFD值比较
APFDbest | APFDworst | %Costbest | %Costworst | |
Airline | 81.67 | 68.33 | 3.44 | 34.26 |
Account | 97.50 | 94.17 | 4.49 | 10.50 |
LinkedList | 97.50 | 72.50 | 0.25 | 96.41 |
DiningPhi | 97.50 | 77.50 | 0.13 | 98.51 |
UnSortedTree | 97.50 | 39.61 | 3.65 | 85.19 |
RayTracer | 95.83 | 53.21 | 0.79 | 2103.63 |
MoldDyn | 97.45 | 32.46 | 2.98 | 1716.09 |
表3分别记录了生成的测试用例集在最优排序和最差排序下的平均消耗和APFD值,由表可知,在本发明提出的测试用例优化策略的作用下,对于同一个程序的相同的测试用例集,优化后的测试用例排序APFD值高于在最差排序下的APFD值,说明了优化后的测试用例排序能够更快的发现程序故障,平均消耗时间也较少。另外,实 验发现程序的规模越大,则最优排序和最差排序所表现出发现故障的能力差异也就越大,说明本发明提出的基于语义变异算子的测试用例生成和优化方法非常适合大型的并行程序。因此,发明提出的测试用例生成和优化方法对于并行程序是非常有效的,生成的测试用例可快速有效的检测典型的并行故障,并且尽可能的消耗更少的时间和资源。
附图2-7是每个实验程序分别对应的实验结果图示,其中深色线代表测试用例最差排序,浅色线线代表测试用例最优排序,纵坐标表示执行到当前测试用例所杀死变异体的比例,横坐标为执行过的测试用例总数量。由图可知,在测试用例最优排序下往往执行了少量的测试用例就可以杀死所有的变异体,而在测试用例最差排序下则需要执行更多的测试用例才能杀死所有的变异体,这就表明本发明提出的方法生成的测试用例往往能够发现更多的程序故障。
Claims (3)
1.一种基于语义变异算子的测试用例生成和优化方法,其特征在于步骤如下:
步骤1:将被测源程序作为输入,将语义变异算子作用于源程序,生成相对应的语义变异体;
步骤2:使用基于混合执行的测试用例自动化生成工具jCUTE中的jcutec命令对语义变异体进行插桩和编译,生成.class文件,然后使用jcute命令对.class文件进行混合执行,生成与语义变异体相对应的初始测试用例;
步骤3:将每个初始测试用例作为输入,使用程序验证工具Java PathFinder执行所有的语义变异体,得到每个初始测试用例相对应的执行结果:产生变异体总数量Tm,单个测试用例执行一个变异体的时间消耗tn,杀死变异体总数量Km,等价变异体个数Em;
步骤4:依据执行结果对初始测试用例先进行MS优化,再进行AC优化,得到优化的测试用例排序:
所述的MS优化,即将测试用例按照变异评分降序排列,定义为:
其中,Km为杀死变异体总数量,Tm为产生变异体总数量,Em为等价变异体个数;
所述的AC优化,即将测试用例按照平均时间消耗升序排列,定义为:
其中,tn为单个测试用例执行一个变异体的时间消耗,Tm为执行变异体总数量。
2.根据权利要求1所述的一种基于语义变异算子的测试用例生成和优化方法,其特征在于所述步骤1中的语义变异算子包括以下20种:
1)RVK:移除volatile关键字:将volatile移除后,变量会被线程保存在本地的内存空间中,而并非直接在主存中进行读写,最终导致数据读写的不一致;
2)SPCR:分割临界区,将一个临界区分割为两个临界区,每个临界区中的代码都仍然是受保护的,但是原临界区的代码集合会改变属性;
3)MSBP:Synchronizaed同步块的参数通常有this关键字或相关对象,该变异算子是将this关键字或相关对象替换;
4)SHCR:移动临界区,将临界区上移或下移可能会引起冲突故障,这时共享的资源不在是同步的了;
5)SKCR:缩小临界区,将临界区的代码移动到非临界区,会引发数据竞争;
6)ASTK:添加Static关键词,在一个同步方法中使用static关键词表示这个类对象不是一个实例对象,如果将一个非静态同步方法变为静态同步方法就会使之变为实例对象,引起错误的锁故障;
7)RSTK:移除静态方法中的static关键词;
8)RSB:移除同步块,引起程序缺失必要的锁,从而导致同步错误;
9)MSL:改变同步块的位置,使未被初始化完成的对象被引用,可以导致双重验证的故障;
10)MXT:作用于wait()、sleep()和join()方法,改变这些方法包含的时间参数,该变异算子使用相同类型不同值替换了时间参数,使线程等待的时间延长或是缩短,从而改变了线程等待的时间;
11)RTXC:将wait()、join()、sleep()、yield()、notify()和notifyAll()方法调用移除,移除wait()方法可以引起可能的冲突,移除join()和sleep()方法能够引起sleep()故障;
12)RJS:将join()方法替换为sleep()方法;
13)RCXC:将以下并行机制移除:Locks(lock()、unlock()),Condition(signal()、signalAll()),Semaphore(acquire()、release()),Latch(countDown()),ExecutorService(submit()),在该语义变异算子的作用下,会导致临界区缺失故障;
14)RFU:将unlock周围的finally语句移除,finally保证了锁最后被释放,如果该语句被移除,那么发生异常的时候不能保证锁被最终释放,会导致临界资源缺失的故障;
15)ASK/RSK:添加/移除方法中的Synchronized关键词,如果该方法中存在临界区,则ASK会引发死锁故障,而RSK则是程序员经常会犯的错误,可能会引发锁缺失的故障;
16)EXCR:扩展临界区,将非临界区的代码添加到临界区中,当另一个临界区也包含这些代码时,会引发死锁;
17)RNA:将notifyAll()方法替换为notify()方法;
18)MSF:改变信号量的公平性,信号量维护了进入资源的许可集合,在信号量的构造函数中有一个可选的Boolean参数,当这个参数设为false时允许不公平地获得许可,MSF是将该参数的true值替换为false或者false替换为true;
19)MXC:作用于并发机制:Semaphores、Latches和Barriers,改变其使用数量;
20)MBR:改变CyclicBarrier类中构造函数中runnable参数,这个参数是在所有的线程完成并且到达这个barrier时发生的,如果这个可执行线程参数存在的话将它移除。
3.一种对权利要求1所述的优化测试用例排序进行评估的方法,其特征在于使用APFD评估标准对候选的测试用例集排序进行评估;所述的APFD为故障检测平均百分比,定义为:
其中,n是测试用例的数量,m表示程序中错误的个数,TFi是第一个检测到故障的测试用例的位置;APFD越大,测试用例集发现错误的速度越快,这样的测试用例序列就越好。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610234663.9A CN105868116B (zh) | 2016-04-15 | 2016-04-15 | 基于语义变异算子的测试用例生成和优化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610234663.9A CN105868116B (zh) | 2016-04-15 | 2016-04-15 | 基于语义变异算子的测试用例生成和优化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105868116A true CN105868116A (zh) | 2016-08-17 |
CN105868116B CN105868116B (zh) | 2018-07-24 |
Family
ID=56636422
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610234663.9A Expired - Fee Related CN105868116B (zh) | 2016-04-15 | 2016-04-15 | 基于语义变异算子的测试用例生成和优化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105868116B (zh) |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107463491A (zh) * | 2017-06-28 | 2017-12-12 | 努比亚技术有限公司 | 一种终端软件测试方法、待测终端及计算机可读存储介质 |
CN108664391A (zh) * | 2018-03-13 | 2018-10-16 | 北京邮电大学 | 一种面向程序状态的故障分类方法、变异测试方法及设备 |
CN109582578A (zh) * | 2018-11-29 | 2019-04-05 | 泰康保险集团股份有限公司 | 软件测试用例的***、方法、计算机可读介质及电子设备 |
CN110084369A (zh) * | 2019-04-08 | 2019-08-02 | 西北工业大学 | 基于多目标优化的变异测试变异体约简方法 |
CN111176994A (zh) * | 2019-12-24 | 2020-05-19 | 北京轩宇信息技术有限公司 | 针对嵌入式软件io端口的单元测试用例生成方法及装置 |
CN111539099A (zh) * | 2020-04-17 | 2020-08-14 | 北京航空航天大学 | 一种基于程序变异的Simulink模型验证方法 |
CN111859674A (zh) * | 2020-07-23 | 2020-10-30 | 深圳慕智科技有限公司 | 一种基于语义的自动驾驶测试图像场景构建方法 |
CN112052166A (zh) * | 2020-08-26 | 2020-12-08 | 河海大学 | 一种基于支配关系的测试用例生成方法与装置 |
CN112147967A (zh) * | 2019-06-27 | 2020-12-29 | 北京新能源汽车股份有限公司 | 一种汽车控制器的场景测试用例自动生成方法及装置 |
CN112597011A (zh) * | 2020-12-16 | 2021-04-02 | 测点大数据(苏州)有限公司 | 一种基于多语言的算子测试用例生成和优化方法 |
CN112699054A (zh) * | 2020-08-03 | 2021-04-23 | 徐州工程学院 | 一种软件测试用例有序生成方法 |
CN113128556A (zh) * | 2021-03-10 | 2021-07-16 | 天津大学 | 基于变异分析的深度学习测试用例排序方法 |
CN113434390A (zh) * | 2021-06-21 | 2021-09-24 | 北京理工大学 | 一种基于变异的fpga逻辑综合工具模糊测试方法 |
CN115687158A (zh) * | 2022-12-28 | 2023-02-03 | 北京邮电大学 | 一种协议软件的测试方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105302719B (zh) * | 2015-10-26 | 2017-11-28 | 北京科技大学 | 一种变异测试方法及装置 |
-
2016
- 2016-04-15 CN CN201610234663.9A patent/CN105868116B/zh not_active Expired - Fee Related
Cited By (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107463491A (zh) * | 2017-06-28 | 2017-12-12 | 努比亚技术有限公司 | 一种终端软件测试方法、待测终端及计算机可读存储介质 |
CN108664391A (zh) * | 2018-03-13 | 2018-10-16 | 北京邮电大学 | 一种面向程序状态的故障分类方法、变异测试方法及设备 |
CN108664391B (zh) * | 2018-03-13 | 2021-03-23 | 北京邮电大学 | 一种面向程序状态的故障分类方法、变异测试方法及设备 |
CN109582578A (zh) * | 2018-11-29 | 2019-04-05 | 泰康保险集团股份有限公司 | 软件测试用例的***、方法、计算机可读介质及电子设备 |
CN109582578B (zh) * | 2018-11-29 | 2022-04-05 | 泰康保险集团股份有限公司 | 软件测试用例的***、方法、计算机可读介质及电子设备 |
CN110084369A (zh) * | 2019-04-08 | 2019-08-02 | 西北工业大学 | 基于多目标优化的变异测试变异体约简方法 |
CN112147967A (zh) * | 2019-06-27 | 2020-12-29 | 北京新能源汽车股份有限公司 | 一种汽车控制器的场景测试用例自动生成方法及装置 |
CN111176994A (zh) * | 2019-12-24 | 2020-05-19 | 北京轩宇信息技术有限公司 | 针对嵌入式软件io端口的单元测试用例生成方法及装置 |
CN111539099A (zh) * | 2020-04-17 | 2020-08-14 | 北京航空航天大学 | 一种基于程序变异的Simulink模型验证方法 |
CN111859674A (zh) * | 2020-07-23 | 2020-10-30 | 深圳慕智科技有限公司 | 一种基于语义的自动驾驶测试图像场景构建方法 |
CN112699054A (zh) * | 2020-08-03 | 2021-04-23 | 徐州工程学院 | 一种软件测试用例有序生成方法 |
CN112699054B (zh) * | 2020-08-03 | 2022-02-18 | 徐州工程学院 | 一种软件测试用例有序生成方法 |
CN112052166A (zh) * | 2020-08-26 | 2020-12-08 | 河海大学 | 一种基于支配关系的测试用例生成方法与装置 |
CN112597011A (zh) * | 2020-12-16 | 2021-04-02 | 测点大数据(苏州)有限公司 | 一种基于多语言的算子测试用例生成和优化方法 |
CN112597011B (zh) * | 2020-12-16 | 2024-04-16 | 测点大数据(苏州)有限公司 | 一种基于多语言的算子测试用例生成和优化方法 |
CN113128556A (zh) * | 2021-03-10 | 2021-07-16 | 天津大学 | 基于变异分析的深度学习测试用例排序方法 |
CN113128556B (zh) * | 2021-03-10 | 2022-10-28 | 天津大学 | 基于变异分析的深度学习测试用例排序方法 |
CN113434390A (zh) * | 2021-06-21 | 2021-09-24 | 北京理工大学 | 一种基于变异的fpga逻辑综合工具模糊测试方法 |
CN115687158A (zh) * | 2022-12-28 | 2023-02-03 | 北京邮电大学 | 一种协议软件的测试方法及装置 |
CN115687158B (zh) * | 2022-12-28 | 2023-03-10 | 北京邮电大学 | 一种协议软件的测试方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN105868116B (zh) | 2018-07-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105868116A (zh) | 基于语义变异算子的测试用例生成和优化方法 | |
Wong et al. | A survey on software fault localization | |
Harman et al. | From start-ups to scale-ups: Opportunities and open problems for static and dynamic program analysis | |
Walkinshaw et al. | Inferring finite-state models with temporal constraints | |
Beschastnikh et al. | Mining temporal invariants from partially ordered logs | |
Alba et al. | Observations in using parallel and sequential evolutionary algorithms for automatic software testing | |
Chen et al. | Functional test generation using efficient property clustering and learning techniques | |
Droste et al. | MPI-checker: static analysis for MPI | |
CN105955877B (zh) | 一种基于符号计算的动态并行程序污点分析方法 | |
CN101833499A (zh) | 一种基于可达树的软件测试验证方法 | |
CN107783758A (zh) | 一种智能合约工程方法 | |
Tulsian et al. | MUX: algorithm selection for software model checkers | |
Walkinshaw et al. | Are 20% of files responsible for 80% of defects? | |
CN105159827A (zh) | 一种面向gui软件的可靠性加速测试方法 | |
Arora et al. | A systematic review of approaches for testing concurrent programs | |
Narayan et al. | Mining timed regular specifications from system traces | |
Walkinshaw et al. | Inferring computational state machine models from program executions | |
CN103294595A (zh) | 一种基于遗传算法的软件修复方法 | |
Tang et al. | Compiler testing: a systematic literature analysis | |
Jiang et al. | An integration test order strategy to consider control coupling | |
Harman et al. | Dependence clusters in source code | |
Li et al. | Logtracker: Learning log revision behaviors proactively from software evolution history | |
Reger | Automata based monitoring and mining of execution traces | |
Bu et al. | Path-oriented bounded reachability analysis of composed linear hybrid systems | |
Malhotra et al. | A new metric for predicting software change using gene expression programming |
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 | ||
TR01 | Transfer of patent right |
Effective date of registration: 20200715 Address after: No.1 courtyard, Xili, Yungang North District, Fengtai District, Beijing 100071 Patentee after: BEIJING JINGHANG COMPUTING COMMUNICATION Research Institute Address before: 710072 Xi'an friendship West Road, Shaanxi, No. 127 Patentee before: Northwestern Polytechnical University |
|
TR01 | Transfer of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180724 Termination date: 20210415 |
|
CF01 | Termination of patent right due to non-payment of annual fee |