使用 JaCoCo 生成测试覆盖率报告
创始人
2024-05-28 22:15:38
0

0、为什么要生成测试覆盖率报告

在我们实际的工作中,当完成程序的开发后,需要提交给测试人员进行测试,经过测试人员测试后,代码才能上线到生产环境。

有个问题是:怎么能证明程序得到了充分的测试,程序中所有代码都被走到了。当然,代码覆盖率只能作为测试后的一个参照,如果最开始的需求都理解错了,那么再高的代码覆盖率,都失去了意义。

那么这时就需要引入代码覆盖率这个东东了,要统计 C++ 的代码覆盖率有 GCover,统计 Java 的代码覆盖率则有 JaCoCo 可以实现。

JaCoCo 是一个免费的Java代码覆盖率检测工具,可以统计到测试对以下内容的覆盖情况:

  • 指令覆盖率
  • 分支覆盖率
  • 圈复杂度覆盖
  • 行覆盖
  • 方法覆盖
  • 类覆盖

对各种覆盖率的具体含义可以参考官方文档:​​https://www.jacoco.org/jacoco/trunk/doc/counters.html​​

使用 JaCoCo 生成覆盖率时,可以使用 on-the-fly 方式,对程序的原代码是无侵入式的,只是在启动 jar 包时,增加一个参数就行,可确保测试人员测试的代码,和上线到生产环境的代码一致。

1、创建测试类并打包成服务

为了简单起见,这里直接基于 springboot 创建被测试的类,使用了 RequestMapping 注解。

package com.test.JacocoTest.controler;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping
public class Athytics {@GetMapping("/+/{a}/{b}")public int add(@PathVariable("a") Integer param1, @PathVariable("b") Integer b){int result = 0;if(param1 < 0 || param1 > 1000){result = b - param1;}else{result = param1 + b - 1000;}return result;}@GetMapping("/-/{a}/{b}")public int minus(@PathVariable("a") Integer param1, @PathVariable("b") Integer b){return param1 - b;}@GetMapping("/*/{a}/{b}")public int multiply(@PathVariable("a") Integer param1, @PathVariable("b") Integer b){return param1 * b;}@GetMapping("///{a}/{b}")public int divide(@PathVariable("a") Integer param1, @PathVariable("b") Integer b){return param1 / b;}@GetMapping("/c/{a}/{b}")public String power(@PathVariable("a") Integer param1, @PathVariable("b") Integer b){return String.valueOf(Math.round(Math.pow(param1, b)-1));}@GetMapping("/abs/{a}")public String abs(@PathVariable("a") Integer param1){return String.valueOf(Math.round(Math.abs(param1)));}
}

创建 SpringBoot 的启动类:

package com.test.JacocoTest;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class JacocoTestApplication {public static void main(String[] args) {SpringApplication.run(JacocoTestApplication.class, args);}
}

代码结构非常简单

2、启动 JaCoCo

2.1 下载 JaCoCo 工具包

可以进入到官方页面下载 ​​https://search.maven.org/search?q=g:org.jacoco​​

下载其中需要用到的两个包即可

Jacoco 工具包及被测试包如下

2.2 启动被测服务,并在启动语句中添加 JaCoCo

指定需要检查测试对代码覆盖情况的包名,采集Jacoco覆盖率文件的ip及端口

java -javaagent:jacocoagent.jar=includes=com.test.*,output=tcpserver,port=6301,address=localhost,append=false -jar JacocoTest-1.0-SNAPSHOT.jar

3、执行测试用例

因为是使用的 Springboot 开发框架,可以直接打开浏览器进行测试。

输入如下URL: http://localhost:9999/+/12/25

4、生成 dump,并重置覆盖率统计

指定要从何处获取jacoco统计数据,地址及端口应与 2.2 中的启动参数中一致

java -jar jacococli.jar dump --address localhost --port 6301 --destfile jacoco.exec --reset

参数说明:

--reset 生成覆盖率数据后,重置之前的统计,想要重新获取统计数据,需要删除之前生成的exec文件

--address 运行jacocoagent.jar的主机IP

--port 运行jacocoagent.jar的主机监控端口

执行后,将在目录下生成指令中指定的 exec 文件 jacoco.exec

5、生成覆盖率报告

想要生成报告,需要同时指定源文件及编译后的字节码文件。

指定类文件及源代码路径,并生成格式为 html 的报告样式。

java -jar jacococli.jar report jacoco.exec --classfiles  D:\Spring\JacocoTest\target\classes --sourcefiles D:\Spring\JacocoTest\src\main\java --html log

点击目录下的 index.html 将打开覆盖率信息

进入到测试类中,可以看到各方法的覆盖情况

进入到方法中,可以看到代码的覆盖情况。

 

绿色是完全覆盖,红色是未覆盖,黄色是部分覆盖。

想要获取全新覆盖率数据,需要删除步骤3中生成的 exec 文件,否则是累计覆盖率。

6 使用帮助

jacococli.jar 使用帮助

Usage: java -jar jacococli.jar report [] [--encoding ] [--help] [--html

] [--name ] [--quiet] [--sourcefiles ] [--tabwith ] [--xml ]

: list of JaCoCo *.exec files to read

--classfiles : location of Java class files

--csv : output file for the CSV report

--encoding : source file encoding (by default platform encoding is

used)

--help : show help

--html

--name : name used for this report

--quiet : suppress all output on stdout

--sourcefiles : location of the source files

--tabwith : tab stop width for the source pages (default 4)

--xml : output file for the XML report

相关内容

热门资讯

【中国那些事儿】文化吸引+入境... 中国日报网6月6日电 “酷”这个词源于青年文化,总是与时尚、创新、前卫联系在一起。现如今,随着中国吸...
特朗普称现在“不是特别”有兴趣... 【环球网报道】美国总统特朗普与企业家马斯克隔空“激烈交锋”引发外界持续关注。据美国广播公司(ABC)...
李玮锋:国足踢新加坡都这么费劲... 直播吧6月6日讯 在接受采访时,李玮锋直言现在的国足踢新加坡都费劲,那这球还怎么踢? 李玮锋言论如下...
车在外面充电,人在室内吹空调 ... 扬子晚报网6月6日讯 (通讯员 周明亮 记者 王国柱) “车子在外面充电,我在这里面吹吹空调,喝点饮...
每周股票复盘:徐工机械(000... 截至2025年6月6日收盘,徐工机械(000425)报收于8.02元,较上周的8.24元下跌2.67...
国际调解院将怎样进行调解? 本报记者 白波 国际调解院公约签署仪式近日在香港举行。33个国家现场签署公约,成为创始成员国。据悉,...
深度|政策与市场双驱动!私募占... 编者按: 十载春华秋实,鉴往知来;十年星河璀璨,与光同行。自破茧初啼至引领风潮,“金长江”评选始终以...
江锅股份2025年第一次临时股... 2025年6月7日消息,上海市锦天城律师事务所接受江苏江锅智能装备股份有限公司委托,就该公司召开20...
用尚科技 2024 年年度股东... 2025年6月7日消息,北京市中伦律师事务所接受北京用尚科技股份有限公司委托,指派律师出席并见证其 ...
“618”大促进行中,国补政策... 电商“618”大促进行中,国家补贴政策拉动消费持续增长。多家电商平台发布的首轮战报显示,家电手机等产...