日志插桩工具快速搞定接口测试
测试童鞋们,有没有在测试过程中遇到这样的问题:想要测试一个接口,没有足够的测试用例,手动构造用例耗时劳力,造出的数据场景单一,怎么办?调用了其他业务线的接口,不知道对方接口返回值长啥样子,有几种形式,怎么办?常常接到服务报警,处理问题被动,想要长期监控接口性能变化趋势,怎么办?遇到了上述问题,并且想在不影响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,提高测试灵活性和效率;对于性能信息的长期分析统计,可以监控接口性能的变化趋势,及时预测接口可能超时的风险。为了方便查看接口性能的监控情况,用一个平台来展示一下,这个折线图可以有!如此这般,一旦接口性能有了波动,没有达到报警阈值时,可以来查下导致波动的原因,防患于未然。
Eclipse 插件 FsonFormat 一键解决复杂JSON ,快速实现JavaBean