元宵节快乐
插画来自网络
前言
如何使用命令行使用Jacoco进行代码染色
Jacoco简介
Jacoco是一种为Java VM的环境中的代码覆盖率分析提供的标准技术,重点是提供一个轻量级,灵活且文档齐全的库,以便于和各种构件和开发工具集成,比如当下非常流行的工具:Gradle、IDEA、Jenkins、SonarQube等等,我们可以使用这些工具完成一系列的自动化及代码覆盖率分析统计。
JaCoCo使用类文件工具来记录执行覆盖率数据。使用所谓的Java代理即时检测类文件。这种机制允许在类加载期间对所有类文件进行内存中的预处理,而与应用程序框架无关
JaCoCo代理收集执行信息并根据请求或在JVM退出时将其转储
特征
- 指令(C0),分支(C1),行,方法,类型和圈复杂度的覆盖率分析。
- 基于Java字节码,因此即使没有源文件也可以工作。
- 通过基于Java的即时代理进行简单集成。其他集成方案(例如自定义类加载器)也可以通过API来实现。
- 与框架无关的:与基于Java VM的应用程序(如纯Java程序,OSGi框架,Web容器或EJB服务器)平滑集成。
- 与所有已发布的Java类文件版本兼容。
- 支持不同 JVM语言。
- 几种报告格式(HTML,XML,CSV)。
- 远程协议和JMX控制可在任何时间点从coverage代理请求执行数据转储。
- Ant任务,用于收集和管理执行数据并创建结构化的覆盖率报告。
- Maven插件可收集覆盖率信息并在Maven构建中创建报告。
准备工作
-
jdk_1.8
-
- org.jacoco.agent-0.8.5-runtime.jar - org.jacoco.cli-0.8.5-nodeps.jar
-
本次我们使用Jmeter来举例子,所以先下载一个相同版本的Jmeter和源码文件
测试
-
首先我们通过命令行启动Jmeter,下图看起来是可以正常启动的
- java -jar ApacheJMeter.jar
-
利用代理启动系统在其运行时对其监控,在Jmeter启动后,我们在上面随意操作一些,比如建个线程组或者请求一下百度,再退出Jmeter后,我们可以在D:\temp\apache-jmeter-5.1.1\bin路径下发现生成了一个
jacoco.exec文件- 可以使用以下JVM选项激活Java代理 - java -javaagent:D:\temp\org.jacoco.agent-0.8.5-runtime.jar -jar ApacheJMeter.jar (执行路径在jmeter的bin目录下)
-
生成报告,通过读取exec和Java类文件生成不同格式的报告
- java -jar jacococli.jar报告[<execfiles> ...] --classfiles <路径> [--csv <文件>] [-编码<charset>] [--help] [--html <dir>] [--name <名称>] [-安静] [-源文件<路径>] [--tabwith <n>] [--xml <文件>] - <execfiles> 要读取的JaCoCo * .exec文件列表 - --classfiles <path> Java类文件的位置 - HTML报告的输出目录 - --sourcefiles <path> 源文件的位置
- <Script>
java -jar org.jacoco.cli-0.8.5-nodeps.jar report jacoco.exec --classfiles D:\temp\apache-jmeter-5.4.1\bin\ApacheJMeter.jar --html jmeter_report/
命令执行后,可以在当前路径下 - D:\temp\apache-jmeter-5.4.1\bin\ 查看生成的jmeter_report文件夹下的Html文件
- 查看代码染色情况,通过源代码参数 --sourcefiles
执行后可以得到源代码覆盖情况,清楚知道哪些代码或者逻辑没有测试到
java -jar org.jacoco.cli-0.8.5-nodeps.jar report jacoco.exec --classfiles D:\temp\apache-jmeter-5.4.1\bin\ApacheJMeter.jar --html jmeter_report2/ --sourcefiles D:\temp\jmeter\src\core
- 扩展
如果说所有的代码染色都是绿色的,那么能说明测试没问题了吗?当然不可能,即使所有代码都是绿色的,也不能保证,因为太多的逻辑很有可能是开发漏写了。
今天就到这,大家元宵节快乐