目录
前言:
简介
基础使用方式介绍
工具特性
前言:
在软件开发中,测试覆盖率是一个非常重要的指标,它表示代码中所有的测试用例是否都已经被覆盖到。JVM 字节码测试是一种比较新的测试方法,它可以对 JVM 字节码进行测试,从而更加全面地覆盖代码中的所有逻辑。
简介
一个专为 JVM 系语言 web 应用设计的,专注于集成测试阶段的后端测试工具。本质功能是监控代码执行,做远程调试使用。比如可以让你实时的了解到在前端点击某个按钮后,后端执行的代码细节,包括每一个方法的名称、参数返回值、执行的代码行号,调用的 sql 语句等信息。
当然可方便的扩展功能,实现测试覆盖率统计、影子数据库等实用功能。
基础使用方式介绍
项目使用 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 数据库,也提供了非常便利的接口扩展支持其它关系型数据库
- 支持热插拔: 不用改应用的启动文件也可使用,对线上环境临时使用提供了可能
作为一位过来人也是希望大家少走一些弯路
在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。
(软件测试相关资料,自动化测试相关资料,技术问题答疑等等)
相信能使你更好的进步!
点击下方小卡片