首页 > 范文大全 > 正文

合约变异在测试数据优化中的研究及应用

开篇:润墨网以专业的文秘视角,为您筛选了一篇合约变异在测试数据优化中的研究及应用范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:软件测试是保证Web服务质量的重要技术手段,测试数据生成是Web服务测试的重要内容,而生成的初始测试数据量大,数据冗余,为了减少初始测试数据数量,提高测试数据的有效性,本文在变异测试方法的基础上,使用合约变异方法对初始测试数据进行优化,据此可以生成一批达到一定变异充分度的有效测试数据,并通过实验验证了方法的有效性。

Abstract: Software testing is one of the most important techniques used to assure the quality of Web Services at present. Test data generation is an important topic in Web Services testing. But there are a lot of initial test data, in order to decrease the quantity of initial test data and improve the validity of the initial test data, Based on the optimization of initial test data, this paper presents a method of mutation testing .Using contract mutation technology to optimize initial test data .This method can generate a test meeting a certain mutation score. The results have shown that the method is effective.

关键词:软件测试;测试数据优化;合约变异

Key words: software testing;test data optimization;contract mutation

中图分类号:TP311文献标识码:A文章编号:1006-4311(2010)33-0158-02

0引言

软件测试是保证Web服务质量的重要技术手段,而测试数据作为 Web服务测试的重要内容,它的质量将直接影响Web服务测试的效率和成本。在生成初始测试数据的时候,由于方法上的不足或者其他的一些条件限制,生成的测试数据并不是全部有效的,可能有一部分数据不能达到发现错误或者发现很多错误的效果,并且生成的初始数据数量庞大,其执行需要花费相当多的时间,鉴于这种情况,为了提高测试数据的有效性及测试效率,需要在初始测试数据生成之后进行筛选,根据一定的规则选出一批有效性高的、能发现比较多错误的测试数据。测试数据的优化可以缩小测试集的范围,同时保持测试数据的有效性,以提高测试效率,降低测试成本。

1合约的概念

合约简单来说就是一种规约、契约,它是管理对象之间的交互的一组规则[1-2]。合约可以在运行时被检查,便于捕获Web Services执行过程中的一些故障,提高Web Services的测试效率。

合约的来源是服务提供者的设计规约和服务使用者的实际需求,规定了使用Web Services所需要的条件和Web Services能够完成的功能。常见的合约类型包括:前置条件、后置条件、不变式、循环变式和循环不变式等等[3]。合约表明了过程调用方(客户方)与实现方相互的职责和利益[1]:客户方只有在满足前置条件的情况下才能调用对应的过程;实现方承诺当过程结束时,后置条件指明的工作将被完成,并且不变式仍然满足。合约可用于区分软件失效时的责任:如果前置条件被违反,则应该在客户方寻找错误;如果后置条件或不变式被违反,责任在实现方。本文主要针对前置条件类型合约进行处理,下面给出一个前置条件类型合约的具体实例。

例如,假设有一个求平方根的方法Square(num),该方法中定义的合约如下所示:

Precondition:num>=0;

前置条件表示该方法正确运行所需的条件或限制,如方法Square只能对非负数求平方根,负数不能执行该方法。

合约有助于减少冗余的检查代码,提高软件设计的效率和运行的性能;利用自动检查合约的工具,能够减轻用户的负担,减少用户犯错误的机会,并且合约被违反时引发异常,便于就近定位故障。

2变异测试

2.1 变异测试概念程序变异测试方法始于20世纪70年代末期,最早是由DeMillo,Lipton和Sayward等人提出的,它基于程序员能力假设和组合效应假设,是一种排错性测试技术[4]。

植错法是最早的一种排错性测试方法。其基本思想是首先在被测软件中人为地植入一组错误,然后对该软件进行测试,并将测试过程中发现的错误按照人为植入的错误和原有的错误分别进行登记。如果在软件中人为地植入了k个错误,在测试中发现了n个人为植入的错误和m个非人为植入的错误,那么在“理想情况”下,根据统计知识可以推断出软件中约有(m+n)*k/n个错误。

2.2 变异测试基本原理变异测试的基本思想是对一个给定被测程序P和其对应的一个测试数据集T,通过下面的测试过程来验证测试数据集T的测试充分性:

步骤1:产生被测程序P的一组变异体,即将程序P的代码中的某一处作合乎语法的变更,所产生的程序就是程序P的一个变异体。

步骤2:对原来的程序和它的变异体都使用同一组已知的测试数据进行测试,记录并比较其在每一个数据上的运行结果,如果一个变异体在某个输入上与原程序产生不同的输出值,则称该变异体被该输入数据“杀死”了;反之如果一个变异体在所有的测试数据上都与原程序产生相同的输出,则称其为“活的”。

步骤3:对活的变异体进行分析,检查其是否等价于原程序,并且记录等价变异体的个数。

步骤4:对不等价于原程序的变异体进行进一步测试,补充新的测试用例集,直至测试充分性度量达到令人满意的程度。

变异体的充分性度量由下列公式计算:变异体充分度=D/(M-E)

其中:D为死去的变异体个数;M为变异体总数;E为与原来程序等价的变异体个数。

传统变异测试的流程图如图1所示:

3合约变异

3.1 合约变异算子变异测试的关键是如何产生变异体,而变异算子是产生变异体的依据。一个变异算子是一个程序转换规则,它把一种语法结构转换成另一种语法结构,并且保证转换后程序的语法正确,但不保持语义的一致。变异算子可以针对不同的语法成分来进行,例如关系运算符、谓词、算术表达式等部分来设计变异算子。本文借鉴了传统程序变异中的成熟变异算子,针对Web Services的合约,给出了合约变异算子的定义。合约变异算子的具体描述如表1所示。

3.2 测试数据优化算法测试数据优化算法过程描述如下:假设原程序M,原合约C和一组初始测试数据T1,T2,……Ti,M通过变异算子作用产生了j个变异体M1,M2,……Mj,循环读取初始测试数据,让Ti首先通过合约C的检查,然后执行M1~Mj这j个变异体,当Ti杀死j个变异体中一个或几个,那么记录下Ti,并对杀死的变异体做标记,读取下一条测试数据的时候就不用再执行被杀死的变异体,重复此过程直到所有的测试数据都执行一遍。此时记录下的杀死变异体的数据就是优化测试数据集,同时也获得了计算变异充分度的相关数据,如被杀死的变异体个数,理论上变异体充分度达到1为最佳状态。

4实验

在了解了合约的概念以及变异测试的基本原理以后,通过实验对合约变异在测试数据的优化进行验证,实验以合约变异为主。

以求解三个整数的最小公倍数为例进行实验:假设构件对外提供方法public string gongbeishu(int a,int b,int c),其功能是根据输入的三个整数求出这三个数字的最小公倍数,结果返回一个字符串存放求出的最小公倍数。

首先,利用测试数据生成算法生成一批初始测试数据共243条,再使用表1中的变异算子对原合约进行变异,共产生7个变异体,将初始测试数据分别在源程序和变异体上运行,根据结果来区分“杀死的”变异体和“活的”变异体,最后从“活的”变异体中识别出和源程序等价的变异体。利用上述识别等价变异体的方法,可以得到表2的结果。

5结论与分析

本文基于初始测试数据的优化引出了变异测试的方法,通过采用测试数据优化算法结合合约变异方法对合约变异如何作用在测试数据的优化上进行了详细的阐述,并通过实验说明该方法能够筛选出一批有效的测试数据。

目前,文章仅针对前置条件类型合约进行了变异,并且只利用三种传统的变异算子进行了实验,得出的实验数据有一定的局限性,从某种程度上来说并不太全面,在今后的工作中,我们将针对合约的类型及变异算子的扩充等问题做进一步的研究,希望能在此基础上提高变异测试的效率。

参考文献:

[1] 郑人杰.计算机软件测试技术[M].北京:清华大学出版社,1992,12.

[2] 王剑.有效软件测试[M].北京:清华大学出版社,2003,8.

[3] 姜瑛,辛国茂,单锦辉,等.一种基于合约式设计的测试技术研究[J].软件学报,2004:1-8.

[4] 朱鸿,金凌紫.软件质量保障与测试[M].北京:科学出版社,1997.