查看原文
其他

日志插桩工具快速搞定接口测试

李丹妮 转转QA 2022-11-09
背景

测试童鞋们,有没有在测试过程中遇到这样的问题:想要测试一个接口,没有足够的测试用例,手动构造用例耗时劳力,造出的数据场景单一,怎么办?调用了其他业务线的接口,不知道对方接口返回值长啥样子,有几种形式,怎么办?常常接到服务报警,处理问题被动,想要长期监控接口性能变化趋势,怎么办?遇到了上述问题,并且想在不影响RD大神们的代码逻辑的基础上,解决它们。由此萌生了做个日志插桩工具的想法。

日志插桩工具

日志插桩工具是透明于上、下游服务,基于AOP思想,利用javassist类库实现的获取接口入参&出参&性能数据的工具。

工具的设计如下图,为集群加装代理,由代理接收上游服务的请求,并转发对下游服务的请求,获取的信息存入日志及数据库中。

名词科普

为了更好的理解工具,稍稍科普下两个英文词儿:AOP & javassist

AOP:Aspect-Oriented Programing 面向切面编程

注意,AOP和OOP(Object-Oriented Programming 面向对象编程)的区别不仅仅在于第一个字母不同。OOP构建的是对象间从上而下的层次结构,当我们需要一种水平分布在系统中的功能时,AOP就是利刃。水平分布的功能,简单来说就是与系统中核心业务逻辑没有很大关系的功能,比如,日志功能、权限校验等功能。

      举个栗子:系统中,一段业务逻辑涉及到了两处权限校验,没有AOP的情况下,需要对校验1和校验2分别撸出一段逻辑基本完全一致的代码,重复实现且复用性差。

为了避免这种情况,使用AOP思想,将通用的校验逻辑抽取出来作为通用服务进行支持,让权限校验逻辑作为一个平面切入到核心业务逻辑中。同理,获取参数的切面也可以通用于系统的各处。

      AOP技术分为:动态代理与静态织入两种,动态代理是在程序运行时,运用反射机制动态创建而成;静态织入指由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。很明显,日志插桩工具是使用后者结合javassist类库实现的。

Javassist类库

比较常用的字节码开源框架有两种:ASM & javassist,二者都可以操纵字节码生成新类或修改已有的类。ASM与javassist之间最大的区别,也是日志插桩工具选择后者最重要的原因是:ASM操纵的级别实地城JVM的汇编指令,而javassist可以直接通过java编码实现类的改变与新增,具有学习成本相对较低的优势。在java编码时,明确写出我们想要织入的代理逻辑,仅需要注意些javassist对于参数传递及函数调用的写法协议即可。下方代码,对接口的入参进行了获取,记录到日志中,并对原接口进行了调用。

工具插桩流程

日志插桩工具的插桩粒度为接口级别,利用反射获取需要插桩的类中接口,对其织入代理,代理能够获取到参数及性能信息并存储。


织入的代理对于接口调用方是透明的,实现关键点在于:代理占用原接口名称,重命名原接口并对原接口进行调用,调用时将入参与出参原封不动传递给原接口及返回,代理栗子如下:

数据分析

通过插桩工具获取的参数及性能信息,能做些什么呢?文中开头的问题都可以解决啦!入参可以用来构建测试用例,扩充用例的丰富性;出参可以用来对接口进行mock,提高测试灵活性和效率;对于性能信息的长期分析统计,可以监控接口性能的变化趋势,及时预测接口可能超时的风险。为了方便查看接口性能的监控情况,用一个平台来展示一下,这个折线图可以有!如此这般,一旦接口性能有了波动,没有达到报警阈值时,可以来查下导致波动的原因,防患于未然。

往期精彩回顾

转转APP专项测试——静态代码扫描

从性能分析角度谈拆分组件

1分钟了解转转小程序测试体系

基于codediff的差异代码覆盖率统计实现

转转 App UI自动化进化史

Yuntestin 基于jmeter的轻量级云测试平台

转转测试环境平台解决方案

浅析测试环境远端Agent工作模式(下)

浅析测试环境远端Agent工作模式(上)

商业产品高效测试之利器

效能提升的江湖路--转转Beetle平台百天记

Eclipse 插件 FsonFormat 一键解决复杂JSON ,快速实现JavaBean

自动化测试之接口数据平台及其衍生

浅谈接口diff设计实现应用

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存