cover_image

基于流量录制的接口case自动生成

周瑞莉、黎斌 高途技术 2024年07月03日 01:01

图片




背景




接口自动化测试是测试效率提升和质量保障的关键技术手段,我们常以接口功能覆盖率、代码覆盖率、运行稳定性来评估自动化建设的成熟度,同时用自动化发现bug数占比、效率提升情况来定义自动化的收益情况,并以此建立闭环来驱动自动化覆盖率和运行稳定性的不断提升。

由此可见,自动化覆盖率是自动化建设中的一个重要指标,其实覆盖率的统计和衡量方式多样,包括接口覆盖率、核心功能覆盖率、代码覆盖率等,但是无论哪种统计方式,覆盖率的提升都依赖于自动化case的持续、精准维护。

在当前的经济形势下,各个公司都在降本增效,研发测试团队的人力比已经远大于5:1,业务测试占据了测试人员80%以上的人力,自动化case的持续、精准维护受到严重的影响,从而也形成了自动化测试需求、自动化建设时间的恶性循环,如何能够高效的提升自动化case维护效率、降低自动化维护成本、提高自动化收益成为一件迫在眉睫的事情。

基于流量录制的接口case自动生成应运而生。





目标




降低自动化case的维护成本,提升自动化case的覆盖率,提升测试效率。





实现方案




图片


jvm-sandbox-repeater

在深入分析并比较了行业内广泛采用的流量录制框架后,结合我们对实际应用需求的详细考量以及高途所使用的主要编程语言架构,我们最终决定选用阿里巴巴开源的jvm-sandbox-repeater作为流量录制功能的核心基础框架。


图片

 

JVM-Sandbox-Repeater是一款功能强大的流量录制工具,它基于JVM沙箱环境,能够捕获并记录所有网络流量,从而实现对应用程序执行轨迹的详细记录。

JVM-Sandbox-Repeater在JVM的沙箱环境中工作,利用安全管理器执行安全策略。为了捕获网络流量,它会修改安全管理器的行为,通过扩展安全管理器来拦截网络流量。具体实现上,JVM-Sandbox-Repeater使用Java的代理技术为网络操作创建代理对象,并拦截相应的方法调用。这样,在记录网络请求和响应数据之前,JVM-Sandbox-Repeater可以进行必要的处理。


图片


优点:

  1. 无侵入性:JVM-Sandbox-Repeater在运行时动态地将自身附加到目标JVM进程中,无需修改目标应用的代码或配置,实现了对应用的无侵入性录制和回放。

  2. 通用性强:它支持多种协议的录制和回放,如HTTP、Dubbo、Java等,可以适应不同的应用场景和需求。

  3. 扩展性好:基于插件式的架构设计,用户可以方便地扩展和定制自己的录制和回放逻辑。

  4. 易于使用:提供了简单易用的API和配置方式,用户可以快速地集成和使用JVM-Sandbox-Repeater。

  5. 回放精度高:能够精确地回放录制的流量,包括请求的入参、返回值以及子调用的序列等信息,有助于发现和解决潜在的问题。


缺点:

  1. 对服务运行环境有一定侵入:虽然JVM-Sandbox-Repeater以无侵入的方式附加到目标JVM进程中,但在挂载瞬间会占用较多的机器资源,当业务量大时可能会导致服务性能下降或夯住。

  2. 功能尚不完善:虽然JVM-Sandbox-Repeater已经提供了基本的录制和回放功能,但在一些复杂的场景下,如跨服务调用、异步调用等,可能还需要进一步完善和优化。

  3. 需要一定的代码开发能力:虽然JVM-Sandbox-Repeater提供了简单易用的API和配置方式,但在实际使用中,用户可能需要具备一定的代码开发能力,才能根据自己的需求定制和扩展录制和回放逻辑。

  4. 可能存在兼容性问题:由于JVM-Sandbox-Repeater需要附加到目标JVM进程中,因此可能会与某些JVM版本或特定配置存在兼容性问题。

考虑到流量录制对服务运行环境可能产生的影响以及对性能潜在的损耗,我们目前仅在测试环境中执行请求录制操作。这涵盖了录制请求的url、请求参数、被调用的函数信息以及请求的返回结果等关键信息。此举确保了我们可以在不影响生产环境稳定性和性能的前提下,详细捕获和分析测试阶段的交互数据。

图片


请求函数调用链

在服务接口请求的执行过程中,请求函数调用链指的是按顺序被调用的函数列表。我们选择将这一函数请求调用链视作接口请求的唯一标识符,这不仅成为了随后进行接口请求去重工作的关键字段,也为我们提供了一个独特的视角来捕捉接口请求的特征。

选择请求调用链作为唯一性信息的根本原因,而非请求URL或代码覆盖率等其他信息,可以归结为以下几点:

  1. 请求URL的粒度较粗 - 同一请求URL在携带不同参数的情况下可能代表着截然不同的场景。仅依靠URL进行去重,会导致较高的损失率和相对较低的用例覆盖率。

  2. 代码覆盖率的粒度过细,敏感度高 - 虽然粒度细致的代码覆盖率能提供丰富信息,但它可能会导致大量相似的测试case生成,即“case爆炸”。这不但大幅增加了维护成本,也对运行稳定性构成了挑战。

  3. 请求函数调用链的平衡性 - 虽然采用请求函数调用链作为标识可能会牺牲一定的精确度,但它有效地避免了因案例爆炸导致的成本上升,同时保留了部分代码覆盖和场景信息,实现了精度与成本之间的平衡。

综上所述,请求函数调用链的使用不仅精准刻画了请求的特性,还在保证足够信息量的同时避免了不必要的复杂性,从而在效率和成本之间达到了良好的平衡。

实现过程:

基于jvm-sandbox-repeater二开,动态生成录用函数配置,切面录制其函数请求信息,包括函数名和函数请求入参等。

图片

同时为了降低录制阶段的性能损耗,摒弃了一些非业务意义的函数录制,包括、、$original等相关的一些函数,同时将录制信息存储过程完全异步化。

图片


case自动生成

在我们成功录制请求相关信息之后,接下一步是执行一个综合流程:从全量请求出发,进行去重筛选,最终实现自动化测试case的适配转换。


去重筛选

预处理

录制的请求函数调用链代表了函数调用的顺序集合。在实际录制过程中,我们发现在一些如列表类的循环请求场景中,函数调用链的某些部分也可能出现重复循环。为了有效降低去重匹配过程中的噪声,我们先行识别并处理掉调用链中重复循环的部分。

去重

我们通过计算两个请求调用链的最长公共子序列的占比来判断它们的相似度。经过三轮的结果分析和调整后,我们设置了0.8的相似度阈值,即当相似度大于0.8时,这两个请求场景被认定为是相同的。为了提高处理海量数据的去重效率,我们利用了高途天宫大数据平台,实现了数据的分钟级快速处理。

case转换

完成去重后,接口请求信息将与高途的自动化测试平台进行对接,并按照自动化测试case的格式进行转换,以供QA团队进行确认和使用。目前case的采纳率在80%左右,case的二次维护率在50%左右。


图片
图片


通过这一系列精密而高效的流程,我们不仅提高了测试case的生成效率,还确保了测试覆盖的广度和深度,进一步提升了质量保障水平。





落地效果




目前,高途的发布系统已成功集成了基于流量录制技术的接口测试案例自动生成功能,该技术已在5个以上的业务领域得到应用。特别值得关注的是,该技术在自动化测试case的梳理、生成及录入过程中显示出了明显的效率提升,整体提高了约30%的工作效率。

该技术主要应用于测试流程的后期案例补充阶段,尤其是在进行回归测试时,它严格基于用户触发的真实使用场景,确保了测试的准确性和有效性。





后续规划




基于流量录制的自动化case生成已经在众多公司中得到了较为系统的实施,其中包括携程、酷家乐、有赞等知名企业。针对每个公司的状况和需求不同,尽管同样采用了相同的实现架构,但每个公司都有独特的落地方案和策略。在高途,基于流量录制的接口自动化case生成已经能够在后置阶段完全模拟真实用户场景,生成自动化测试case,在回归测试阶段发挥出了巨大的价值。

在接下来的发展中,我们将继续从以下两个方面提升该技术的能力:

  1. 针对全量函数的录制过程,鉴于不同接口实现的复杂性,目前在录制阶段仍存在一定的性能损耗,耗时范围从几十毫秒到2秒不等。为此,我们将考虑在录制过程中采取更多的异步化操作,以降低同步过程的耗时。

  2. 结合AI技术,补充新增功能接口的自动化case覆盖。高途的技术质量部门已经实现了这一功能,目前在在业务线试用阶段。未来,我们将为大家带来更多精彩的内容。

通过不断持续改进和创新,我们致力于提升我们的测试case生成技术,以满足不断演进的业务需求,并为用户提供更高质量和更可靠的软件产品。



END



微信扫一扫
关注该公众号

继续滑动看下一个
高途技术
向上滑动看下一个