使用Jacoco获取 Java 程序的代码执行覆盖率的步骤详解
jacoco是java code coverage的缩写,顾名思义,它是获取java代码执行覆盖率的一个工具,通常用它来获取单元测试覆盖率。它通过分析java字节码来得到代码执行覆盖率,因此它还可以分析任何基于jvm的语言(如croovy、kotlin)的覆盖率。本文不讨论如何用jacoco获取单元测试的代码覆盖率,而是从jacoco的原理出发,介绍如何通过jacoco获取sit或者uat的测试覆盖率。更准确来讲,是获取一个应用执行过的代码占总代码的比率。包括字节码指令覆盖率,分支覆盖率,圈复杂度覆盖率,行覆盖率,方法覆盖率和类覆盖率。
jacoco原理简介
jacoco通过修改喂给jvm的字节码来达到获取那些代码执行了的目的。修改方式有两种,一种在线(on-the-fly),是通过java agent,在jvm执行字节码之前动态对其进行修改,这种方式更灵活,也是jcoco的一大特性。另一种是离线(offline)模式,在java程序字节码文件(.class文件)生成之前进行修改,这样的字节码就不纯了。一般在无法使用on-the-fly方式的时候才使用offline方式。
上面这些概括起来讲,jacoco最牛x的地方就在于它能够知道一个基于jvm的应用程序中哪些代码(指令、分支、行、方法、类)被执行了。用它除以总代码量,就得到了代码执行覆盖率。
由此,我们可以推断出jacoco生成单元测试覆盖率报告的原理:单元测试代码会调用被测试代码,被测试代码的字节码指令会被jacoco截获,用被截获的代码量除以总代码量,就算出了单元测试代码覆盖率。举一反三,在sit或者ut的时候,也需要执行java应用程序中的代码,因此可以也通过jacoco获取被执行过的代码,从而计算出sit,ut测试代码覆盖率。
使用jacoco生成代码执行覆盖率报告
接下来通过一个实验介绍如何使用jacoco获取一个java web应用代码的执行率。就拿tomcat自带的example应用来做实验,我们在启动tomcat时带上jacoco的java agent;然后在页面上做一些点击操作,触发后台java代码的执行;再抓取包含执行情况数据,放到.exec的二进制文件中;最后由这些二进制文件生成html格式的报告,验证被覆盖的代码是否和我们点击的内容相关。
下载jacoco(),解压缩。
下载tomcat( 清华mirror),然后解压缩,进入bin目录,找到catalina.bat文件(windows)。
修改如下代码,让tomcat在启动时带上javacoco的agent。
修改为
其中指定了javaagent是c:\users\robot\application\jacoco-0.8.5\lib\jacocoagent.jar,解压jacoco可以得到;指定了output是tcpserver,也就是需要通过访问一个地址才能获取到数据。默认地址是本地ip地址,端口号是6300。其它参数说明见:。
设置完成之后,双击tomcat bin目录下的startup.bat,启动tomcat。控制台可以看见javaagent设置生效。此时jacoco就可以动态地拦截喂给jvm的字节码,并且监听6300端口号和所以本机地址,等待获取代码执行情况数据(暂且称为.exec文件数据)的请求。
输入地址 ,打开tomcat 欢迎页面,做一些点击操作,可以确定它已经执行了一些字节码。
获取执行情况数据,在jacococli.jar所在目录(与jacocoagent.jar目录一致)执行命令:
jacoco会在当前目录下生成data/jacoco-it.exec文件,这个文件是一个二进制文件,我们无法直接查看它,需要用它生成html或者其它格式的文件。
执行如下命令生成html报告。--classfiles制定应用程序的class文件所在目录,--html指定html报告所在目录。
打开html目录下的index.html文件就可以看到报告了。
小结
上面实验比较简单,只为辅助对jacoco原理的理解。理解了原理之后,参照官网的手册就可以用jacoco来做一些实用的操作,提高java代码的质量。
以上就是使用jacoco获取 java 程序的代码执行覆盖率的步骤详解的详细内容,更多关于使用jacoco获取 java 程序的代码执行覆盖率的资料请关注其它相关文章!