Jacoco收集单元测试、集成测试和系统功能测试覆盖率

2020-02-27

 目录

1 安装版本
2 被测系统代码示例
3 收集单元测试覆盖率
4 收集集成和功能测试覆盖率

代码覆盖率可在单元测试、系统测试和系统功能测试中使用

    • 单元测试:测试左移,在代码提交前,可制定覆盖率要求,若不满足,不能提交
    • 集成测试:接口测试
    • 系统功能测试:通过用户界面操作

1 安装版本


返回

2 被测系统代码示例


返回

源代码:jacocodemo.zip

该示例示基于springboot框架的后端系统,主要是两个数字的加减乘除,提供restful接口给外部调用

图1 被测系统jacocoDemo

3 收集单元测试覆盖率


返回

配置被测项目pom.xml,添加插件设置:

           <!--maven测试为 default 生命周期中的test阶段。-->
<!--test阶段与 maven-surefire-plugin 的test目标相绑定了, 这是一个内置的绑定。-->
<!--Maven通过插件来执行 JUnit 和 TestNG 的测试用例。-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin> <!--执行单元测试命令:mvn test-->
<!--结果在target目录下生产jacoco-unit.exec文件,表明jacoco正确执行-->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
<configuration>
<!--指定生成 .exec 文件的存放位置-->
<destFile>target/coverage/jacoco-unit.exec</destFile>
<!--Jacoco 是根据 .exec 文件生成最终的报告,所以需指定 .exec 的存放路径-->
<dataFile>target/coverage/jacoco-unit.exec</dataFile>
</configuration>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>

执行maven命令

mvn test

命令执行日志如下:

D:\Code\jacocodemo>mvn test
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.example:jacocodemo >-----------------------
[INFO] Building jacocodemo 0.0.-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- jacoco-maven-plugin:0.8.:prepare-agent (jacoco-initialize) @ jacocodemo ---
[INFO] argLine set to -javaagent:D:\\software\\maven\\repo\\m2\\org\\jacoco\\org.jacoco.agent\\0.8.\\org.jacoco.agent-0.8.-runtime.jar=destfile=D:\\Code\\jacocodemo\\target\\coverage\\jacoco-unit.exec
[INFO]
[INFO] --- maven-resources-plugin:3.0.:resources (default-resources) @ jacocodemo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying resource
[INFO] Copying resource
[INFO]
[INFO] --- maven-compiler-plugin:3.7.:compile (default-compile) @ jacocodemo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling source files to D:\Code\jacocodemo\target\classes
[INFO] /D:/Code/jacocodemo/src/main/java/com/example/controller/MathController.java: D:\Code\jacocodemo\src\main\java\com\example\controller\MathController.java使用了未经检查或不安全的操作。
[INFO] /D:/Code/jacocodemo/src/main/java/com/example/controller/MathController.java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
[INFO]
[INFO] --- maven-resources-plugin:3.0.:testResources (default-testResources) @ jacocodemo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\Code\jacocodemo\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.7.:testCompile (default-testCompile) @ jacocodemo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling source file to D:\Code\jacocodemo\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.21.:test (default-test) @ jacocodemo ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.service.MathServiceTest
[INFO] Tests run: , Failures: , Errors: , Skipped: , Time elapsed: 0.07 s - in com.example.service.MathServiceTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: , Failures: , Errors: , Skipped:
[INFO]
[INFO]
[INFO] --- jacoco-maven-plugin:0.8.:report (jacoco-site) @ jacocodemo ---
[INFO] Loading execution data file D:\Code\jacocodemo\target\coverage\jacoco-unit.exec
[INFO] Analyzed bundle 'jacocodemo' with classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.227 s
[INFO] Finished at: --27T16::+:
[INFO] ------------------------------------------------------------------------

生成exec文件和report文件如下图2所示

图2 单元测试单面覆盖率文件

由于类MathService方法add被调用,jacoco收集到此信息,如下图3所示

图3 覆盖率详情

4 收集集成和功能测试覆盖率


返回

1 把被测被测系统打包并改名成 jacocodemo.jar

mvn package

2 启动被测系统,并通过javaagentJavaAgent会监听服务器端设置的TCP port,然后把收集到的信息(jacoco.exec)写入TCP connection

java -javaagent:D:/software/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=,address=10.8.116.81,append=true -jar D:/Code/jacocodemo/target/jacocodemo.jar

3 配置ant的build.xml文件,并把它放到被测系统代码根目录

build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="JacocoDmo" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
<!--Jacoco 的安装路径-->
<property name="jacocoantPath" value="D:\software\jacoco\lib\jacocoant.jar"/>
<!--最终生成 .exec 文件的路径,Jacoco 就是根据这个文件生成最终的报告的-->
<property name="jacocoexecPath" value="D:\Code\jacocodemo\target\coverage\jacoco-integation.exec"/>
<!--生成覆盖率报告的路径-->
<property name="reportfolderPath" value="D:\Code\jacocodemo\target\coverage\jacoco-report"/>
<!--远程 Tomcat 服务的 ip 地址-->
<property name="server_ip" value="10.8.116.81"/>
<!--前面配置的远程 Tomcat 服务打开的端口,要跟上面配置的一样-->
<property name="server_port" value="6300"/>
<!--源代码路径-->
<property name="checkOrderSrcPath" value="D:\Code\jacocodemo\src\main\java" />
<!--.class 文件路径-->
<property name="checkOrderClasspath" value="D:\Code\jacocodemo\target\classes" /> <!--让 ant 知道去哪儿找 Jacoco-->
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${jacocoantPath}" />
</taskdef> <!--dump 任务:
根据前面配置的 ip 地址,和端口号,
访问目标 Tomcat 服务,并生成 .exec 文件。-->
<target name="dump">
<jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
</target> <!--jacoco 任务:
根据前面配置的源代码路径和 .class 文件路径,
根据 dump 后,生成的 .exec 文件,生成最终的 html 覆盖率报告。-->
<target name="report">
<delete dir="${reportfolderPath}" />
<mkdir dir="${reportfolderPath}" /> <jacoco:report>
<executiondata>
<file file="${jacocoexecPath}" />
</executiondata> <structure name="JaCoCo Report">
<group name="Check Order related">
<classfiles>
<fileset dir="${checkOrderClasspath}">
<!-- 过滤不必要的文件 -->
<exclude name="**/R.class"/>
<exclude name="**/R$*.class"/>
<exclude name="**/*$ViewInjector*.*"/>
<exclude name="**/BuildConfig.*"/>
<exclude name="**/Manifest*.*"/>
</fileset>
</classfiles>
<sourcefiles encoding="UTF-8">
<fileset dir="${checkOrderSrcPath}" />
</sourcefiles>
</group>
</structure>
<html destdir="${reportfolderPath}" encoding="UTF-8" />
<csv destfile="${reportfolderPath}/coverage-report.csv" encoding="UTF-8"/>
<xml destfile="${reportfolderPath}/coverage-report.xml" encoding="UTF-8"/>
</jacoco:report>
</target>
</project>

4 用postman调用被测系统接口,如下图4所示

图4 postman调用被测系统接口

5 执行ant dump拉取jacoco.exec覆盖率信息,执行ant report生成覆盖率报告

D:\Code\jacocodemo>ant dump
Buildfile: D:\Code\jacocodemo\build.xml dump:
[jacoco:dump] Connecting to /10.8.116.81:
[jacoco:dump] Dumping execution data to D:\Code\jacocodemo\target\coverage\jacoco-integation.exec BUILD SUCCESSFUL
Total time: seconds D:\Code\jacocodemo>ant report
Buildfile: D:\Code\jacocodemo\build.xml report:
[mkdir] Created dir: D:\Code\jacocodemo\target\coverage\jacoco-report
[jacoco:report] Loading execution data file D:\Code\jacocodemo\target\coverage\jacoco-integation.exec
[jacoco:report] Writing bundle 'Check Order related' with classes BUILD SUCCESSFUL
Total time: seconds

从覆盖率报告可以看到subtract方法被覆盖,如图5所示

图5 接口测试覆盖方法subtract

参考:

[1] Jacoco远程统计tomcat服务(Windows系统)的代码覆盖率

[2] Jacoco Code Coverage

Jacoco收集单元测试、集成测试和系统功能测试覆盖率的更多相关文章

  1. Jenkins集成jacoco收集单元测试覆盖率

    Jenkins集成jacoco收集单元测试覆盖率 2020-02-28 目录 0 整体思路1 Jenkins创建JacocoIntegrateTestDemo项目2 配置源码管理3 配置Build4 ...

  2. 在jenkins和sonar中集成jacoco(一)--使用jacoco收集单元测试的覆盖率

    之前系统的持续集成覆盖率工具使用的是cobetura,使用的过程中虽然没什么问题,但感觉配置比较麻烦,现在准备改用jacoco这个覆盖率工具来代替它.接下来我介绍一下jenkins配置jacoco,并 ...

  3. Jenkins集成jacoco收集集成测试覆盖率

    Jenkins集成jacoco收集集成测试覆盖率 2020-02-28 目录 0 整体思路1 安装版本2 全局工具配置3 Jenkins创建JacocoIntegrateTestDemo项目  3.1 ...

  4. Android-jacoco代码覆盖率:单元测试覆盖率+功能测试覆盖率

    参考:https://docs.gradle.org/current/dsl/org.gradle.testing.jacoco.tasks.JacocoCoverageVerification.ht ...

  5. [liu yanling]软件开发的过程按阶段划分有:单元测试 集成测试 系统测试 验收测试

    从软件开发的过程按阶段划分有:单元测试 集成测试 系统测试 验收测试测试过程按 4 个步骤进行,概念内容如下:单元测试:单元测试是对软件基本组成单元(如函数.类的方法等)进行的测试.集成测试:集成测试 ...

  6. 使用Jacoco获取 Java 程序的代码执行覆盖率

    Jacoco是Java Code Coverage的缩写,顾名思义,它是获取Java代码执行覆盖率的一个工具,通常用它来获取单元测试覆盖率.它通过分析Java字节码来得到代码执行覆盖率,因此它还可以分 ...

  7. jest & puppeteer & 单元测试 & 集成测试

    jest & puppeteer 单元测试 & 集成测试 单元测试,就是测试一个函数或某个代码片段,通过模拟输入确保输出符合预期 集成测试,测的是一个功能模块,比如用户注册功能,集成测 ...

  8. Linux 系统运行着许多子系统和应用程序。您可以使用系统日志记录从启动时就收集有关运行中系统的数据。有时

    概述 在本教程中,您将学习以下内容: 配置 syslog 守护程序 了解标准设施.优先级和操作 配置日志轮换 了解 rsyslog 和 syslog-ng 系统内部发生了什么 Linux 系统运行着许 ...

  9. 在jenkins和sonar中集成jacoco(三)--使用jacoco收集集成测试的覆盖率

    我们系统使用weblogic做服务器,集成测试框架使用的是junit+selenium. 首先,要把jacoco的jacocoagent.jar包放到部署应用的服务器上,接着在系统服务的JAVA_OP ...

随机推荐

  1. 6.场景4:使用VRRP(L3HA)和Open vSwitch提供高可用性

    此场景描述了使用ML2插件和Open vSwitch(OVS)实现OpenStack网络服务的高可用性实现. 该高可用性实施方案增加了以下情景:带有虚拟路由器冗余协议(VRRP)的Open vSwit ...

  2. 2019icpc南京网络赛 A The beautiful values of the palace(离线+树状数组)

    题意: (假设所有的点对应的值已经求出)给你一个1e6*1e6的矩阵,有m<=1e5个点有值,其余都为0 q<=1e5个询问,求子矩阵的权值和 思路: 根据二维差分,对于询问左下角(x1, ...

  3. java8数组

    public class jh_01_为什么需要数组 { public static void main(String[] args) { int [] arr = new int[5]; // in ...

  4. (六)mybatis拦截器

    首先拦截器可以拦截mybatis四大核心对象:StatementHandler,ParameterHandler,ResultSetHandler,Executor,具体拦截时根据需求拦截一部分方法 ...

  5. 2020牛客寒假算法基础集训营4 B:括号序列

    B : 括号序列 考察点 : 栈 坑点 : 只有栈空时才是合法的 Code: #include <stack> #include <cstdio> #include <s ...

  6. error C2662

    原因:关于const的问题 具体错误:函数的参数列表中参数签名为const,但是却调用了该参数的非const的成员函数 例子: 即使我们知道NoConst()并不会改变类的data成员,编译器依旧会报 ...

  7. SPH液面重构过程中的问题

    使用粒子方法进行流体特效模拟需要进行液面重构,构造出流体的自由表面,液面重构方法也是一个独立的研究方向,针对其的研究已经有了很多成果,包括液面的平滑度.精度和并行效率等. 在这里,主要是记录一下我在液 ...

  8. 一. 数据分片和路由 <<大数据日知录>> 读书笔记

    本章主要讲解大数据下如何做数据分片,所谓分片,即将大量数据分散在不同的节点,同时每个存储节点还要做副本备份. 而一般的抽象分片方法是, 先将数据映射到一个分片空间,这是多对一的关系,即一个数据分片区间 ...

  9. SpringCloud微服务:阿里开源组件Nacos,服务和配置管理

    源码地址:GitHub·点这里||GitEE·点这里 一.阿里微服务简介 1.基础描述 Alibaba-Cloud致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开 ...

  10. [红日安全]Web安全Day1 - SQL注入实战攻防

    本文由红日安全成员: Aixic 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名 ...