Jacoco + Ant 生成接口测试覆盖率报告

目录

一、准备环境

二、 启动服务

三、 编写 build.xml

四、 生成并查看报告

五、注意点   


 

一、准备环境

1. Java环境: 默认已配置好jdk环境,这里不多叙述。

2. Jacoco (Java Code Coverage) 依赖包:jacocoagent.jar 、jacocoant.jar

    下载链接: https://www.eclemma.org/jacoco/ 

     可以下载对应系统下的压缩包:  zip(window), tar.gz(linux)。 自行解压后,在解压后的文件夹中可以找到这两个jar.  然后将其上传到服务器路径  /usr/local/resources/jacoco/lib/ 。

3.  Ant:配置Ant环境和配置 JDK/Maven 一样,下载对应的包,配置环境变量即可。-

     下载链接: https://ant.apache.org/bindownload.cgi 

   (配置好后, 使用 ant -version 查看一下是否配置成功)

4.  项目jar包, 比如此处我们有一个SpringBoot项目,通过maven install 打成一个jar包, 此处重命名为 serviceA.jar。 然后上传到服务器路径 /usr/local/resources/serviceA.jar 。 

5.  同时将我们的源码和编译好的class文件也上传到服务器上 /usr/local/resources/service_A/.......  -- 用于生成测试报告时,将测试数据和源码做对应

   

二、 启动服务

1. 执行以下命令启动该java服务:

nohup java -javaagent:/usr/local/resources/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=127.0.0.1 -jar /usr/local/resources/serviceA.jar &

可以看到,与平时启动java服务不同的地方是, 多了如下配置参数:

-javaagent:/usr/local/resources/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=127.0.0.1

解释一下这句话的意思:

  1.   /usr/local/resources/jacoco/lib/jacocoagent.jar :  指定我们使用的 jacocoagent.jar 的路径

  2.   includes=* : 指定我们要测试的类, *  表示所有。可以指定具体包比如 (com.tinyv.*)

  3.   output=tcpserver,port=6300,address=127.0.0.1 : 

       output=tcpserver : 即在启动服务时,开启一个tcp服务,并配置IP 和 Port 供外部监听来获取信息;  

       address=127.0.0.1 : 这种配置只能在本地进行服务监听,意思是在哪台机器上启动服务,只能在这台机器上进行监听;也可以把address设为本机的真实IP, 那么就可以远程监听了。另外如果是在docker容器中启动的服务, 这里可以把地址设为0.0.0.0, 它将会自动映射主机IP。

      port=6300 :6300 端口是jacoco默认的端口, 可以改为其它的端口,但注意不要用已被其它服务占用的端口。 而且这个端口和我们的服务端口不是一回事, 我们的服务端口是默认的8080 。 另外如果是在docker容器中启动服务,注意在 Dockerfile中expose 这个端口。

 

(执行该命令后, 我们的 serviceA 服务正式启动, 且开放了一个tcp服务供外部监听)

        

三、 编写 build.xml

build.xml 是ant的默认构建文件, 如果不知道build.xml 是什么意思的话, 推荐阅读这篇文章,里面有很详细的说明:https://blog.csdn.net/SoftwareTester_zys/article/details/81389401 。 

在下面的demo中,定义了需要用到的属性值, 即<property>标签中声明的属性。 另外定义了两个target。 一个是dump, 另一个是report:

dump: 这个task用来连接上上述的tcp服务, 获取jacoco的执行数据,并生成 jacoco.exec 文件。

report:   这个task用来解析上面的jacoco.exec 文件, 并生成报告文件。 我们在浏览器中打开生成的 index.html 就可以查看到报告了。(<group>标签代表着按指定的路径进行聚合来生成报告,比如在下面demo中的3个group,那在报告首页就会有 config, service, controller 这3个分类)

<?xml version="1.0" ?>
<project name="jacoco_test" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">

  <property name="baseDir" value="/usr/local/resources/"/>
    <!--Jacoco的安装路径-->
  <property name="jacocoantPath" value="${baseDir}/jacoco/lib/jacocoant.jar"/>
  <!--最终生成.exec文件的路径,里面有覆盖率数据,Jacoco就是根据这个文件生成最终的报告的-->
  <property name="jacocoexecPath" value="${baseDir}/file/jacoco.exec"/>
    <!--生成覆盖率报告的路径-->
  <property name="reportfolderPath" value="${baseDir}/report/"/>
  <!--服务的ip地址-->
  <property name="server_ip" value="127.0.0.1"/>
  <!--前面配置的服务打开的端口,要跟jacocoagent一样-->
  <property name="server_port" value="6300"/>
  <!--源代码路径-->
  <property name="srcCodeBaseDir" value="${baseDir}/service_A/src/main/java" />
  <!--.class文件路径-->
  <property name="clsCodeBaseDir" value="${baseDir}/service_A/target/classes/com/tinyv/src/servicea/" />
  <!--让ant知道去哪儿找Jacoco-->
  <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
      <classpath path="${jacocoantPath}" />
  </taskdef>
  <!--dump任务: 根据前面配置的ip地址,和端口号,访问目标tcp服务,并生成.exec文件。-->
  <target name="dump">
      <jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="false"/>
  </target>

  <!--jacoco任务: 根据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="config">          
                  <classfiles>
                      <fileset dir="${clsCodeBaseDir}/config" />
                  </classfiles>
                  <sourcefiles encoding="utf-8">
                      <fileset dir="${srcCodeBaseDir}" />
                  </sourcefiles>
              </group>
              
              <group name="service">          
                  <classfiles>
                      <fileset dir="${clsCodeBaseDir}/service" />
                  </classfiles>
                  <sourcefiles encoding="utf-8">
                      <fileset dir="${srcCodeBaseDir}" />
                  </sourcefiles>
              </group>
              
              <group name="controller">          
                  <classfiles>
                      <fileset dir="${clsCodeBaseDir}/controller" />
                  </classfiles>
                  <sourcefiles encoding="utf-8">
                      <fileset dir="${srcCodeBaseDir}" />
                  </sourcefiles>
              </group>
          </structure>
          <html destdir="${reportfolderPath}" encoding="utf-8" />        
      </jacoco:report>
  </target>
</project>

四、 生成并查看报告

         1.  先执行命令:ant dump  --  然后可以在build.xml中配置的路径下, 找到jacoco.exec文件;

         2.  再执行命令:  ant report  --  然后可以在build.xml中配置的路径下, 找到生成的报告文件;

     在build.xml 中定义的report路径下,有 index.html 文件生成,在浏览器中查看此文件效果如下:

  对于报告中每个字段的含义,可以看看这篇文章: https://www.cnblogs.com/hushaojun/p/4308995.html 

 

五、注意点   

      5.1  定义源代码路径

      build.xml 中会定义class文件路径和源文件路径, 这里对class文件对路径没有特别要求,指定想要到路径便可; 但对于源代码路径,只能指定到  /src/main/java 这一层;

     举例:比如我们有源码和class文件路径如下:

             源码路径:  /usr/local/code/servicea/src/main/java/com/ ......

             class文件路径: /usr/local/code/servicea/target/classes/com/ ......

     那么在build.xml 文件中: 

     <sourcefiles> (源码路径标签) 里的内容都是  /usr/local/code/servicea/src/main/java  ;  

     <classfiles> (class文件路径) 可以指定到具体到包,比如 /usr/local/code/servicea/target/classes/com/tinyv/servicea/config/  等等。  

 

      如果不按照此格式定义源码路径, 在最后报告界面上会出现 Source file "com/xx/xxx/xxx.java" was not found during generation of report." 的错误。 

   

    5.2  在 docker 中启动服务

          在docker中启动服务要注意两点, 一个是address要写成 0.0.0.0 ,这样会自动映射到主机IP.   另外一点是不要忘记暴露出6300端口,且和主机端口做映射。 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值