在软件开发过程中,需要频繁地进行软件测试,测试用例需要不断被设计、修改和执行,构成回归测试的测试用例集合[1]。在回归测试过程中,会产生大量冗余的测试用例,有效约简测试用例,利用尽可能少的测试用例最大限度满足给定的测试目标,能够有效提高测试效率,降低测试成本[2-4]。传统的测试用例约简方法主要有贪心(Greedy, G)算法、启发式(Heuristic, H)算法和整数规划等[5]。G算法和H算法总是在当前测试需求中寻找最优的测试用例,所选择的测试用例是某种意义上的局部最优,不能保证全局最优。整数规划法将最优代表集选择问题转化为整数线性规划问题,但时间复杂度较高,运算开销呈指数级增长。
经过多年研究,测试用例约简方法已有了很大改进[5-9]。华丽等[10]利用遗传算法的全局搜索能力获取测试用例优化解集合,再根据蚁群算法的正反馈性得到最小集合的最优解。但该方法的约简效果取决于最初产生的测试用例集,不能从根本上对测试用例进行优化。聂长海等[11]首先提出依据测试需求约简测试用例的方法,根据测试需求间的关联关系对测试用例进行划分,再利用启发式算法、贪心算法等获取可覆盖所有测试需求的最小测试用例集。而在回归测试中测试需求往往包括关注需求集和无关需求集,该方法在约简测试用例过程中,没有考虑无关需求集的问题。顾庆等[1]提出一种启发式贪婪搜索方法,减少了对无关测试需求的覆盖,最大限度地降低了测试成本。陈静等[12]提出一种基于关联模式的测试用例约简模型,根据程序模块、测试需求以及测试用例间的关联关系约简测试用例,但目前该研究仍处于理论研究阶段,并没有实现针对具体测试需求约简测试用例的方法。刘锋等[13]提出一种向量相似度算法,根据测试用例间的相似度、覆盖度和冗余度约简测试用例,但该方法以矩阵形式存储数据,占用存储空间比较大,且容易陷入局部最优解。
针对上述研究中未考虑测试用例间关联关系以及数据存储、计算消耗大的问题,本文提出一种基于变异分析的测试用例约简方法(Reduction method of Test suites based on the analysis of Mutation, RTM)。一方面,从变异测试能够衡量测试用例充分性[14-18]这一特性出发约简测试用例;另一方面,创建二进制形式的变异体事务集矩阵,通过位运算获取测试用例间关联关系。RTM首先根据源程序特征设计变异因子并产生变异体,避免无关变异体被覆盖而降低测试效率;然后将原始测试用例集分别在原程序和变异体上执行,以测试用例能否检测到指定变异体为依据,对测试用例进行划分,创建二进制变异体事务集矩阵;再根据改进的关联挖掘算法获取测试用例间的关联关系,最后根据所获取的关联关系有效约简测试用例。
1 基于变异分析的测试用例约简模型设原始测试用例集T={t1, t2, …, tm},根据源程序特征设计变异因子并生成大量变异体,识别出等价变异体,将非等价变异体定义为P={p1, p2, …, pn}。描述测试用例约简模型需要以下定义。
定义1 变异评分。变异测试最终通过变异评分(Mutation Score, MS)来评估测试用例集的测试充分性,变异评分MS(P, T)通过式(1) 计算获得:
$MS(P,T) = \frac{{killed(P,T)}}{{\left| P \right| - eqv(P)}}$ | (1) |
其中:函数killed(P, T)返回测试用例集T能够检测出的变异体数量;|P|为变异体总数;eqv(P)函数返回等价变异体的数量,等价变异体与原有程序在语法上存在差异,但在语义上保持一致。等价变异体的检测是一个不可判定问题,已有的检测方法主要有静态检测方法和动态检测方法。根据式(1) 可以看出,MS的取值范围介于0到1之间,MS的取值越高,代表测试用例充分性越高,实际缺陷检测能力越强[19]。
定义2 测试需求。将测试用例能够检测到变异体作为测试需求,n个测试需求定义为P={p1, p2, …, pn},那么, P与T之间的映射关系S={(p, t)∈P×T|t能够检测到变异体p},R(t)表示测试用例t能够满足的所有测试需求。
定义3 变异体事务项。将不能够检测到变异体pk的测试用例集合作为一个变异体事务项MListk(MListk={t1, t2, …, tγ}),其中,pk∈P,ti∈T。
定义4 变异体事务集。所有变异体事务项构成变异体事务集,n个变异体事务项构成的变异体事务集表示为MLists={MList1, MList2, …, MListn}。
定义5 变异体事务集矩阵。变异体集合与测试用例集合存在一一对应的关系,所有关系集合组成一个n×m的二进制矩阵A:
$\mathit{\boldsymbol{A}} = \left[ {\begin{array}{*{20}{c}} {{a_{11}}}&{{a_{12}}}& \cdots &{{a_{1m}}}\\ {{a_{21}}}&{{a_{22}}}& \cdots &{{a_{2m}}}\\ \vdots & \vdots & \ddots & \vdots \\ {{a_{n1}}}&{{a_{n2}}}& \cdots &{{a_{nm}}} \end{array}} \right]$ |
矩阵的行表示一个变异体事务项,若事务项MListi中包含测试用例tj,即测试用例tj不可以检测到变异体ai,那么aij=1;否则aij=0。
测试用例约简旨在用最小的测试用例集尽可能地满足更多的测试需求,本文将变异体集合作为测试需求,变异体集合P与原始测试用例集T存在映射关系S={(p, t)∈P×T|t能够检测到变异体p},测试用例约简问题等价于求最小集合覆盖问题。
令R(T)与R(T′)分别表示原始测试用例集T与用例集T′所满足测试需求集,其中T′⊆T,若R(T′)=R(T),并且不存在任何t(t∈T),使R(T′-{t})=R(T),即若测试用例集T与T′满足相同的测试需求,并且不存在比T′更小的集合,使其与原始测试用例集满足相同的测试需求,那么T′为最小测试用例集合,即约简后的测试用例集合。
2 测试用例约简方法本文提出一种基于变异分析的测试用例约简方法(RTM),RTM的测试用例约简流程如图 1所示。
首先在源程序与变异体上分别执行测试用例,以测试用例能否检测到指定变异体为依据,对测试用例进行划分并获取测试用例频繁1项集,根据频繁1项集创建变异体事务集矩阵A,矩阵元素取值0或1,1表示对应测试用例不能够检测到指定变异体,否则能够检测到。设计实现基于二进制矩阵的关联挖掘算法,获取测试用例间的关联关系,根据所获取的测试用例间的关联关系有效约简测试用例。
2.1 初始化变异体事务集矩阵分别在原程序O与变异体集合P={p1, p2, …, pn}上执行测试用例集T={t1, t2, …, tm},以测试用例能否检测到指定变异体为依据,获取测试用例频繁1项集,将不能够检测到指定变异pi(pi∈P)的所有测试用例作为一个变异体事务项MListi,所有变异体事务项组成变异体事务集MLists。
令关联挖掘过程中最小支持度为minSup,将频数大于等于minSup的测试用例降序排列,存储在测试用例列表ErrList中,由变异体事务集MLists与测试用例列表ErrList的映射关系创建变异体事务集矩阵A。矩阵的每一行表示一个变异体事务项,矩阵元素按式(2) 设置。
${a_{ix}}\left\{ {\begin{array}{*{20}{c}} {1,\quad {t_x} \in MLis{t_i}}\\ {0,\quad {t_x} \notin MLis{t_i}} \end{array}{\rm{;}}{t_x} \in ErrList} \right.$ | (2) |
其中,ai为矩阵第i行,对应变异体事务集中第i个事务项MListi。式(2) 表明,若MListi中包含测试用例tx,即tx不能检测到变异体pi,变异体pi相对测试用例tx是可存活变异体,那么tx对应矩阵第i行第x列的元素赋值为1;否则赋值为0。
2.2 约简变异体事务集矩阵初始化创建的变异体事务集矩阵规模比较庞大,其中包含许多冗余的事务项,删除其中无意义的事务项,合并重复的事务项,能够有效缩减矩阵的规模,大幅度提高获取测试用例间关联关系的效率。
约简变异体事务集矩阵,首先需要按照事务项中所包含的测试用例数,对事务项进行排序,即对矩阵A按行降序排序,再对排序后的矩阵进行约简。
逐行约简有序矩阵过程中,若当前预处理事务项MListi(矩阵A第i行)包含测试用例数小于等于1,即
算法1 约简变异体事务集矩阵。
输入 初始化创建的变异体事务集矩阵An×m;
输出 约简后的变异体事务集矩阵An×m。
步骤1 对矩阵A按行降序排列。
步骤2 若
步骤3 若存在MListj,满足
步骤4 增加MListj频数,删除矩阵第i行元素,矩阵预处理行向量下移,重复步骤2。
步骤5 当前预处理事务项MListi下移,即矩阵预处理行向量下移,重复步骤2。
步骤6 删除矩阵当前行及其后所有元素。
步骤7 改变矩阵当前规模。
2.3 获取变异体事务集频繁模式获取变异体事务集的频繁模式L(L={L1, L2, …, Li, …, La-1}),需逐个获取事务项MListi(1≤i < n)与其前所有事务项MListj(1 < j < i)相交的测试用例集合Li,该集合包含相交集合的所有非空子集。若事务项MListi与MListj包含有相同的测试用例,那么MListi与MListj存在交集Lij,对集合Lij进行按位与操作,获取该集合的所有非空子集,每获取一个子集,计算该子集的频数,并将该子集添加到集合Li中。具体过程见算法2。
算法2 获取变异体事务集频繁模式。
输入 约简后的变异体事务集矩阵An×m;
输出 测试用例间的频繁模式集。
步骤1 若∃k(k∈(1, m))满足aik∩ajk=1,那么MListi与MListj交集集合Lij=Lij+{k},添加所有符合该条件的k值到Lij中。
步骤2 令r=|Lij|,二进制数start=1,
步骤3 若l⊆Li,且集合l在Li中的频数为count,那么count=count+aj0;否则count=ai0+aj0,同时令Li=Li+l。
2.4 约简测试用例由频繁项集及其对应的置信度产生关联规则相对较为容易和直观,根据已有的方法即可获取所有的关联规则Rules={rule1, rule2, …, ruleρ},令测试用例约简置信度为minConf,根据所获取的关联规则及其对应的置信度conf可有效约简测试用例。
若测试用例集T′(T′≠∅)与测试用例tb存在关联规则T′$ \Rightarrow $tb,且置信度conf≥minConf,即测试用例集T′不能够检测到的变异体,tb也同样检测不到的可靠程度为conf,该可靠程度达到了测试用例约简的最小置信度值,那么测试用例tb相对于测试用例集T′是冗余的测试用例,即tb为可约简的测试用例。
由于每一个被约简的测试用例tb都存在与其具有极大关联度的测试用例集合T′,即tb相对于T′是冗余的测试用例,那么约简后测试用例集合T′与原始测试用例集合T,执行变异测试后具有相同的变异评分,即约简后测试用例集与原始测试用例集拥有相同的变异评分。
RTM以测试用例能否检测到指定变异体为依据,创建变异体二进制事务集矩阵,采用改进的关联挖掘算法获取测试用例间的关联关系,进而约简测试用例,RTM仅扫描一次数据集,因此最坏情况下,RTM的时间复杂度为n·(n-1),即测试用例约简率不受初始测试用例集的影响。
3 实验结果与分析为验证本文方法(RTM)的有效性,选择经典测试用例约简方法,即贪心算法(G算法)和启发式算法(HGS算法)进行实验验证。G算法在循环迭代过程中每次选择能够覆盖最多测试需求的测试用例,直到所有测试需求均被满足,HGS算法首先根据被覆盖到的测试用例数对测试需求进行划分,再使用贪心算法循环迭代选择能够满足所有测试需求的测试用例集[18]。
3.1 实验设计及评估准则本文实验结果以测试用例约简率、变异评分、测试覆盖率和错误检测率四个指标进行对比和分析。其中,错误检测率表示约简后测试用例集和原始测试用例集能够检测到错误数的比值。错误检错率越大,表示约简后测试用例集相比原始测试用例集,对测试用例检测率的影响越低,错误检测能力越强[19]。
实验程序选择Siemens程序集上(http://sir.unl.edu)上的6个基准实验程序:Mid、Triangle、Cal、NextDate、Tcas与WordUtils程序,表 1为6个程序的相关描述信息。
表 1描述的待测程序信息包括有效代码行数、根据程序特征选择的变异因子、由变异因子产生的变异体数目,以及原始测试用例集的规模。本实验中选择的变异因子的描述信息如表 2所示。
分别在6个程序上使用RTM、G算法和HGS算法约简测试用例,表 3为分别使用3种算法约简测试用例的约简结果。由表 3分析可知,当测试用例规模比较小时,RTM的测试用例约简率并不明显,但当测试用例规模增大时,RTM能够使约简后测试用例约简率平均可达到37%,如程序NextDate,原始测试用例规模为100,RTM的测试用例约简率可达到45%。另一方面,RTM能够获得更高的错误检测率,从实验结果可看出,RTM相对于G算法和HGS算法,能够对原始测试用例集的错误检测率产生更极小的影响,保证测试用例集的错误检测能力。
实验通过变异评分和测试覆盖率综合评估约简后测试用例集的测试充分性,图 2为使用三种算法约简测试用例后的变异评分。由图 2分析可知,RTM能够保证在约简测试用例后变异评分不改变,而H算法和HGS算法在源程序与测试用例规模增大的时候,会极大程度地降低变异评分,影响原始测试用例集的测试充分性。
在相同测试充分性的前提下,单个测试用例的测试覆盖率如表 4所示。由表 4可知,RTM相比G算法和HGS算法,能够使约简后的单个测试用例拥有更高的测试覆盖率。如程序WordUtils,使用RTM约简测试用例后,单个测试用例的测试覆盖率相较于G算法提高了18%,相较于HGS算法提高了16%,约简后单个测试用例的测试覆盖率相比原测试用例提高了一倍。
实验结果表明,RTM相较于传统的G算法和HGS算法,能够获得更小的测试用例集,并使得约简后测试用例集对错误检测率的影响降到最低。RTM能够在保持测试充分性的同时,有效提高单个测试用例的测试覆盖率,提高测试效率,降低测试成本。
4 结语本文针对回归测试中测试用例约简问题,考虑到测试用例间存在的关联关系,结合变异分析和改进的关联挖掘算法,提出一种基于变异分析的测试用例约简方法。通过测试用例间的关联关系有效约简测试用例,使约简后的测试用例在不改变原始测试用例集测试充分性的前提下,大幅度提高单个测试用例的测试覆盖率。
在本文研究基础上,下一步的研究工作主要有两个方面:一方面,将针对降低变异测试效率展开更深入的研究;另一方面,针对未被原始测试用例集检测到的变异体,设计能够杀死该变异体的测试用例,使得测试用例集具有更高的测试充分性。
[1] | 顾庆, 唐宝, 陈道蓄. 一种面向测试需求部分覆盖的测试用例集约简技术[J]. 计算机学报, 2011, 34(5): 879-888. (GU Q, TANG B, CHEN D X. A test suite reduction technique for partial coverage of test requirements[J]. Chinese Journal of Computers, 2011, 34(5): 879-888.) |
[2] | 章晓芳, 徐宝文, 聂长海, 等. 一种基于测试需求约简的测试用例集优化方法[J]. 软件学报, 2007, 18(4): 821-831. (ZHANG X F, XU B W, NIE C H, et al. An approach for optimizing test suite based on testing requirement reduction[J]. Journal of Software, 2007, 18(4): 821-831.) |
[3] | 郭曦, 张焕国. 基于谓词抽象的测试用例约简生成方法[J]. 通信学报, 2012, 33(3): 35-43. (GUO X, ZHANG H G. Approach for reduced test suite generation based on predicate abstraction[J]. Journal on Communications, 2012, 33(3): 35-43.) |
[4] | 邢行, 尚颖, 赵瑞莲, 等. 面向多目标测试用例优先排序的蚁群算法信息素更新策略[J]. 计算机应用, 2016, 36(9): 2497-2502. (XING X, SHANG Y, ZHAO R L, et al. Pheromone updating strategy of ant colony algorithm for multi-objective test case prioritization[J]. Journal of Computer Applications, 2016, 36(9): 2497-2502. DOI:10.11772/j.issn.1001-9081.2016.09.2497) |
[5] | 周冲波, 楼俊钢, 程龙. 基于矩阵行列变换的测试用例约简算法[J]. 计算机应用研究, 2013, 30(3): 779-782. (ZHOU C B, LOU J G, CHENG L. Test suites reduction based on matrix transformation[J]. Application Research of Computers, 2013, 30(3): 779-782.) |
[6] | ZHANG C Q, GROCE A, ALIPOUR M A. Using test case reduction and prioritization to improve symbolic execution[C]//ISSTA 2014:Proceedings of the 2014 International Symposium on Software Testing and Analysis. New York:ACM, 2014:160-170 |
[7] | LIEMANDT J A, SUBRAMANIAM R, ABOEL-NIL S. Test case reduction for code regression testing:US, WO/2014/145604[P]. 2014-09-18. |
[8] | GRAVES T L, HARROLD M J, KIM J M, et al. An empirical study of regression test selection techniques[J]. ACM Transactions on Software Engineering and Methodology, 2001, 10(2): 184-208. DOI:10.1145/367008.367020 |
[9] | ASOUDEH N, LABICHE Y. A multi-objective genetic algorithm for gene-rating test suites from extended finite state machines[C]//Proceedings of the 2013 International Symposium on Search Based Software Engineering, LNCS 8084. Berlin:Springer, 2013:288-293. |
[10] | 华丽, 王成勇, 谷琼, 等. 基于遗传蚁群算法的测试用例集约简[J]. 工程数学学报, 2012, 29(4): 486-492. (HUA L, WANG C Y, GU Q, et al. Test-suite reduction based on genetic algorithm and ant colony algorithm[J]. Chinese Journal of Engineering Mathematics, 2012, 29(4): 486-492.) |
[11] | 聂长海, 徐宝文. 一种最小测试用例集生成方法[J]. 计算机学报, 2003, 26(12): 1690-1695. (NIE C H, XU B W. A minimal test suite generation method[J]. Chinese Journal of Computers, 2003, 26(12): 1690-1695. DOI:10.3321/j.issn:0254-4164.2003.12.011) |
[12] | 陈静, 杨美红, 王鲁, 等. 基于关联模式的回归测试用例约简模型[J]. 计算机工程, 2011, 37(2): 63-65. (CHEN J, YANG M H, WANG L, et al. Regression test case reduction model based on association mode[J]. Computer Engineering, 2011, 37(2): 63-65.) |
[13] | 刘锋, 李朋, 朱二周. 基于向量相似度的测试用例集约简方法[J]. 微电子学与计算机, 2017, 34(3): 35-39. (LIU F, LI P, ZHU E Z. Test case reduction method based on vector similarity algorithm[J]. Microelectronics & Computer, 2017, 34(3): 35-39.) |
[14] | 陈翔, 顾庆. 变异测试:原理、优化和应用[J]. 计算机科学与探索, 2012, 6(12): 1057-1075. (CHEN X, GU Q. Mutation testing:principal, optimization and application[J]. Journal of Frontiers of Computer Science and Technology, 2012, 6(12): 1057-1075. DOI:10.3778/j.issn.1673-9418.2012.12.001) |
[15] | DAOUDAGH S, LONETTI F, MARCHETTI E. Assessment of access control systems using mutation testing[C]//TELERISE 2015:Proceedings of the 2015 IEEE/ACM 1st International Workshop on TEchnical and LEgal aspects of data pRIvacy and SEcurity. Piscataway, NJ:IEEE, 2015:8-13.. |
[16] | PAPADAKIS M, JIA Y, HARMAN M, et al. Trivial compiler equivalence:a large scale empirical study of a simple, fast and effective equivalent mutant detection technique[C]//Proceedings of the 2015 IEEE/ACM 37th IEEE International Conference on Software Engineering. Piscataway, NJ:IEEE, 2015:936-946. |
[17] | KHAN R, AMJAD M. Optimize the software testing efficiency using genetic algorithm and mutation analysis[C]//Proceedings of the 20163rd International Conference on Computing for Sustainable Global Development. Piscataway, NJ:IEEE, 2016:1174-1176. |
[18] | 游亮, 卢炎生. 测试用例集启发式约简算法分析与评价[J]. 计算机科学, 2011, 38(12): 147-150. (YOU L, LU Y S. Analysis and evaluation of heuristic algorithms for test suite reduction[J]. Computer Science, 2011, 38(12): 147-150. DOI:10.3969/j.issn.1002-137X.2011.12.034) |
[19] | 张妍, 傅秀芬. 基于多优化目标的软件测试用例约简方法研究[J]. 计算机应用研究, 2016, 33(4): 1111-1113. (ZHANG Y, FU X F. Software test case reduction method based on multi-objective optimization[J]. Application Research of Computers, 2016, 33(4): 1111-1113.) |