zoukankan      html  css  js  c++  java
  • Jacoco收集单元测试、集成测试和系统功能测试覆盖率

    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>
    View Code

    执行maven命令

    mvn test

    命令执行日志如下:

    D:Codejacocodemo>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:Codejacocodemo	argetclasses
    [INFO] /D:/Code/jacocodemo/src/main/java/com/example/controller/MathController.java: D:CodejacocodemosrcmainjavacomexamplecontrollerMathController.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:Codejacocodemosrc	est
    esources
    [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:Codejacocodemo	arget	est-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:Codejacocodemo	argetcoveragejacoco-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] ------------------------------------------------------------------------
    View Code

    生成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=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">
      <!--Jacoco 的安装路径-->
      <property name="jacocoantPath" value="D:softwarejacocolibjacocoant.jar"/>
      <!--最终生成 .exec 文件的路径,Jacoco 就是根据这个文件生成最终的报告的-->
      <property name="jacocoexecPath" value="D:Codejacocodemo	argetcoveragejacoco-integation.exec"/>
      <!--生成覆盖率报告的路径-->
      <property name="reportfolderPath" value="D:Codejacocodemo	argetcoveragejacoco-report"/>
      <!--远程 Tomcat 服务的 ip 地址-->
      <property name="server_ip" value="10.8.116.81"/>
      <!--前面配置的远程 Tomcat 服务打开的端口,要跟上面配置的一样-->
      <property name="server_port" value="6300"/>
      <!--源代码路径-->
      <property name="checkOrderSrcPath" value="D:Codejacocodemosrcmainjava" />
      <!--.class 文件路径-->
      <property name="checkOrderClasspath" value="D:Codejacocodemo	argetclasses" />
    
      <!--让 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>
    View Code

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

    图4 postman调用被测系统接口

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

    D:Codejacocodemo>ant dump
    Buildfile: D:Codejacocodemouild.xml
    
    dump:
    [jacoco:dump] Connecting to /10.8.116.81:6300
    [jacoco:dump] Dumping execution data to D:Codejacocodemo	argetcoveragejacoco-integation.exec
    
    BUILD SUCCESSFUL
    Total time: 0 seconds
    
    D:Codejacocodemo>ant report
    Buildfile: D:Codejacocodemouild.xml
    
    report:
        [mkdir] Created dir: D:Codejacocodemo	argetcoveragejacoco-report
    [jacoco:report] Loading execution data file D:Codejacocodemo	argetcoveragejacoco-integation.exec
    [jacoco:report] Writing bundle 'Check Order related' with 6 classes
    
    BUILD SUCCESSFUL
    Total time: 0 seconds

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

    图5 接口测试覆盖方法subtract

    参考:

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

    [2] Jacoco Code Coverage

  • 相关阅读:
    (转载)MySQL日期时间函数大全
    Tcl commands
    Toplevel
    tk 8.4 commands
    iwidgets
    Options for Buttontype widgets
    Text Widget Options
    tk options
    itk_option
    Widget Options
  • 原文地址:https://www.cnblogs.com/Ming8006/p/12372462.html
Copyright © 2011-2022 走看看