龙空技术网

用例自动生成——阿里测试之道

效能IT哥 130

前言:

当前看官们对“蚁群算法code”大约比较珍视,大家都想要了解一些“蚁群算法code”的相关知识。那么小编同时在网上网罗了一些关于“蚁群算法code””的相关内容,希望你们能喜欢,各位老铁们快快来学习一下吧!

作者:阿里巴巴技术质量小组 来源:51Testing软件测试网原创

  1.7提升测试的充分性

  围绕把测试做得更好的目标,除了实现更高频持续执行、更高的通过率、更低的噪声、更高的有效性等,还要解决测试遗漏的问题。

  过去,我们的自动化用例主要靠测试人员凭借自己的测试分析能力来列举。但随着团队规模的扩大,越来越多的新人加入,团队人员的测试分析能力参差不齐、测试不充分、遗漏场景和用例,导致出现线上的问题。出现测试遗漏的一个原因是“不知道自己不知道(unknownunknowns)”。

  我们可以从两个角度来提升测试充分性和解决“不知道自己不知道”问题。

  用例自动生成:用技术手段减少测试人员的个人能力差异的影响,减少对个人经验的依赖。

  业务覆盖率度量:用技术手段发现测试遗漏,为补充测试用例、提升测试充分性指明方向。

  1.7.1用例自动生成

  对于人工枚举测试用例(TestCaseEnumeration)来说,一方面人力的多少和水平的高低限制了测试用例的数目和质量,另一方面人工无法穷举所有的输入作为测试用例,也无法想到所有可能的业务场景。为了解决这些问题,用例自动生成技术得到越来越广泛的研究和使用。用例自动生成的重要作用是减少漏测、提效、节省人力成本。

  自动生成测试用例赋能业务场景的情况如图1-8所示。

▲图1-8自动生成测试用例赋能业务场景的情况

  1.从测试用例自动生成技术的角度看

  录制回放是一种运用比较广泛的用例自动生成技术。例如,阿里的双引擎自动回归平台是一个复制线上真实流量并用于自动回归测试的平台。除了录制回放,还有以下几类用例自动生成技术。

  (1)基于符号执行(SymbolicExecution)。符号执行是一种经典的程序分析技术,它以符号值作为输入,而非一般程序执行的具体值。经分析得到路径约束后,通过约束求解器得到客户触发目标代码的具体值,如JBSE、JDart和SUSHI等。但是这种方法存在路径爆炸、路径发散、复杂约束求解难的问题。

  (2)基于模型。这里的模型指能够形式化,程序可以理解和执行的行为描述,包括有限状态机(FiniteStateMachines)、理论证明(TheoremProving)、约束逻辑编程(ConstraintLogicProgramming)、模型检查器(ModelChecking)、马尔可夫链(MarkovChain)。目前,大多数模型仍需手动创建,在真正实现自动化创建模型之前还要克服较多的困难。

  (3)基于搜索。基于搜索的测试用例自动生成技术(SBST)是基于搜索的软件工程(SBSE)的一个子领域。通过定义适应度函数,将测试用例自动生成问题转化为目标优化问题,进而用各类搜索算法来解决。例如,全局搜索算法包括遗传算法、粒子群优化算法和蚁群算法等;局部搜索算法包括爬山算法和模拟退火算法(如JTest、JCrasher、eToc、Randoop、EvoSuite及GRT等)。近年来该技术得到较快发展,例如通过提高代码覆盖率、多目标帕累托优化、强化学习来指导测试参数的变异过程,如Zest、RLCheck等。基于覆盖率的模糊测试(Coverage-guidedFuzzing)也可以归入此类。

  2.从测试过程的角度看

  用例的自动生成包含测试数据的自动生成、测试方法序列的自动生成和测试预言(TestOracle)的自动生成。

  (1)测试数据的自动生成。测试数据包括针对基本类型(如整数型、字符串型)的参数值及针对实体对象类的参数值。应用的技术主要为基于随机的技术、基于搜索的技术和基于程序语义的技术,如符号执行(SymbolicExecution)。目前,业界已经提出了很多为基本类型参数生成数据的技术,但是这些技术对于复杂的被测软件效果仍然不够好,取得的代码覆盖率不够高。另外,针对实体对象类参数生成数据的技术大多局限于通过随机生成方法序列来产生对象状态(如Randoop、AgitarOne、Jtest)或基于搜索生成方法序列来产生对象状态(如EvoSuite)。而最近有一些研究(如JQF、Zest、RLCheck)通过人工撰写数据生成方法(Generator)生成特定的类型或格式的数据,并且和Coverage-guided方法结合起来,针对给定的种子输入参数,进行变异生成新的输入参数,保留覆盖新代码的变异结果作为新的种子,生成的新参数的语义覆盖率更高,在一些基本类型参数值的生成上做得较好,对于提升代码覆盖率和缩短问题发现时间效果明显,如图1-9所示。但是针对实体对象类参数值,完全依赖于人工撰写带参数的数据生成方法(其返回值类型是实体对象类),使得测试数据的生成并不是全自动化的,如图1-10所示。

  我们将人工撰写数据生成方法改造成XML配置的自动化数据生成方法,将复杂的实体类对象生成器进行基于属性(Property)的改造,并且引入线上录制的流量数据,作为更有效的种子初参。通过这些操作,在真实业务系统中,测试人员手写的单元测试用例的代码覆盖率提升了66%。经过变异后,自动生成的符合业务逻辑的入参数据增加了5倍,如图1-11所示。

▲图1-9人工撰写的数据生成方法

▲图1-10人工撰写带参数的数据生成方法

▲图1-11XML配置的自动化数据生成方法

  后续工作:

  根据已有(自动产生或者线上捕获的)参数值采用组合测试的技术,有效覆盖需要现有参数值特定组合才能覆盖触发的Bug或者未曾覆盖的语句。

  在实体对象类参数值的生成上,利用Randoop和EvoSuite生产的方法序列来提取高效的方法子序列自动合成数据。同时利用在线数据学习得出实体对象类的不变量,然后直接构建可以覆盖但未曾覆盖的语句,且满足类不变量的参数对象状态。这里的研究问题是:生成的哪些子序列要放到数据生成方法里?答案是将收集到的子序列中每个方法调用的recieverobjectstates都放到数据生成方法里。这样做会有很多数据生成方法。我们需要探索一些新技术来进一步减少数据生成方法的数量。

  (2)测试预言的自动生成。测试预言的自动生成技术主要通过捕获方法返回值合成回归测试断言(预跑返填)和能推断出运行态状态遵循的属性规约的机器学习技术。业界商用工具ParasoftJtest在自生成测试预言上主要采用捕获方法的返回值合成回归测试断言的技术,只适用于回归测试并且检测Bug能力有限的情况。Agitar的AgitarOne主要采用能推断出运行态状态遵循的属性规约的机器学习技术,而且需要用户人工甄别工具所推荐的断言为真或假。

  我们已经调用观测方法对产生的测试用例中的实体对象的返回值合成了回归测试断言,并且可以一键更新断言的期望值,如图1-12、图1-13所示。

▲图1-12测试预言的自动生成(一)

▲图1-13测试预言的自动生成(二)

  后续工作:为解决测试用例和回归用例的覆盖率增长问题,我们利用自动生成的数据和在线数据,将学习出被测方法的属性规约作为测试预言,然后监控运行产生的测试用例。方法是在数据回放过程中,对被测公共方法通过Daikon插装来学习不变量,这里的问题是:目标属性太复杂,不在其模板覆盖范围内;学到的不变量的噪声可能比较高;运行态额外时间和存储开销很大。

标签: #蚁群算法code