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


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

2020-02-27

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

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

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

返回

  • jacoco-0.8.2.zip 解压到:D:\software\jacoco
  • apache-ant-1.10.6-bin.zip 解压到:D:\software\ant 

返回

源代码:jacocodemo.zip

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

图1 被测系统jacocoDemo

 

返回

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

           
            
            
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-surefire-pluginartifactId>
            plugin>

            
            
            <plugin>
                <groupId>org.jacocogroupId>
                <artifactId>jacoco-maven-pluginartifactId>
                <version>0.8.3version>
                <configuration>
                    
                    <destFile>target/coverage/jacoco-unit.execdestFile>
                    
                    <dataFile>target/coverage/jacoco-unit.execdataFile>
                configuration>
                <executions>
                    <execution>
                        <id>jacoco-initializeid>
                        <goals>
                            <goal>prepare-agentgoal>
                        goals>
                    execution>
                    <execution>
                        <id>jacoco-siteid>
                        <phase>testphase>
                        <goals>
                            <goal>reportgoal>
                        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.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- jacoco-maven-plugin:0.8.3:prepare-agent (jacoco-initialize) @ jacocodemo ---
[INFO] argLine set to -javaagent:D:\\software\\maven\\repo\\m2\\org\\jacoco\\org.jacoco.agent\\0.8.3\\org.jacoco.agent-0.8.3-runtime.jar=destfile=D:\\Code\\jacocodemo\\target\\coverage\\jacoco-unit.exec
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ jacocodemo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ jacocodemo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 6 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.2: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.0:testCompile (default-testCompile) @ jacocodemo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\Code\jacocodemo\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.21.0:test (default-test) @ jacocodemo ---
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.service.MathServiceTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.07 s - in com.example.service.MathServiceTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- jacoco-maven-plugin:0.8.3:report (jacoco-site) @ jacocodemo ---
[INFO] Loading execution data file D:\Code\jacocodemo\target\coverage\jacoco-unit.exec
[INFO] Analyzed bundle 'jacocodemo' with 6 classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  5.227 s
[INFO] Finished at: 2020-02-27T16:07:58+08:00
[INFO] ------------------------------------------------------------------------

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

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

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

图3 覆盖率详情

 

返回

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=6300,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">
  
  <property name="jacocoantPath" value="D:\software\jacoco\lib\jacocoant.jar"/>
  
  <property name="jacocoexecPath" value="D:\Code\jacocodemo\target\coverage\jacoco-integation.exec"/>
  
  <property name="reportfolderPath" value="D:\Code\jacocodemo\target\coverage\jacoco-report"/>
  
  <property name="server_ip" value="10.8.116.81"/>
  
  <property name="server_port" value="6300"/>
  
  <property name="checkOrderSrcPath" value="D:\Code\jacocodemo\src\main\java" />
  
  <property name="checkOrderClasspath" value="D:\Code\jacocodemo\target\classes" />

  
  <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
      <classpath path="${jacocoantPath}" />
  taskdef>

  
  <target name="dump">
      <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
  target>
  
  
  <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:6300
[jacoco:dump] Dumping execution data to D:\Code\jacocodemo\target\coverage\jacoco-integation.exec

BUILD SUCCESSFUL
Total time: 0 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 6 classes

BUILD SUCCESSFUL
Total time: 0 seconds

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

图5 接口测试覆盖方法subtract

参考:

[1] 

[2] Jacoco Code Coverage