代码覆盖率工具-jacoco环境搭建分享

简介: Web多个服务在docker中启动,服务之间存在依赖关系,启动端口号以及依赖的镜像关系都配置在docker-compse.yml文件中。需要借助代码覆盖率工具,对后端Java代码进行覆盖率统计。

1. Jacoco+docker+ant环境搭建

背景: Web多个服务在docker中启动,服务之间存在依赖关系,启动端口号以及依赖的镜像关系都配置在docker-compse.yml文件中。需要借助代码覆盖率工具,对后端Java代码进行覆盖率统计。

环境搭建理想目标是,开启覆盖率统计工具后,进行API、Web GUI、手工测试和单元测试,都可以统计到覆盖率,且生成直观的报告,可随时查看代码覆盖率进度,清晰解析每行代码覆盖情况。

调研各代码覆盖率工具后,最终选定Jacoco进行代码覆盖率统计,理由如下:

1.Jacoco功能满足上述代码覆盖率环境的终极目标;

2.可与jenkins集成;

3.新版本的Jacoco也支持kotlin的代码统计;

4.目前工具在持续更新中。

1.1 Jacoco环境搭建血泪史

与其他覆盖率工具相比,Jacoco环境搭建较复杂,且依赖源码。网络查询jacoco工具大多与tomcat结合在一起,并且在tomcat中启动javaagent, 因此最先选择的也是Jacoco+tomcat的方式,发现流程可通,但覆盖率始终为0,此后先后尝试了如下三种方案。

Tomcat+jacoco Java+jacoco Docker+jacoco
优势 服务器上新的容器,配置文件可随意改动,不影响整体Web服务功能 直接使用java启jar包和jacoco服务,不依赖任何容器 改动少,只需在docker中添加启动jacoco
缺点 Tomcat如何启动Web相关服务需要好好研究 各种服务的依赖关系比较多,且有些服务启动依赖.so镜像 Docker不熟悉,且网络查询docker中启动新的进程需要修改docker镜像且重启,服务有宕机的风险
现状 无法启动web服务,放弃 单一服务可启动,存在依赖的服务启动报错,放弃 寻找到一种方法,修改docker-compse.yml配置文件,重启相应服务即可。

1.2 搭建步骤

1.2.1 工具安装

首先服务器需要安装jacoco+ant工具,ant用来生成覆盖率报告,ant有远程的功能,因想与jenkins集成,本文选择jacoco、ant、jenkins、docker都配置在同一台服务器上。

工具安装具体步骤见如下链接:

1.下载Jacoco到服务器:https://www.eclemma.org/jacoco/index.html

2.linux上安装ant:https://www.cnblogs.com/sell/archive/2013/07/24/3210198.html

注:若是环境中使用tomcat容器,Jacoco安装和与tomcat集成可参见:https://www.jianshu.com/p/16a8ce689d60

1.2.2 修改docker配置

​ 网络查询到的docker修改大多需要修改docker镜像,此处只需要在docker配置文件docker-compse.yml中添加启动javaagent,以某一服务为例,新增点如下:

image.png
图-1

将jacocoagent.jar拷贝到指定地点,且java启动Javaagent和服务,Javaagent端口号随意,没有被占用即可,其他服务修改同上,但是端口号不能相同。

Docker中重启修改的服务:1. docker-compose stop 具体服务2. docker-compose up –d 具体服务,使用docker-compose ps查看服务状态为UP,且带有javaagent的进程,具体见图2。

image.png
图-2

注意:1. 执行启动服务指令需要小心,一定要加up –d 具体服务,docker-compose up会重启所有服务,而有些服务是不可重启的,或者说启动比较复杂。

2.重启服务时,依次各重启,不要为了省事,全部down掉,服务间存在依赖,或导致某些服务启动报错。

1.2.3 与jenkins集成

与Jenkins集成的详细步骤见如下链接:https://www.jianshu.com/p/e7fc806ea0e0

Jenkins中带有jacoco分析的插件,可配置后直接生成直观的覆盖率报告,适用于统计单个项目覆盖率,但是Web存在多个服务场景,如何生成覆盖率报告,此处有两种方案:
image.png

1.2.4 本地生成覆盖率报告

本文选择的是本地生成覆盖率报告的方式,需要修改配置文件,修改build.xml文件地方如下:

image.png
图-3

1、指定Jaococant.jar的路径。

2、指定覆盖率生成的.exec文件和生成统计报告的路径,路径随意,新建文件夹指定路径即可。

3、 Ant支持远程生成报告,此处是本地生成,填写127.0.0.1,若是远程添加远程服务器的地址。

4、配置javaagent的端口,此处端口与1.2.2步骤中docker-compse.yml的javaagent端口号一致。

image.png
图-4

5、指定源代码的路径,源码必须与生成.jar包的源码完全一致。

6、 指定class文件的路径。

image.png
图-5

7、 dump指令配置,此处注意append参数的配置说明,目前选择是true。

8、merge代码是合并所有项目的.exec文件,生成总的代码覆盖率报告。

image.png
图-6

9、生成覆盖率报告代码部分,添加所有项目的信息,具体图-6中test1项目。

10、 进入build_jacoco.xml文件所在目录,执行ant –f build_jacoco.xml,显示BUILD SUCCESFUL后,进入生成报告路径查看生成的报告,打开index.html有统计信息即成功。

image.png
图-7

11、 进入具体项目链接,即可观察每行代码的覆盖情况,分析未覆盖的代码增加相应的测试case。

2、 可能遇见的问题

1、若Web服务为集群环境,需要将其他服务down掉,使所有请求都发往部署jacoco的服务器上。

2、启动服务后,开始统计覆盖率,过程中,各个服务最好不要再重启。

3、若是生成报告失败很大可能是端口号连不上,可尝试修改端口号,build.xml文件中端口号与docker-compose.yml文件中javaagent的端口号一致即可。

4、build指定的源码和class路径下文件需要与生成jar包的源码文件完全一致,否则生成覆盖率报告会报错。

3. 引用资料:

[1]jacoco下载路径:https://www.eclemma.org/jacoco/index.html

[2] Linux环境安装ant:https://www.cnblogs.com/sell/archive/2013/07/24/3210198.html

[3] jacoco与tomcat集成:https://www.jianshu.com/p/16a8ce689d60

[4] jacoco与jenkins集成:https://www.jianshu.com/p/e7fc806ea0e0

原文作者:zhangyj
点击查看原文

相关文章
开源测试平台横向测评系列『流马』篇:流马使用及总结
【使用篇】 ● 接口测试:创建接口(添加引用公共参数、添加引用自定义参数)、测试用例(参数关联)、业务流程测试实践 ● web自动化测试:元素管理(添加元素)、测试用例(添加元素)、设计测试场景 ● 测试计划、测试集合与测试用例相互之间的关系 【总结篇】 ● 使用总结:常见的使用注意事项,如变量引用、函数引用、关联参数引用等 ● 优化建议:结合真实使用过程,从用户角度出发,提出的7条优化建议 ● 优缺点总结:优点、缺点、评分(从不同角度评测打分)
开源测试平台横向测评系列『流马』篇:流马使用及总结
|
数据采集 Prometheus 监控
通过micrometer实时监控线程池的各项指标
最近的一个项目中涉及到文件上传和下载,使用到JUC的线程池ThreadPoolExecutor,在生产环境中出现了某些时刻线程池满负载运作,由于使用了CallerRunsPolicy拒绝策略,导致满负载情况下,应用接口调用无法响应,处于假死状态。考虑到之前用micrometer + prometheus + grafana搭建过监控体系,于是考虑使用micrometer做一次主动的线程池度量数据采集,最终可以相对实时地展示在grafana的面板中。
1542 0
通过micrometer实时监控线程池的各项指标
|
Prometheus 监控 Kubernetes
使用 Prometheus + Grafana 监控 k8s 上的 Spring Boot 应用
本文主要介绍如何使用 Prometheus 和 Grafana 可视化监控运行在 k8s 上的 Spring Boot 应用,监控指标包括 CPU、内存、线程信息、日志信息、HTTP 请求、JVM 等。
4497 0
使用 Prometheus + Grafana 监控 k8s 上的 Spring Boot 应用
|
固态存储 关系型数据库 MySQL
TiDB亿级数据亚秒响应查询集群部署
TiDB亿级数据亚秒响应查询集群部署
797 0
|
2月前
|
人工智能 Java Shell
终端里的AI搭档:我用Claude Code提效的实战心得
最近半年,我把Claude Code深度融入了日常开发流程。坦白说,刚开始我是抱着"试试看"的心态,但用了一周后就回不去了。这篇文章不是官方文档的搬运,而是我在真实项目中踩坑、摸索后总结出的一套实用打法。 一句话概括——它是一个跑在终端里的AI编程助手,由Anthropic出品。 和VS Code插件、Web聊天窗口不同,Claude Code直接在你的命令行里工作。这意味着它能直接读你的项目文件、执行shell命令、操作git,真正做到"手伸进项目里干活",而不是隔着浏览器窗口纸上谈兵。
3921 4
|
人工智能 API 数据库
MCP Server 开发实战 | 大模型无缝对接 Grafana
以 AI 世界的“USB-C”标准接口——MCP(Model Context Protocol)为例,演示如何通过 MCP Server 实现大模型与阿里云 Grafana 服务的无缝对接,让智能交互更加高效、直观。
4038 124
|
人工智能 自然语言处理 供应链
为什么一定要做Agent智能体?
作者通过深入分析、理解、归纳,最后解答了“为什么一定要做Agent”这个问题。
2208 41
为什么一定要做Agent智能体?
|
人工智能 自然语言处理 数据处理
还在手动验证文献引用?ScholarCopilot:开源AI学术写作工具,生成时实时插入文献引用
基于 Qwen-2.5-7B 模型的 ScholarCopilot 通过动态检索标记和联合优化技术,实现学术文本生成与文献引用的精准匹配,在 50 万篇论文库中实现 40.1% 的检索准确率,生成文本的学术严谨性评分达 16.2/25。
1998 5
还在手动验证文献引用?ScholarCopilot:开源AI学术写作工具,生成时实时插入文献引用

热门文章

最新文章