代码精准分析在闲鱼接口测试中的应用

简介: 代码精准分析在闲鱼接口测试中的应用

作者:闲鱼技术——问衿

一、背景

在服务端的质量保障中接口测试一直占据着重要的作用,从最开始的手工测试到编写接口测试代码,再到后来的基于流量录制的接口回放,测试效率不断得到提高,但是风险评估主要还是依赖开发同学以及测试同学对业务的熟悉程度,没有相应的工具予以支撑,回归的时候也没有重点,通常会全量回归,避免遗漏。因此开发相应的工具及平台精准确定代码的改动范围,有效评估影响面,提高回归效率。

二、方案概述

服务端主要对外提供 HTTP及RPC 接口,可以将其看作是入口型的接口,流量录制平台通常获取的都是HTTP 及 RPC 级别的流量,因此我们主要的解决思路如下:
step1:通过订阅 Gitlab 的消息获取代码的改动信息,包括改动的代码行范围,修改的类文件等
step2:分析代码的差异,根据改动的代码行范围判断修改了哪些方法
step3:通过流量录制平台本身的能力获取 HTTP及 RPC 接口的调用链路,建立方法和入口接口的映射关系,此时根据修改变动的方法就可以查询到对应的入口接口
step4:通过流量录制平台获取到对应的流量用例。其中录制的就是HTTP及 RPC 接口流量用例
step5:建立变动方法与流量用例之间的映射关系
下面就通过主要的四个方面展开阐述:代码差异化分析,方法调用链路解析,流量录制,用例关联。
image.png
图1 流程概览

三、代码差异化分析

代码改动之后,我们希望知道代码改动的影响范围和影响程度。影响范围包括影响到了哪些接口,影响到了哪些调用这个接口的应用;影响程度指的是影响的接口或者应用是否是强依赖或者是核心的,目前我们实现了获取到影响到哪些接口的能力,其余的内容我们计划后续实现。图2是代码差异化分析整体流程图。
image.png
图2 差异化分析流程图
对于代码的差异化分析目前我们支持 Java,Objc,以及 Flutter。Java解析使用开源的Java解析器,Objc 及Flutter通过各自的语法进行处理,自行实现了简单的方法解析器;其中在解析时使用了Gitlab传递过来的变动代码行范围数据,通过代码行来进行检索判断。考虑到 Java 解析器有现成的开源工具,Objc 以及 Flutter 需要自行实现,现以 Objc 举例说明具体的解析过程:
1、根据 Git diff 信息获取变动的代码文件路径及代码行范围,如图3 所示,变动的代码行范围是[1200,1207]。
image.png
图3 Git diff 信息
2、在步骤1中我们可以获取到变动的代码文件路径,可以下载对应的代码文件作为解析的数据源
3、按行解析,判断该行是否是方法声明,如果是,记录下代码行数作为当前方法的起始行,同时按行向上搜索判断是否含有方法结束标志,如果有那么记录下行数作为上一个方法的终止行。最终我们获取到了代码文件的类似 AST的一个数据结构,其中以方法块的形式记录了各个方法名及其起始和终止行数。比如图4展示了对应的数据结构。
image.png
图4 方法块数据结构
4、根据 Git diff 中获取的代码行变动范围在上述的方法块数据结构中检索,如果代码行范围是方法块行范围的子集,那么就命中了该方法,就返回该方法名,根据图3的代码变化范围可以在如图4 的数据结构中发现匹配的方法名是 getName。

三、方法调用链路解析

方法调用链路的获取我们采用流量录制平台提供的能力,但是由于获取方法调用链路的模块在加载后对应用的响应时间影响比较大,目前该模块只在预发加载,因此我们需要录制预发的流量,预发的流量仅用于方法调用链路的分析。
image.png
图5 流量录制与方法链路获取
图5 展示了预发流量的录制与方法链路的获取流程。获取到预发流量之后,我们通过流量的唯一标识id调用流量录制平台的API获取整个调用链下的方法,举个例子,比如RPC接口:com.idle.test.openService@getInfo~II,如图6所示可以获取对应的调用链信息,根据其中 method 字段即可解析出方法链路列表,因此建立了方法 getName,getAdress 与RPC接口 com.idle.test.openService@getInfo~II 之间的映射关系。
image.png
图6 方法链路获取

四、流量录制

在实际使用中我们采用流量录制平台进行流量录制,通过接口调用获取前 N 天的流量,具体规则可配置,由于流量本身是非线性的,部分流量可能很大,所以我们通过调度平台从应用的纬度出发,进行任务调度定时执行,保证流量及时更新,覆盖更多小流量接口,具体流程图如图5所示。只不过此时录制的流量是线上流量,而不是预发流量,但是整体流程一致,并且录制的 HTTP 及 RPC 接口也是一致的。录制的流量作为用例保存在数据库,比如在线上环境我们录制了RPC 接口 com.idle.test.openService@getInfo~II 的流量,那么就可以建立RPC 接口com.idle.test.openService@getInfo~II 与流量之间的映射关系,落库到数据库时流量是以流量 id 进行保存,否则数据量过大不便处理。

五、用例关联

在代码差异化分析之后我们已经获取了变动的方法名,经过调用链路的分析,我们建立了变动的方法和HTTP或者RPC接口的映射关系,那么如何将其与用例进行关联?我们通过流量录制平台录制线上流量,建立HTTP或者RPC接口同流量数据之间的映射关系,继而建立了变动的方法同流量用例之间的映射关系。具体而言,首先我们会积累各个应用 HTTP 及 RPC 的线上流量信息,建立HTTP及RPC接口同流量之间的关系,同时将对应接口的方法链路信息解析后保存在数据库,此时建立了HTTP或者RPC入口同接口调用过程中的方法之间的关联;代码发生变动后,我们可以获取变动的方法名,从上面的映射关系可以推断根据方法名可以找到对应的流量用例。
当项目提测时,会根据应用及应用开发分支获取变动方法,继而查询到对应的HTTP及RPC方法,之后自然就获得了服务端的流量数据,就可以触发用例回归。整个过程中可以清晰地看到影响的接口,并且可以执行对应的用例,通过影响的接口可以评估影响范围,做到心中有数,而不是强依赖开发同学的判断,从而对接口变更风险有了准确的评估。

六、效果及展望

在未采用精准测试服务之前,服务端接口发生变更之后,我们采用全量回归方式,按照每个应用每天提交n次,N个核心应用,以一周的时间计算,单次回归时间是M,M一般是在几分钟左右,那么总体的用例回归时间是MNn7,并且并不具备精准性;通过代码精准分析之后不必采用全量回归的方式,只要针对性进行回归即可,单次接口回归时间假设为K,K一般是小于一分钟,以一周为维度计算,总体的接口回归时间:KNn7,那么相比未采用精准测试服务之前总体耗费的时间大大降低。
精准测试是服务端接口测试的进一步延伸,除了应用于接口测试之外,本身积累的大量数据,比如代码提交记录,变动的方法,流量的分布,方法链路的变动等可以为后续项目风险评估,整体质量预测,业务服务监控等提供支持,并且可以作为一项基础服务为其他的测试能力提供支撑。

相关文章
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
提升软件测试效率与准确性的策略分析
【4月更文挑战第30天】在快速发展的数字时代,软件已成为支撑现代社会运行的核心。随着软件系统的日益复杂化,确保其质量与稳定性显得尤为重要。软件测试作为保障软件质量的关键步骤,它的效率和准确性直接影响着产品的上市时间和用户体验。本文将探讨如何通过采用自动化测试工具、实施持续集成(CI)与持续交付(CD)流程、利用人工智能(AI)技术以及加强测试人员的专业培训等策略来提升软件测试的效率与准确性。
|
1天前
|
测试技术
深入理解软件测试中的边界值分析法
【5月更文挑战第2天】 在软件测试领域,边界值分析是一种高效且实用的测试设计技术。本文将探讨边界值分析法的原理、实施步骤以及其在各种测试场景中的应用。通过对边界条件进行精确的测试,可以揭示那些可能被忽视的错误,从而提高软件产品的质量。文中还将讨论如何结合其他测试方法来优化边界值分析,确保测试过程更加全面和高效。
|
1天前
|
算法 异构计算
基于直方图的图像曝光量分析FPGA实现,包含tb测试文件和MATLAB辅助验证
该内容包括了算法的运行效果展示、软件版本信息、理论概述和核心程序代码。在正常图像中,`checkb`位于`f192b`和`f250b`之间,而多度曝光图像中`checkb`超出此范围,判断为曝光过度。使用的软件为Vivado 2019.2和MATLAB 2022a。理论依据未详细给出,但提及主要方法。提供的Verilog代码段用于处理图像数据,包括读取文件、时钟控制及图像histogram计算等,其中模块`im_hist`似乎是关键部分。
|
1天前
|
安全 IDE Java
Java串口通信技术探究2:RXTX库单例测试及应用
Java串口通信技术探究2:RXTX库单例测试及应用
15 4
|
1天前
|
数据采集 机器学习/深度学习 人工智能
探索AI在软件测试中的应用与挑战
【5月更文挑战第2天】本文将探讨人工智能(AI)在软件测试领域的应用及其带来的挑战。我们将详细讨论AI如何改变软件测试的方式,包括自动化测试、预测性测试、智能化缺陷检测等。同时,我们也将探讨AI在软件测试中面临的挑战,如数据质量问题、模型的可解释性、以及对现有测试流程的影响等。
|
3天前
|
Java 测试技术 开发者
深入理解与应用单元测试:软件质量的守护者
【4月更文挑战第30天】 在现代软件开发过程中,单元测试作为保障代码健康的重要环节,其地位日益凸显。本文将探讨单元测试的核心概念、实施单元测试的重要性以及如何高效地设计并执行单元测试。通过实例分析,我们将揭示单元测试在确保软件产品质量和加速开发周期中的关键作用。
|
3天前
|
敏捷开发 测试技术 持续交付
探索自动化测试在敏捷开发中的应用移动应用的未来:跨平台开发与操作系统的融合
【4月更文挑战第30天】随着软件开发周期的不断缩短,传统的软件测试方法逐渐显得力不从心。本文将深入探讨自动化测试在敏捷开发环境中的关键作用,分析其如何提高测试效率、减少人力资源成本,并确保软件产品的质量与稳定性。通过案例分析,我们还将讨论实施自动化测试的最佳实践和面临的挑战,为追求高效敏捷开发的组织提供参考。
|
3天前
|
数据采集 机器学习/深度学习 人工智能
自动化测试中AI辅助技术的应用与挑战
【4月更文挑战第30天】随着人工智能(AI)技术的飞速发展,其在软件自动化测试领域的应用日益增多。本文探讨了AI辅助技术在自动化测试中的应用情况,包括智能化测试用例生成、测试执行监控、缺陷预测及测试结果分析等方面。同时,文章还分析了在融合AI技术时所面临的挑战,如数据质量要求、模型的透明度与解释性问题以及技术整合成本等,并提出了相应的解决策略。
|
3天前
|
机器学习/深度学习 算法 UED
【Python 机器学习专栏】A/B 测试在机器学习项目中的应用
【4月更文挑战第30天】A/B测试在数据驱动的机器学习项目中扮演关键角色,用于评估模型性能、算法改进和特征选择。通过定义目标、划分群组、实施处理、收集数据和分析结果,A/B测试能帮助优化模型和用户体验。Python提供工具如pandas和scipy.stats支持实验实施与分析。注意样本量、随机性、时间因素和多变量分析,确保测试有效性。A/B测试助力于持续改进机器学习项目,实现更好的成果。
|
3天前
|
前端开发 IDE 数据可视化
深入理解与应用自动化测试框架Selenium的最佳实践
【4月更文挑战第30天】 本文将深入剖析自动化测试框架Selenium的核心原理,并结合最佳实践案例,探讨如何有效提升测试覆盖率和效率。文中不仅涉及Selenium的架构解析,还将提供针对性的策略来优化测试脚本,确保测试流程的稳定性与可靠性。通过实例演示,读者可以掌握如何在不同测试场景中灵活运用Selenium,以及如何处理常见的技术挑战。

热门文章

最新文章