美文网首页
JVM 字节码测试运用:远程调试、测试覆盖、影子数据库

JVM 字节码测试运用:远程调试、测试覆盖、影子数据库

作者: TesterHome | 来源:发表于2022-07-07 18:24 被阅读0次

    本文由uniquetruth发表于TesterHome论坛,点击原文链接可查看作者的更多文章并与ta在线交流。

    一直想找一个技术社区开源一个自己个人的项目,希望能被更多人看到、使用这个东西,在测试上帮助到大家。

    简介

    一个专为JVM系语言web应用设计的,专注于集成测试阶段的后端测试工具。本质功能是监控代码执行,做远程调试使用。比如可以让你实时的了解到在前端点击某个按钮后,后端执行的代码细节,包括每一个方法的名称、参数返回值、执行的代码行号,调用的sql语句等信息。
    当然可方便的扩展功能,实现测试覆盖率统计、影子数据库等实用功能。

    基础使用方式介绍

    项目地址:https://github.com/uniquetruth/remote-debug-agent
    项目使用gradle构建,下载源码后,使用gradle agentTest命令,可编译出一个java探针,并且与所有需要的二进制文件出现在build/lib目录下。之后就可以将所有jar包放到服务器的任意目录中,然后将-javaagent:${你的目录}/remote-debug-agent.jar=includes=com.foo.bar,apiport=8098配置到web应用启动参数的java_opts中(例如使用tomcat的话,可修改catalina.sh来添加该参数)。被测应用启动后,探针会启动一个内置的jetty服务器,并在8098端口上提供一组api供测试使用。
    假设你的被测应用在前端有一个按钮,点击按钮后会调用到后端com.foo.bar.MyClass类中的某个方法,那么在测试这个按钮前,可先发送一个请求http://ip:8098/trace/start(用jmeter、curl甚至浏览器发都行,只要与测试操作源自同一台机器即可),之后点击按钮后,再发送请求http://ip:8098/trace/list,探针即会返回刚才执行代码的细节。你可以看到类似这样的数据

    [{
        "method": "java.lang.String com.foo.bar.MyClass.handle()",  //执行的方法签名
        "coverage": "[11,13][16,16]",  //执行了哪几行代码
        "cost time": 2,  //执行耗时
        "calls": [{  //该方法调用的底层方法
            "coverage": "[21,21][24,24]",
            "cost time": 1,
            "method": "boolean foo.bar.MyClass.largeThanHalf(double)",
            "parameters": ["0.24444334899195885"],
            "return value": "0"
        }],
        "return value": "random number( 0.24444334899195885 ) is little than half",  //该方法的返回值
        "sql": "select 1 from dual"  //该方法执行的sql语句
    }]
    

    以上是一个远程调试的示例,应用场景应该是集成测试阶段灰盒测试,当然白盒、黑盒,甚至开发调试都可以用。另外也提供dump代码行覆盖情况的接口,用过jacoco的应该比较熟悉,利用这些数据可以做测试覆盖率的统计。

    工具特性

    • 线程隔离: 代码执行情况是分线程记录的,且能通过一些信息标识调用者身份,因此可在集成环境中多人同时使用,互不影响
    • 自然染色: 调用者身份使用其发起的请求中的天然信息进行染色,无需给测试人员增加额外的客户端
    • 调用链传递: 调用者身份信息可在多个都使用了探针的应用间传递(如果这些应用间使用http协议通信的话),也就是说非常适合微服务架构使用(特意支持了Feign-Hystrix组件)
    • Servlet框架支持: 工具支持大部分使用HttpServlet的框架或中间件,比如spring-web、tomcat等,也提供了非常方便的接口扩展支持其它同类框架
    • 支持Struts2
    • 支持Dubbo
    • 支持Spring RabbitMQ
    • 支持JVM系语言: 探针工作在字节码层,所以不仅支持Java,也支持Groovy、Scala等语言(特意支持了Play框架)
    • SQL语句监控: 探针默认支持oracle和mysql数据库,也提供了非常便利的接口扩展支持其它关系型数据库
    • 支持热插拔: 不用改应用的启动文件也可使用,对线上环境临时使用提供了可能

    更多功能持续开发完善中

    可能没有特别适合的标签,就选了测试覆盖率这个, 如果有对测试覆盖率或者影子数据库等技术感兴趣的朋友也欢迎交流。
    个人Github空间也有其它更多开源分享欢迎参观,近期也在寻找合适的工作机会,欢迎勾搭:laughing:

    本文由uniquetruth发表于TesterHome论坛,点击原文链接可查看作者的更多文章并与ta在线交流。

    今日份的知识已摄入~

    想要学习更多关于测试/测试开发技术、测试管理和质量保障的干货知识?
    想要结识质量行业大牛和业界精英?
    欢迎关注第十届中国互联网测试开发大会·深圳站 >>

    相关文章

      网友评论

          本文标题:JVM 字节码测试运用:远程调试、测试覆盖、影子数据库

          本文链接:https://www.haomeiwen.com/subject/ynppbrtx.html