基于javaagent实现的mock框架

背景

项目有点规模,使用dubbo框架,类似微服务的方式将项目分成了多个模块。各个模块逻辑复杂,而且调用了大量的外部接口。开发时自测面临以下问题:

  • 测试某个模块时,需要启动各个上游模块,以及上游模块的上游模块。
  • 业务逻辑复杂,需要有完备的测试数据,才能成功调用各个接口。
  • 项目中的加解密功能设计的不好,难以绕过加解密签名验签通过传入准备好的明文直接进行调用。
  • 有时候,不仅仅需要对外部接口进行mock,还需要mock静态方法、final方法。
  • 各种单元测试框架、集成测试框架都难以满足需求。

目标

  • 可以做到mock项目中几乎所有的方法,包括静态方法、final方法。
  • mock代码采用外挂式,完全不用修改项目中的任何代码或者配置,不用担心mock代码不小心上到生产环境。
  • mock代码,使用熟悉的java语言。
  • mock代码,可以热加载,修改mock代码,不用重启服务。
  • 可以用于单元测试、接口测试、集成测试。
  • 可以用于在联调的时候用于代码热修复。
  • 可以很方便的解决项目中复杂的加解密签名验签。
  • 主要目标是提供给开发同学使用,当然也可以给测试同学用。

方案

  • 方案一
    之前想过一种方案,通过spring的aop实现。切面拦截所有的spring管理的bean方法,然后调用js代码(java内置了nashorn,里面可以调用java代码)。但是功能不够强大,非spring管理的对象的方法,不能mock。非public方法不能mock。对象方法自身相互调用,被调用的方法不能被mock。需要添加一些spring配置,需要在项目中引入mock的jar包。对于远程dubbo服务,如果没有注册到zookeeper,也无法mock。即使有以上诸多限制,用起来还是有明显的作用的。后来又发展了调用groovy的版本。代码没有上传到git,有兴趣的可以留言找我要。
  • 方案二
    由于对方案一不是十分满意,毕竟对项目有弱侵入性,功能上也无法完全解决需求。所有又寻找别的方案。这个方案,使用javaagent+javassist+groovy。可以在项目启动时,加一个jvm启动参数。这样在加载类的时候,修改字节码,实现aop,可以控制项目中任何一个类是否需要被mock,完全实现以上的mock目标。
    代码在github上,地址:https://github.com/zhoujiaping/java-agent.git
    被测试的web项目:https://github.com/zhoujiaping/java-agent-web.git
    有兴趣的可以交流一下,希望能帮开发同学们解决自测的一些问题,也希望同学们能贡献一些想法和代码。
    实现这个方案的过程中还是遇到了不少的难题。
    javassist实现aop(javassist官网上的demo,可以实现before、after、catch、finally,但是无法实现完整的aop);
    java-agent项目中的类被AppClassloader加载,业务代码的类被tomcat的WebAppClassLoader加载,需要解决多个类加载器的环境问题;
    dubbo使用javassist实现动态代理,和java-agent实现的动态代理不兼容的问题;
    远程dubbo服务,在本地的桩是动态生成的类,要对其进行aop的问题;
    以上问题,目前均已解决,现在可以正式投入使用了。

比较

市面上很多mock框架/工具。一般可以分为单元测试mock,mock server。
单元测试mock,用于单元测试,mock一个对象时,需要级联的对其依赖进行mock,其实也不是很方便。
mock server,就是创建一个模块,提供服务实现。这个也不灵活,不能控制某个方法被mock的同时,另外一些方法不mock。并且对于有数据加解密逻辑的时候,准备的测试数据需要先加密一次,难以对这些数据进行维护。

总结

java-agent这个项目,致力于为开发同学自测提供一个零侵入性、灵活度高、功能强大的框架,为开发测试提供方便,为项目测试环节提高效率,从而提升项目质量。希望能帮助更多的开发同学。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值