自动化工具 Java 代码覆盖率调研报告

麦兜珊 · April 08, 2020 · Last by 麦兜珊 replied at April 16, 2020 · 859 hits

jacoco官网:https://jenkins.io/
jekins官网:https://www.eclemma.org/jacoco/trunk/doc/

一、Demo应用简介

1、涉及技术:

Springboot+maven+mybatis+mysql

2、提供的接口:


二、单元测试代码覆盖

1、jacoco实现原理:

Offline模式:
在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。

2、jacoco运行方式:

针对maven项目,在pom.xml中添加依赖包,在编译时执行单元测试用例,最终的报告生成到target目录中

3、项目pom.xml配置:

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--jacoco-->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
<!--这里的execution ,每一个执行的goal,对应的id必须是唯一的-->
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<dataFile>target/jacoco.exec</dataFile>
<outputDirectory>target/jacoco-ut</outputDirectory>
</configuration>
</execution>
</executions>
<configuration>
<systemPropertyVariables>
<jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>

4、手动执行jacoco代码覆盖率报告:



5、与Jekins jacoco plugin插件集成:

job名称:cssjacoco





三、实时代码覆盖率

1、jacoco实现原理:

On-the-fly插桩:
JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过ClassLoader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。

2、jacoco运行方式:

jar包方式启动:
java -javaagent:C:\Work\css\jacoco-0.8.2\lib\jacocoagent.jar=includes=,output=tcpserver,port=8086,address=  -jar css-0.0.1-SNAPSHOT.jar

镜像方式启动:
构建docker镜像:
在当前目录中新建Dockerfile文件,执行docker build -t dockername:v1 .命令

执行完毕后查看是否镜像创建成功:docker images:

启动镜像:docker run -d -it -p 8089:8089 f2e3d36e34c4
http://221.122.129.111:8089/CRUD/ListUser

查询容器日志:docker logs -f 容器id
查询启动的docker进程:docker ps -l
删除docker容器:docker rm 容器id
删除docker镜像:docker rmi 镜像id
导出容器:docker export 容器id > 文件名.tar
进入docker内部:docker exec 4d70138f6755 /bin/sh
LInux查询端口使用情况:netstat -anp|grep 8089

3、使用ant构建生成覆盖率报告:

jacocoant.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project name="JaCoCo" default="run" xmlns:jacoco="antlib:org.jacoco.ant">
<!--Jacoco的安装路径-->
<property name="jacocoAntPath" value="C:\Work\css\jacoco-0.8.2\lib/jacocoant.jar"/>
<!--生成.exec文件的路径,Jacoco就是根据这个文件生成HTML报告的-->
<property name="jacocoExecPath" value="C:\Work\css\jacocoresult\jacoco.exec"/>
<!--生成覆盖率报告的路径-->
<property name="jacocoReportPath" value="C:\Work\css\jacocoresult\jacocoReport"/>
<!--远程服务的ip地址 -->
<property name="server_ip" value="39.105.66.41"/>
<!--前面javaagent配置的远程服务打开的端口,要跟上面配置的一样-->
<property name="server_port_css" value="8086"/>
<!--css项目源代码路径-->
<property name="css_sourceaPath" value="C:\Work\css\css\src\main\java\"/>
<!--css项目class文件路径-->
<property name="
css_classPath" value="C:\Work\css\css\target\classes\"/>
<!--让ant知道去哪儿找Jacoco-->
<taskdef uri="
antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="
${jacocoAntPath}"/>
</taskdef>
<target name="
run">
<echo message="
start..."/>
<echo message="
dump..."/>
<antcall target="
dump"/>
<echo message="
report..."/>
<antcall target="
report"/>
<echo message="
end..."/>
</target>
<!--dump任务:
根据前面配置的ip地址,和端口号,访问目标服务,并生成.exec文件。
reset=true时,会在dump出exec文件后,清空覆盖率数据;
append=false时,dump出的exec文件会覆盖原有的exec文件;append=true时,dump出的exec文件
追加至原有的exec文件;
-->
<target name="
dump">
<jacoco:dump address="
${server_ip}" reset="false" destfile="${jacocoExecPath}/class_css.exec" port="${server_port_css}" append="true"/>
</target>
<!--jacoco任务:
根据前面配置的源代码路径和.class文件路径,
dump后生成的.exec文件,生成最终的html覆盖率报告。-->
<target name="
report">
<jacoco:report>
<executiondata>
<file file = "
C:\Work\css\jacocoresult\jacoco.exec\class_css.exec" />
</executiondata>
<structure name="
JaCoCo Report">
<!--group name 对应生成的报告中的列表名-->
<group name="
css_Demo">
<sourcefiles encoding="
UTF-8">
<fileset dir="
${css_sourceaPath}"/>
</sourcefiles>
<classfiles>
<fileset dir="
${css_classPath}"/>
</classfiles>
</group>
</structure>
<html destdir="
${jacocoReportPath}" encoding="utf-8"/>
<csv destfile="
${jacocoReportPath}/report.csv"/>
<xml destfile="
${jacocoReportPath}/report.xml"/>
</jacoco:report>
</target>
</project>

执行ant -f jacocoant.xml生成代码覆盖率报告:

###4、与Jekins jacoco plugin插件集成:

环境配置:

Job名称:jacoco_report





###5、不同使用场景下的设置
ant dump任务属性:




共收到 3 条回复 时间 点赞

楼主这个更像是jacoco搭建教程?

先赞后看 支持一下
我也是用java做测试

simple 回复

就是一个简单的介绍,jacoco有哪几种使用方式,怎么用

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up