Exploring Test Suite Diversification and Code Coverage in Multi-Objective Test Case Selection

目录

总述

-摘要

-引言

-背景

-实验

-结果

-总结

-总述

文章题目为: 探索多目标测试用例选择中的测试套件多样化和代码覆盖率

本篇为软件测试相关文章。有其他需求请根据题目下载原文阅读。

-摘要

        测试用例选择是一种经典的测试技术。该技术出现的原因是由于预算和时间的不足,所以要选择测试用例中的一部分子集来进行测试。代码覆盖(Code Coverage)是测试用例的真实状态的体现,最近出现了非常热门的研究——测试用例多样性。两者一定程度上存在互补关系,不能相互替代和支配。

        综上,文章提出了新的方法——利用NSGA-II多目标优化最大化所选测试用例之间的代码覆盖率和多样性,结果表明故障检测率有显著提高。

-引言

        软件测试的主要目的就是以有限的预算做最大限度的错误检测。

1、代码覆盖率不一定与测试的有效性有直接的关系。换句话说,不是测试用例覆盖到的代码越多,这个测试就越有效,因为不同代码的重要程度是不同的。一些其他的启发式方法,例如,

①、根据过去的错误覆盖来选择测试用用例;

②、消除相似覆盖的测试用例。

已经被用来提高测试的有效性。

2、测试用例的多样性的核心思想就像文字本身描述的,选择多样性的测试子集,而不是专注于代码覆盖率。这种方法有效的在于,如果没有被测系统的相关数据,那么我们认为被测系统的各个部分都同样容易出错。多样化的选择有利于均匀地覆盖所有部分。通常来说,不能将所有的测试预算都花在代码中的一小部分上。

本文的主要工作就是探索了基于覆盖率和多样性的测试用例选择的有效性,并且在给定的预算(本文的预算为测试的时间)的条件下进行了错误检测,并且尽量最小化执行时间。优化的方法主要是结合Additional-Greedy和NSGA-II。

然后,本文在5个开源项目的16个版本中,测试了两种方法的故障检测率。实验证明,两种方法在不同数据集上的表现有好有坏,并且这两种方法选择的子集几乎没有重叠。基于这项实验,本文提出了一种三目标优化方法,最大化代码覆盖率和多样性,同时最小化测试执行时间。

本文主要贡献如下:

a、提出了一种新的多样性和测试时间的双目标优化算法。

b、比较了基于多样性和覆盖率在真实数据集上的表现情况(有效性)。

c、提出了一种新的三目标测试用例选择方法,该方法最大化了代码覆盖率和测试用例的多样性,同时最小化了测试执行时间。

d、对本文提出的方法进行了实证评估,并将其与两种双目标方法(多样性-时间和覆盖-时间)进行了比较。

-背景

A\背景主要介绍了测试用例启发式算法和评估工具。

1、测试用例启发式算法:测试用例的选择一直是一个重要任务,它的目的是选择一部分测试用例的子集来最大化的显示程序中存在的漏洞和错误。但是错误是事先不知道的,所以这个问题不能被实际解决。有许多常见的策略:①选择代码覆盖率最高的测试用例。②最近的一种启发式方法是选择彼此不相似的测试用例。③其他一些测试用例选择启发式方法优化了总执行时间或过去的错误覆盖率。

        1)基于覆盖率的测试用例选择

        测试用例的覆盖率可以通过测试用例执行的行数占总行数的百分比来度量。然而,除非执行代码,否则这些信息通常是不可用的。这也就是说,我们没办法一眼就看出哪些测试用例的覆盖率是多少,所以要对代码进行静态分析。其中测试用例的覆盖率可以通过其相关的函数调用进行确定。这样一个测试用例的覆盖率是它调用的所有函数的百分比。i.e.对于一个测试用例,仅用它所调用的函数的百分比进行粗略的估算。

        2)基于多样性的测试用例选择

        基于多样性的测试用例选择也是最近几年才被应用。衡量两个测试用例的多样性:不相似性的距离函数;衡量三个及更多测试用例的多样性:平均成对多样性。

        假设每个测试用例被编码为二进制向量,1对应测试用例会对程序的部分造成响应(例如会经过某些函数),这样一个测试用例就被编码为一个行向量。

        衡量多样性的差异函数:

1、Hamming diversity(汉明差异)

两个测试用例之间的汉明距离是不匹配数与位置总数之比。例如,设A=(1,1,0,1,0,0),B=(1,0,1,1,0,1),那么他们之间的汉明差异Hamming div (A;B) = 3/6 = 0:5。

2、Levenshtein(莱文斯坦距离

莱文斯坦距离是将一个序列转换为另一个序列所需的编辑操作(插入、删除或替换)的最小数量。它并不要求两个序列之间要等长。

3、Dice diversity:

Dice公式在基于模型的测试中是最有效的。Dice公式:

Dice公式

        

4、Diversity vs. Coverage:

多样性和覆盖率是两个完全不同的评价标准。有时多样性会随着测试用例的选择的增多而减少。此外,具有最大覆盖率的一组测试用例并不能保证该集具有相当数量的多样性,反之亦然。

给出一个覆盖率和多样性的案例:

下面是对于代码块的编码:

对于两个测试用例的情况来说,{T1,T2}的组合保证了做大覆盖率,但是并没有做到多样性最大化。原因是T1,T2中有重复的部分,可能会暴露类似的错误,从而相对减小了多样性。而{T1,T3}的组合既保证了覆盖率最大,也保证了多样性的最大化。

B\优化算法

        优化算法主要提出了两部分,单目标优化和多目标优化。

1)单目标优化:

        单目标优化函数的目的就是单一的提升覆盖率和多样化的其中一个。单目标优化一般要用贪心算法去做,以上图的示例为例,如果要进行覆盖率的优化,贪心序列就是T1,T2,T3。用贪心算法进行优化的整体过程就是按照可用的预算和资源,从贪心序列中依次选择测试用例。

        贪心算法的一个变体为附加贪心算法(Additional-Greedy algorithm)。每当下一个测试用例被选择时,它会给出最佳的客观值。在文章所做的工作中,附加贪心算法比贪心算法更加有效。

        遗传算法(Genetic Algorithms)从一代到另一代的进化包括四个主要操作:选择、交叉、突变和抽样。

        文中还给出了其他的几种相关算法,例如基于图的测试用例排序算法,其他一些优化测试用例选择算法是基于整数规划、聚类、爬坡、模拟退火等。

2)多目标优化:

        多目标优化是针对多个优化目标进行的。就本文而言,我们进行多目标优化的最终目的就是找出一个具有良好代码覆盖率并且不需要花费太多时间而进行的测试用例。在这种情况下,优化标准之间的权衡就变得非常重要。因为我们事先不知道代码覆盖率和多样性哪一个更重要,也就无法确定他们之间的权重。

        帕累托前沿面(Pareto Front)实际上是一种博弈论策略,它的核心思想是:一个目标不可能在不影响另一个目标变差的情况下而得到优化。也就是说一个目标的优化必定会引起另一个目标情况的变差。目标是找到一个决策向量x的变量来优化函数向量。

帕累托平面

        这里涉及到一个支配性的问题。现在考虑决策向量的集合S,使得S中的任何向量都不受任何其他决策向量的支配。则S中的向量为帕累托最优,相应的目标函数fi(x)形成帕累托前沿。解决方案b被a支配,因为a用更少的执行时间实现了更高的覆盖率。然而,a和c都在帕累托前沿,因此它们都不受对方支配。

3)优化技术

        单目标优化算法也适用于多目标优化问题。在先前研究覆盖率和执行时间的多目标优化工作中,通常是把覆盖率和执行时间的比值作为单个目标。因为我们通常想得到更大的覆盖率和更短的执行时间。在讨论多样性的问题中,我们也可以将多样性和执行时间的比值作为单目标进行优化。

NSGA-II(非支配排序遗传算法)是一种基于遗传算法的多目标优化技术。NSGA-II的输出是一组非支配解。这里涉及到一组概念,支配、被支配和非支配。

——支配(dominnate)

支配:A的所有都比B好,称为A支配B。
被支配:B的所有都比A差,称为B被A支配。
非支配:A中有比B好的也有比B差的,称A与B为非支配关系或不相关。

——序值(rank)和前端(front)
        如果 p 支配 q,那么 p 的序值比 q 的低。如果 p 和 q 互不支配,或者说, p 和 q 相互非劣,那么 p 和 q 有相同的序值。序值为 1 的个体属于第一前端,序值为 2 的个体属于第二前端,依次类推。显然,在当前种群中,第一前端是完全不受支配的,第二前端受第一前端中个体的支配。这样,通过排序,可以将种群中的个体分到不同的前端。

——拥挤距离(crowding distance)
        拥挤距离用来计算某前端中的某个体与该前端中其他个体之间的距离,用以表征个体间的拥挤程度。显然,拥挤距离的值越大,个体间就越不拥挤,种群的多样性就越好。需要指出的是,只有处于同一前端的个体间才需要计算拥挤距离,不同前端之间的个体计算拥挤距离是没有意义的。

 非支配遗传算法,或者说是所有的多目标优化问题中,都找不到唯一最优解。所以我们进行非支配遗传算法后得到的是一组最优解,如下图,我们所得到的最优解就是一个帕累托前沿面(黑色标注的点),它是一组最优解的集合。

-下面给出NSGA-II的算法流程

     

首先,随机初始化一个父代种群P(0),并将所有个体按非支配关系排序且指定一个适应度值,如:可以指定适应度值等于其非支配序 i(rank),则1是最佳适应度值。然后,采用选择、交叉、变异算子产生下一代种群Q(0),大小为N。

首先将第 t 代产生的新种群Q(t)与父代P(t)合并组成R(t),种群大小为2N。然后R(t)。进行非支配排序,产生一系列非支配集 F(t) 并计算拥挤度。由于子代和父代个体都包含在 R(t) 中,则经过非支配排序以后的非支配集 F(1) 中包含的个体是 R(t) 中最好的,所以先将 F(1) 放入新的父代种群 P(t+1) 中。如果 F(1) 的大小小于N,则继续向 P(t+1) 中填充下一级非支配集 F(2),直到添加 F(3) 时,种群的大小超出N,对 F(3) 中的个体进行拥挤度排序(sort(F(3),≺n)),取前N−|P(t+1))|个个体,使 P(t+1) 个体数量达到N。然后通过遗传算子(选择、交叉、变异)产生新的子代种群 Q(t+1)。

最终我们会得到一组非支配解。

-实验

        本节主要介绍实验细节,讨论研究问题和评估技术。

1)测试用例数据集

上述所用的程序都是实际应用程序,因为在应用程序是具体有多样性的。 

2)测试用例表示和执行时间分析

        我们需要先知道测试用例的执行时间,根据测试用例的执行时间来表示测试用例总方法调用的百分比。

        文章中将Additional-Greedy and NSGA-II algorithms用于双目标优化。为了进行公平的比较,在这种情况下,我们还使用了规模为200的随机初始种群,使用单点交叉和位翻转突变进行5000次适应度评估。考虑到算法固有的随机性,对于每个被测系统,我们对这些算法执行了20次独立运行。

-结果

        对我们的实验结果进行了展示和分析。

在实验过程中,我们已经分别得到了近似最优多样性的解和近似最优覆盖率的解。我们要对产生的结果进行的工作就是评估多样性与覆盖率之间的平衡关系。

我们首先要确定这两组近似最优解的检测错误的能力,下图是在一段时间内检测到的错误的平均百分比。

我们以一组比较有代表性的数据为例来分析,

随着时间的增加,基于多样性的方法比基于覆盖率的方法获得更高的平均错误。对于某些Math版本(例如,Math V99-104),多样性继续检测新的错误,而覆盖率似乎随着时间的推移而饱和。

然而,在某些情况下,与基于覆盖率的方法相比,多样性的表现并不明显,有时覆盖率似乎比基于多样性的方法表现得更好。例如,JBoss V1和V3的多样性和覆盖率的有效性似乎是相似的。另一方面,对于Derby V5和Math V105-106,使用覆盖率优化检测到的故障数量远远大于使用多样性优化显示的故障数量。

下面详细显示了结果

其中ci表示使用覆盖率优化在一定时间内找到的程序错误百分比。

       di则表示使用多样性优化在一定时间内找到的程序错误百分比。

对这些数据进行统计学检验,其中浅绿色或深蓝色着色的道标中位数差异具有统计学意义。

以上结果表明,尽管多样性似乎在更多情况下更有效,但多样性和基于覆盖率的方法中没有一个完全占主导地位。因此,我们要继续探究二者是否具有互补地位。

-互补性

        为了探究二者是否有互补关系,文中检查了使用多样性和覆盖率优化的所有解中,有多少解是相同的。

红色为二者共同的解空间,只有很少一部分。这就证明了二者实质上不存在互补关系。尽管这两组解是不相同的,但这也不能证明二者不存在互补关系,因为他们的解可能在很大程度上是相似的。因此,文中对二者解的汉明距进行了计算,

汉明距越高,说明二者的解越不相似,所以将这两种优化策略结合起来是有意义的。

上图是将二者结合起来的结果,数字仍然表示检测错误的百分比。绿色着色的数据表示多样性明显优于三目标优化的解,蓝色表示覆盖率优化明显优于三目标优化的解。

只有少数单元格被遮蔽,在大多数情况下,三目标公式比两个双目标公式更有效地揭示错误。

此外,没有一个单元格是被两者完全着色的,所以换句话来说,三目标优化是一种更安全的方法。(永远不会被两个双目标公式同时超越)

-总结

        在大型测试用例中,识别最有效的测试用例是很必要的,因为测试的时间和资源是有限的,不可能将所有的测试用例都测一遍。近些年来,相关领域的研究学者们提出了其他启发式的方法,例如用测试用例多样化去代替覆盖率的方法。本文进行的双目标优化中,分析了基于覆盖率和基于多样性的测试用例选择方法,其中第一个目标是最大化多样性/覆盖率,第二个目标是最小化测试执行时间。最终的目标是以最少的执行时间(成本度量)找到最能揭示错误的测试用例。我们的研究表明,基于多样性的方法比基于覆盖率的方法略微有效。更重要的是,研究表明这两个解集几乎没有重叠。

        -这激发了一种三目标的方法,可以最大化多样性和覆盖范围,同时最小化执行时间。

        测试用例优化这一领域还很年轻,未来我们还计划通过分析额外的距离函数和编码来扩展这项研究。并且还有可能将程序运行的历史信息应用到实际工作。

        

       

        

        


目录

目录

-总述

-摘要

-引言

-背景

-实验

-结果

-总结


  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值