没有合适的资源?快使用搜索试试~ 我知道了~
增量突变测试:敏捷开发过程中测试质量的关键性
可在www.sciencedirect.com在线获取理论计算机科学电子笔记294(2013)2-11www.elsevier.com/locate/entcs增量突变测试Mark Anthony Cachia马克·安东尼·卡奇亚1,2 Mark Micallef3克里斯蒂安·科伦坡4马耳他大学计算机科学系姆西达摘要敏捷开发过程的支持者声称,坚持敏捷原则可以以渐进的增量交付高质量的代码。 结果系统的可信度主要是通过使用单元测试套件来获得的,这些测试套件被委托在回归发生时立即捕获回归。 因此,该系统它的可信度取决于它的测试,这意味着测试质量的衡量至关重要。虽然突变测试已经被提出作为一种发现测试套件缺陷的手段,但它还没有在行业中被广泛采用;主要是由于其计算费用和开发人员调查未杀死的突变体所需的手动检索。为了使突变测试的可扩展性,我们提出了增量突变测试-突变测试的变化,它利用敏捷开发的迭代性质,通过限制突变生成的范围来改变自上次突变运行以来的代码部分。初步结果表明,生成的突变体的数量随着生成突变体和对它们执行测试所关键词:突变测试,敏捷开发过程,增量突变测试1介绍软件工程公司发现自己为客户开发系统,这些客户的竞争需求往往导致需求模糊且易于更改的情况。业界处理这种情况的一种流行方法是采用所谓的敏捷开发过程。这样的过程使得软件系统能够以小的增量、频繁的客户反馈和最终的不断适应变化的需求的软件的演进交付成为在这种情况下,开发人员依赖于自动化单元测试来确保任何由代码更改导致的回归都将被检测到。因此,对软件系统的信任只能从测试的感知质量中得出。不幸的是,这个行业往往依赖于工具,1作者感谢Gordon Pace和审稿人提供的有用反馈。2电子邮件:mcac0019@um.edu.mt3电子邮件:mark. um.edu.mt4电子邮件:christian. um.edu.mt1571-0661 © 2013 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2013.02.012M.A. Cachia等人理论计算机科学电子笔记294(2013)23计算原始度量,如语句覆盖率;已被证明提供虚假安全感的度量[1]。突变测试[2]是一种分析技术,它系统地创建程序的错误版本(称为突变体),并检查程序的测试套件是否如果一个特定的突变体未被检测到,即没有测试失败的突变体,它被认为是未被杀死的,并被标记为由开发人员进行调查。尽管变异测试是一种有效的测试套件完整性的测量技术,但它在工业中还没有找到自己的位置。其两个主要原因是由于(1)产生/杀死突变体时产生的计算费用这意味着大量的时间和资源将不得不专用于突变测试,以及(2)从开发时间到开发人员收到反馈所花费的时间长度-这意味着开发人员将发现更难对其采取行动本文的贡献是一种技术,我们称之为增量突变测试。该技术利用了敏捷开发的进化本质,开发人员致力于在产品的整个生命周期中以小的定期增量进行持续改进我们的技术利用这一点,以类似的方式应用突变测试作为一个系统的发展。如果我们从一个完全测试过的代码库开始(最初是一个空的代码库),那么突变测试只需要在代码的一部分上进行,这些代码随着系统的发展而受到变化的影响。我们证明了这种方法的合理性,并表明如果突变测试是增量执行的,计算费用可以大大减少,因此开发人员将受益于短反馈循环,促进他们的分析。因此,突变测试在工业中采用的主要障碍将大大减少。本文的其余部分组织如下。第2节简要介绍了突变测试背后的原理,并讨论了阻止其广泛采用的问题接下来是第3节,它提供了增量突变测试的概述,并正式展示了该方法的合理性接下来,在第4节中,我们给出了一个增量突变测试的实例,并对这个想法进行了初步评估。最后,第5节提供了文献中的相关工作的概述,而第6节得出结论,并讨论了我们在这方面的未来计划2背景突变测试[2](如图1所示[顶部])是一种使用故障注入来分析测试套件的彻底性的技术。本质上,给定一个程序P和一个测试P的测试集T,该方法包括生成P的错误变体(称为突变体),并检查对于每个突变体,T中是否至少有一个测试用例失败。我们写T(P)来表示测试套件T在程序P上的成功运行,写<$T(P)来表示测试套件中至少有一个测试在P上失败。突变测试开始于生成一组程序P1,P2,...,Pn使用由程序P上的函数M表示的一组变异算子,4M.A. Cachia等人理论计算机科学电子笔记294(2013)2defM(P)={P1,P2,...,Pn}。 这些程序通常在语法上类似于P,但从来没有(语法上)等价于它。n·Pi/n P。虽然可能的突变体数量是无限的,但文献中发现的突变在这种情况下,对于程序中的每个'+'实例这导致基于变异算子中涉及的操作数量及其在源代码中的频率的二次计算复杂度[2]。如果对任何Pi∈ M(P)执行T导致至少一个失败的测试,则称T覆盖P,即T充分地测试了P在这种情况下,我们说突变体Pi被T杀死。另一方面,如果没有测试失败发生,我们说Pi是一个未被杀死的突变体,这可能表明T实际上并不覆盖P。在这种情况下,需要人工调查以确定为什么Pi没有被杀。定义2.1测试集T被称为覆盖程序P,记为T d P当且仅当P满足T,T(P),而任何Pi∈M(P)都不能通过测试集,<$T(Pi):TdP=T(P)<$Pi∈M(P)·<$T(Pi)被杀死的突变体与总突变体的比率被称为突变评分,并提供了在生成的突变体的背景下测试套件覆盖率的度量。变异操作符通常被设计为以对应于一个可能由开发人员引入的错误。因此,与语句覆盖分析等技术相比,突变测试提供了一种更可靠的测试套件彻底性度量[3,4]。尽管它的有效性,突变测试支持三个公认的问题[2]。首先,虽然突变测试的多项式计算复杂度似乎并不令人望而却步,但在典型的商业系统中,大量的潜在突变点将使计算费用相当高。其次,一旦产生了突变体,每一个都需要对原始程序的测试套件进行测试。考虑到大型系统上的测试套件将乐观地花费几分钟来执行,这个任务所需的时间将是相当可观的。第三个被引用的突变测试问题是所谓的等价突变问题,其中句法上不同的突变体在语义上是相同的,从而浪费时间和时间。除了这三个问题之外,我们还认为还有第四个问题,一个与调查和解决未杀死的突变体所需的时间和时间有关-每个未杀死的突变体都需要一个开发人员来理解突变体的语义,确定是否需要改变测试套件,并最终修改测试套件以杀死突变体。我们认为,这可能是一个威慑更广泛地采用突变测试,因为执行任务所需的时间和认知时间可能不被认为是值得获得的潜在好处。在这项工作中,我们专注于前两个问题-都有助于突变测试的计算昂贵-通过提出一个增量的方法来突变测试。这种方法只为点生成突变体M.A. Cachia等人理论计算机科学电子笔记294(2013)25Fig. 1. 传统突变测试与增量突变测试的在程序中,自上次应用突变测试以来,- 解决第一个问题。此外,它只调用测试套件中测试更改部分的部分-解决第二个问题。间接地,这也改善了对开发人员的反馈循环,因为他们得到的反馈集中在他们最近正在工作的部分3增量突变测试增量突变测试试图通过利用敏捷开发的进化和测试驱动的本质来缓解与突变测试相关的问题。 其基本思想是限制突变测试的范围 在两个特定代码版本的上下文中更改了5 通过在整个进化过程中对代码的连续版本的每个更改应用突变测试,可以有效地在整个系统上增量地 更确切地说,增量突变测试假设两个程序P1和P2,其中P2是P1的一个演化,使得P2由两部分组成:一个是从P1的相应部分(P1δ)演化而来的 变 化 部 分 ( P2 δ ) , 另 一 个 是 相 对 于 P1 的 未 变 化 部 分 ( P1/δ=P2/δ=P/δ ) 。P1=P1δ+P/δ,P2=P2δ+P/δ。在本文中,复合运算符+假设有一种方法可以将程序分成两个部分,以便这些部分可以独立测试。类似地,我们假设有一种方法可以将测试套件分割成(可能重叠的)部分,这些部分测试相应的程序部分。形式上,我们假设对于5除非另有说明,本文件所指的代码变更指的是语法变更。在实践中,这通常可以通过使用静态分析来实现。6M.A. Cachia等人理论计算机科学电子笔记294(2013)2一个程序P=Pδ+P/δ和测试集T=Tδ+T/δ:T(P)Tδ(Pδ)T/δ(P/δ)(†)此外,我们假设给定两个程序的组成,突变算子依次应用于每个部分,即变化永远不会跨越两个部分。这个假设使我们能够在下面的证明中独立地推理子部分。注意简单突变体,即每次通过一个变异算子改变程序的变异体自然满足该假设。更正式地说:M(P+PJ)={<$Pi∈M(P)·Pi+PJ} <${<$PiJ∈M(PJ)·P+PiJ}(n)命题3.1如果一个测试集Tc在P上,其中T可以被分解为Tδ+T/δ和c,或者相应地P=Pδ+P/δ,则测试集c在Pδ和P/δ上的分解部分分别为:证据Td(Pδ+P/δ)TdPTδd PδT/δdP/δ(D的定义)T(Pδ+P/δ)(根据定义)⇐⇒T(Pδ+P/δ)∧(∀Piδ∈M(Pδ)·¬T(Piδ+P/δ))((根据Trice and de Morgan⇐⇒Tδ(Pδ)∧T/δ(P/δ)∧(∀Piδ∈M(Pδ)·¬Tδ(Piδ)∨ ¬T/δ(P/δ))((根据谓词逻辑)Tδ(Pδ)((D的定义)Tδd PδT/δdP/δQ假设一个测试套件已经被证明可以充分覆盖一个被测系统,在下面的代码演化中,这个信息可以用来最小化检查测试套件所需的突变直观地说,这是通过从突变测试中消除系统的未更改部分来实现的不需要进行彻底的分析,因为这在代码的以前的演变更正式地说,这个想法体现在下面的代码中:M.A. Cachia等人理论计算机科学电子笔记294(2013)27定理定理3.2若证明了P1=P1δ+P/δ可被一个检验集T1,T1d(P1δ+P/δ)充分地修正,则要证明新的检验集T2d(P2δ+P/δ)也可被充分地修正,则必须检验T2δdP2δ:T1d(P1δ+P/δ)T2δdP2δ=T2d(P2δ+P/δ)证据T1d(P1δ+P/δ)T2δdP2δ(第3.1节)=ΔT1δdP1δΔT1/δdP/δΔT2δdP2δ{根据位置逻辑,位置3.1和T1/δ=T2/δ}=ΔT2d(P2δ+P/δ)Q在下一节中,我们提出了一个基于上述理论的增量突变测试的实例,并展示了它对现实案例研究的适用性4实例化增量突变测试的任何实现都假定了底层框架的两个基本属性:(1)代码可以被分割为更改和未更改的部分;(2)测试套件也可以被分割一部分测试改变的部分,另一部分测试它的对应部分。为了促进这个过程,在我们的增量突变测试的实例化中,我们选择方法作为我们考虑的最小单元。这在单元测试的上下文中特别有意义,单元测试通常测试方法(而不是例如一个单独的声明)。因此,关于将系统划分为更改和未更改的部分,我们认为任何有更改的方法(即使只是针对单个语句)都是系统更改部分的一部分,反之亦然。一旦我们确定了所有更改的方法,使用静态分析,我们描述了调用任何更改方法的所有单元测试(类似于Schuller和Zeller这两个方面一起为我们提供了增量突变测试的实例化(如图1所示)。不可否认,这种实例化是幼稚的,因为它没有考虑方法之间的相互连接,这有两个后果:(1)依赖于改变的方法的方法不包括在突变生成中,因此(2)检查改变所影响的方法的测试不包括在杀死突变中。尽管有这些局限性,我们应用我们的方法,以现实生活中的案例研究,有希望的结果。4.1评价过程为了在不同的场景中观察该技术,评估采取了对候选代码库中的三个场景进行实验的形式。每个场景8M.A. Cachia等人理论计算机科学电子笔记294(2013)2包括在两个版本的源代码上执行特意构建的突变测试工具7原型代表了包含高、中、低代码变动的开发周期。表1概述了这些情景。除了代码流失的水平,还有两个变量被确定为有可能影响实验,第一个是变异操作符的选择这方面的决定是基于突变偶联效应假说,该假说指出,复杂突变体与简单突变体以这样的方式偶联,即检测程序中所有简单突变体的测试数据集也将检测到大部分复杂突变体[6]。因此,决定在实验期间只使用十七名常用的简单变异操作员。考虑的第二个变量是候选代码库的选择由于这只是一个初步的评估,Apache Commons CLI Library,由一个适度但不平凡的5 Kernel组成,被选为该任务。除了开源之外,CLI库还有限地使用了面向对象的构造,因此适合我们选择的简单变异运算符。此外,代码库还附带了一个单元测试套件,其拥有97%的语句覆盖率,这意味着一个成熟的测试套件,人们不希望找到过多的未杀死的突变体。实验涉及进行传统的突变测试和增量三种情况下的突变测试考虑到每个场景都包含两个版本的代码v1和v2,v2按时间顺序出现在v1之后,因此对每个场景的v2进行传统的突变测试,而对v1和v2之间的差异进行增量突变测试。在每种情况下,我们都收集了有关生成的突变体总数,被杀死的突变体数量和端到端流程的执行时间的数据,包括静态分析以选择要执行的测试4.2结果在实验过程中收集的数据使我们能够比较和对比增量突变测试和传统突变测试的特性。表2中总结的结果证实,增量突变试验显著减少了产生的突变体数量,因为在情景1、2和3中,增量突变试验产生的突变体回收率分别减少了91%、62%和46%。结果还表明,比较的两个版本的代码之间的代码变动越小,生成的突变体就越少,从而导致更快的执行时间。事实上,通过使用增量突变测试,执行时间显着减少,从而观察到88%至91%的速度改进虽然从计算费用和随之而来的及时反馈的角度来看,这些结果是令人鼓舞的,但当涉及到未被杀死的突变体的数量时正如预期的那样,7The工具可以被下载从http://www.um.edu.mt/data/assets/file/0007/175957/IncrementalMutation_v0_1.zipM.A. Cachia等人理论计算机科学电子笔记294(2013)29#场景LOC Affected#方法已删除1低代码流失1212中代码流失6043高代码流失72024表1评估期间考虑的三种情况场景总突变体Δ取消封杀突变体杀率时间(s)Δ1 -Mt349百分之九十一35百分之九十58百分之九十一1 -IMT305百分之八十三52 -MT253百分之六十二15百分之九十四42百分之八十八2 -IMT9551百分之四十六53 -MT340百分之四十六97百分之七十一79百分之八十九3 -IMT183126百分之三十一9表2使用传统(MT)和每种情况下的增量(IMT)突变测试从突变测试到增量突变测试,因为我们关注的是测试套件中通常存在更多问题的部分。然而,在情景2和情景3中,未被杀死的突变体的数量增加了,因为我们选择要执行的测试的方式很幼稚--进一步的实验(未在下表中显示)表明,执行更多的测试会导致更多的突变体被杀死。在场景1中发生的另一个值得注意的现象是,增量方法中产生的突变体的数量少于传统突变测试中未杀死的突变体的数量。这意味着大量未被杀死的突变体位于我们的方法所描绘的代码段之外。我们认为,这是由于在描述代码时采用了过于简单的方法,这已经被代码更改所影响,但我们将此问题留待将来调查。10M.A. Cachia等人理论计算机科学电子笔记294(2013)25相关工作在突变测试领域,已经进行了各种尝试来优化和降低该技术的计算成本,包括:选择性突变,其中突变算子被策略性地选择[7],高阶突变,其中多个突变被组合成单个突变体[8],以及Schuller和Zeller虽然这些技术与我们的技术是互补的(事实上,我们包括了Schuller和ZellerM.A. Cachia等人理论计算机科学电子笔记294(2013)211将其他引用的优化与我们的技术相结合),我们主要从软件工程的其他领域中获得增量突变测试的经验-据我们所知,增量方法从未被提出用于突变测试。JUnitMax8是一个单元测试运行器,其设计目标是在开发人员工作时为他们提供持续的反馈。当开发人员编写代码并保存时,JUnitMax会自动检查代码的哪一部分发生了更改,并在后台非侵入性地执行相关的测试用例。如果出现任何故障,将通知开发商。这大大缩短了反馈循环,也导致了更快的修复时间,因为失败可能与开发人员刚刚做的事情有关。这类似于增量突变测试,其目的是提供关于测试套件质量的定期的小规模反馈随着代码的发展。符号执行[9]和自动化静态代码分析[10]都是有用的技术,就像突变测试一样,可以解决可扩展性问题。解决这个问题的尝试已经利用了软件开发的增量性质,以有效地执行符号执行[11,12],并选择性地显示开发人员可能感兴趣的自动化静态代码的结果[10]。虽然增量突变测试与这些领域没有直接关系,但我们结合这些想法来优化突变测试的计算效率,并缩短对开发人员的反馈循环6结论和今后的工作基于演化的软件开发过程高度依赖于其支持的测试套件,以确保从一个演化到下一个演化不会发生退化。由于依赖于测试来确保软件系统的可靠性,人们只能找到确保测试质量的方法-它们的覆盖率。虽然突变测试已经被证明在发现测试套件中的缺陷方面是有效的,但是它仍然没有被广泛采用,这主要是由于它在计算中所代表的开销以及反馈到达开发者所花费的时间在本文中,我们介绍了增量突变测试,突变测试的一个变种,它是在软件开发生命周期的演变过程中增量应用的。我们已经正式定义了这个概念,并证明它是合理的。此外,我们已经实例化的增量突变测试,并将其应用到一个温和的案例研究,其初步评估表明,该技术解决了禁止计算费用和及时反馈给开发人员的问题。虽然结果是有希望的,证据表明,我们目前的增量突变测试的实例化是简单的方式它定位突变测试。在未来,我们的目标是应用更智能的方法来选择测试用例,以便考虑到系统单元之间的关系。此外,我们还计划通过在软件 开发 过 程 ( 类似于JUnitMax)中集成增量突变测试来继续减少认知过载问题,从而提供更及时的反馈,以开发8http://www.junitmax.org12M.A. Cachia等人理论计算机科学电子笔记294(2013)2velopers同时也自动消除任何未被杀死的突变体,这些突变体指向刚刚被修复的测试套件中的缺陷这项工作符合我们使突变测试在工业环境中可行的总体目标人们希望这一工作将导致突变测试在商业开发领域变得普遍,从而使公司能够从这种强大的分析技术中获益。引用[1] Sean A.放大图片作者:John G. Cleary,Stuart Inglis,and Mark Utting. Jumble java字节码来衡量单元测试的效率在Proceedings of the Testing:Academic andIndustrial Conference Practice andResearch Techniques - Mutation,TAICPart-MutationIEEE计算机协会。[2] Harman M Jia Y.突变检测的发展概况与分析。ACM SIGSOFT Software Engineering Notes,1993年。[3] J. H.安德鲁斯湖,澳-地C. Briand和Y.拉比切 突变是测试实验的合适工具吗?第27届软件工程国际会议论文集,ICSE'05,第402-411页,美国纽约州纽约市,2005年ACM。[4] M'arcioEduardoDelamaro,Jo s'eCarlosMaldonado,Al bertoPasquini,andAdi tyaP. 去你的 接口突变测试充分性准则:经验评估。经验软件工程师,6(2):111-142,2001年6月。[5] 大卫·舒伯特和安德烈亚斯·泽勒。 Javalanche:java的有效突变测试。 In Proceedings of第七届欧洲软件工程会议联合会议和ACM SIGSOFT软件工程基础研讨会,ESEC/FSE '09,第297-298页,美国纽约州纽约市,2009年。ACM。[6] A.哦,亲爱的。耦合效应:事实或数字。在ACM SIGSOFT '89第三届软件测试、分析和验证研讨会论文集ACM。[7] A.放大图片作者:J. Untch.新世纪的突变测试。第34Kluwer Academic Publishers,Norwell,MA,USA,2001.[8] 岳佳和马克·哈曼。高阶突变测试。信息和软件技术,51(10):1379源代码分析和操纵,骗局2008年/ce:title <$.[9] James C.王符号执行和程序测试。Commun. ACM,19(7):385 -394,1976年7月。[10] 莎拉·赫克曼和劳里·威廉姆斯对自动静态代码分析的可操作警报识别技术进行了系统的文献综述。信息和软件技术,53(4):363[11] 放大图片作者:SuzetteP. Dw yer,SebastianElbaum,andCorinaS. PAsarea nu. 最后的死刑。第16届ACM SIGSOFT软件工程集,SIGSOFT'08/FSE-16,第226-237页,美国纽约州纽约市,2008年ACM。[12] Suzette Person,Guowei Yang,Neha Rungta,and Sarfraz Khurshid.定向增量符号执行。在Proceedingsof the 32nd ACM SIGPLAN conference on Programming language design and implementation ,PLDIACM。
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功