本周课堂汇报需要讲解论文《Improving Test Effectiveness Using Test Executions History: An Industrial Experience Report》的后半部分(第Ⅳ-Ⅷ节),记录阅读笔记。
这篇论文主要研究了使用测试执行历史来进行测试选择和优先级排序的技术在实际项目中提高测试有效性。测试执行历史中包含了非常重要的信息——历史测试失败频率、测试失败之间的关联和测试开销。本文前半部分,测试选择从这三个信息的角度出发分别设计了FreqSelect、AssocFreqSelect和TheoSelect三种方法;优先级排序在Kim's Pro和Google's Pro的基础上提出了Prio方法。
Ⅳ. 采用的方法的结果
A 测试选择:
三个评估度量:
- 总测试执行时间减少:揭示通过执行每种测试选择技术减少的测试执行时间
- 未通过测试的次数:揭示未执行选择而可能错过的真阳性测试失败的百分比
- 总成本降低:根据具体成本值显示测试减少的影响及副作用
总成本=测试基础设施成本+实践者检查假阳性测试失败的努力+如果没有选择重要测试则跳过测试失败的成本
总成本降低:
表Ⅰ:三种选择方法的评估结果(分析)——测试之间的关联是提高测试有效性的重要信息来源
TheoSelect显著降低测试成本,但通过测试失败次数也更多。操作者可以选择降低总成本、容忍测试过程中遗漏某些故障;但是太多遗漏也可能会对最终用户有影响。——即使利用基于成本的测试选择方法,实践者仍可能面临漏检测试失败和测试成本之间的权衡。
B 测试优先级排序:
两个评估度量:
- 达到第一个测试失败
缩短了第一次故障之前的执行时间(图3:该方法有效减少了测试执行次数)。
- 尽早达到所有测试失败
测试失败的累计提升图曲线下的区域(图4:对于几乎一半的批次,该方法提供的顺序要么很精确要么非常接近最优顺序;与FreqSelect或AssocFreqSelect结合使用使也表现类似)。
——通过简单地考虑测试过去的有效性来确定测试优先级可以极大地帮助减少到达第一个故障的时间以及提供运行测试的顺序接近最佳。
Ⅴ. 在行业中实施该技术的挑战以及经验教训:
挑战1:不愿跳过不必要的测试
解决方案:将技术重点放在测试优先级排序上;不是只提供历史执行信息来说明,而是解释为什么可以取消这些测试。
经验教训:开发人员、测试人员通常会对测试过程中的任何更改保持警惕,因此更喜欢侵入性、危害更小的解决方案。
——侵入性较小的方法更容易被接受。
有些测试是有特殊目的的,不该被跳过。
——被证明无效的测试可能是特别为特殊目的而设计而不是过时的。测试选择和优先级排序技术应该考虑这些特殊情况。
挑战2:处理假阳性测试失败的方法
描述:例如,测试失败可能只是与系统中的硬件故障或噪声相关,而不是主要产品代码中的实际问题。在分析测试执行历史时,需要考虑假阳性;应优先考虑假阳性失败较少的测试。
解决方案:首先结合对测试日志的分析来帮助确定测试失败是由于测试基础设施还是真正的产品问题;本文方法只考虑测试失败的测试执行历史,因此更倾向于选择那些提供更多真阳性测试失败的测试。
经验教训:假阳性测试失败盛行,某些软件系统中,现场环境可能噪声大且复杂,测试基础设施和环境可能会导致大量的测试失败。
——主动处理测试结果中的假阳性可以帮助从业者接受这些对测试选择和优先排序技术的建议。
挑战3:测试失败漏检率与测试成本之间的权衡
描述:降低测试成本可能增加漏洞率,这两者之间需要一个权衡。降低测试成本的情况下,决定接受多少疏漏是一件具有挑战性的事情。
解决方案:使用Herzig等人的方法将两者概括为一个统一的成本度量;与从业者进行会议,制定政策。
经验教训:从业者并不总是强烈反对高漏洞率,他们认为一些bug肯定会在接下来的测试阶段被捕获,让某些bug通过某些测试阶段,然后在另一个阶段捕获可能会更经济。
——漏检测试失败并不总是一种负面现象,实践者可能更喜欢在某些阶段降低测试成本,并使用其他测试策略来捕捉漏掉的故障。
挑战4:处理测试依赖关系
描述:实验观察到测试经常同时失败。AssocFreqSelect旨在识别经常同时失败的测试,以降低测试成本。共同失败可能是测试相关性造成的。在之前的测试中,测试依赖性通常被认为有害(例如,两测试依赖于顺序,A需要在B之前执行,则可能无法利用测试选择和优先级排序技术降低成本)。
解决方案:作者发现共同失败的测试往往都依赖于一些公共的外部资源。必须用相关硬件手动标记测试的外部依赖项。
经验教训:研究中存在许多共同失败的测试,即使它们可能在功能上独立或被认为互不相关。作者发现可以将研究工作分配到提供更具说服力的静态分析技术,以自动识别测试之间关联的根本原因,从而在测试选择和优先级排序中产生更优化的方法。
——共同失败的测试可能在功能上不相互依赖,而是对一些外部资源共同依赖。
挑战5:决定测试的粒度
描述:单元测试更加集中和本地化,端到端系统测试具有更大的范围和规模,因此决定每个测试过程的正确粒度级别有时是一件具有挑战性的事情。集中单元测试的运行和调查成本低;端到端系统测试可能更现实,在捕获更可能存在于真实环境中的错误方面更有效。
解决方案:分析了从AssocFreqSelect的共同失败分析中获得的关联,检查较低级别的单元测试和更昂贵的端到端系统测试之间是否存在关联。如果有关联,则从业者可以考虑只执行单元测试,节省端到端系统测试的成本。
经验教训:发现单元测试和端到端系统测试的重叠并不明显,且大部分真阳性测试失败都是端到端系统测试检测到的。
——单元测试和端到端系统测试的测试失败几乎没有重叠。为了降低成本而取消更昂贵的测试可能会对整体产品质量造成重大影响。
Ⅵ. 结果有效性和威胁
外部有效性:该研究只针对了Ericsson其中一个子系统的测试过程中的一个领域,结果和经验可能不能一概而论;该研究结果只是基于对六个月的测试结果的模拟,在测试执行历史较短的系统中采用测试选择和优先级排序技术可能会不同;采用的参数可能只适用于ELS。
建构效度:对本文方法的评估是基于对测试过程的模拟,该系统的质量并没有通过将本文方法融入到实践中来进行评估;本文的测试选择和优先级排序的目标可能并不总是和实践者的一致;TheoSelect方法的参数可能并不总是完全符合现实;该研究是基于测试前所有可用数据进行的,然而离测试日期越近的测试结果可能更能预测测试结果;本文测试评估模拟假设测试之间独立,即可以重新排序或跳过测试而不影响其他测试,但该假设可能并不总是成立。
内部有效性:本文方法依赖于从业者提供的标签来确定测试失败是否为假阳性,可能并不准确;评估采用的方法的模拟没有考虑这些方法对正在测试的批量提交的影响(例如跳过某些测试可能会导致不同测试过程,但是模拟不能改变历史测试执行)。
Ⅶ. 相关工作
为了提高测试的有效性:
Laali等人:测试用例最小化、选择和优先排序
静态分析和测试覆盖被用作提高测试有效性的主要信息来源:
Saha等人:将测试优先级问题简化为标准信息检索问题。假设测试用例和源代码通常包含可被视为自然语言的有意义的标识符和注释,因此可以利用信息检索技术来为运行测试指定优先级值。
Nardo等人:可以利用更细粒度的覆盖信息来节省执行成本并同时保持故障检测能力水平。
Koochakzadeh等人:测试覆盖信息本身对于消除测试冗余可能具有误导性,并且可能导致较弱的测试用例。
尽管已有研究,但基于静态分析和测试覆盖的方法并不适合本文的主题系统(系统复杂性,源代码通常不可用或只有部分可用),因此本文采用了基于历史测试执行信息的方法。
有关测试执行的历史信息是提高测试有效性的宝贵资源:
Zhu等人:使用测试的共同失败历史来确定测试优先级。
Noor等人:根据测试执行历史建立logistic回归模型,对测试用例有效性排序。
Anderson等人:提出了一种基于测试执行历史的分类预测测试失败的方法。
利用基于搜索的技术优化测试效果:
Panichella等人:提出了一种基于多样性遗传算法的定制遗传算法测试用例选择方法。
Tyagi等人、Souza等人:使用了基于多目标的方法帮助确定测试优先级和选择。
对测试实践进行了实证研究。
Labuschagne等人在实践中提出回归测试成本度量的研究。该研究强调了本文这样的工作对于提高大型软件项目中持续集成流的测试有效性的重要性。
Ⅷ. 总结
由于软件测试在软件项目中消耗了大量的资源,因此提高测试有效性是非常重要的。本文采用并定制了多种测试选择和优先级排序技术,通过在测试数据上模拟,证明了本文方法在降低成本和测试执行时间方面的有效性。结果表明,本文的独立测试优先级排序方法显著优于本文的所有选择方法、优先级排序和选择方法的组合以及随机排序。因此得出结论,测试优先级排序是在测试过程中节约成本的最有效且侵入性最小的方法。但是,测试选择方法也可以用于可以接受大量跳过的场景。同时,本文还以经验报告的形式记录了面临的挑战和吸取的教训。本文的发现突出了利用测试执行历史来提高测试有效性的机会和挑战。