测试技术

JaCoCo + Ant测试代码覆盖率

2019-11-06  本文已影响0人  圣瓦伦

一、JaCoCo简述

JaCoCo是一个开源的覆盖率工具,它针对的开发语言是java,其使用方法很灵活,可以嵌入到Ant、Maven中;可以作为Eclipse插件,可以使用其JavaAgent技术监控Java程序等等。

很多第三方的工具提供了对JaCoCo的集成,如sonar、Jenkins等。

JaCoCo包含了多种尺度的覆盖率计数器,包含指令级覆盖(Instructions,C0coverage),分支(Branches,C1coverage)、圈复杂度(CyclomaticComplexity)、行覆盖(Lines)、方法覆盖(non-abstract methods)、类覆盖(classes)

二、JaCoCo基本概念

jacoco支持多种覆盖率的统计,包括:

  1. 行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
  2. 类覆盖率:度量计算class类文件是否被执行。
  3. 分支覆盖率:度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。
  4. 方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
  5. 指令覆盖:计数单元是单个java二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全 独立源码格式。
  6. 圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块

三、JaCoCo使用方式

3.1 Apache Ant方式

参见 http://eclemma.org/jacoco/trunk/doc/ant.html

3.2 命令行方式

参见 http://www.eclemma.org/jacoco/trunk/doc/agent.html

大概的命令:

 -javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]

其他参数可以查看上面的链接

接口测试时,我们也是使用该方式来进行,具体的说明会在下面另外说明

3.3 Apache Maven方式

参见 http://www.eclemma.org/jacoco/trunk/doc/maven.html

这种方式适合Maven的项目。

3.4 Eclipse EclDmma Plugin方式

参见 http://www.eclemma.org/

该方式主要和eclipse集成,用户可以直观的看到覆盖率的情况

四、接口测试代码覆盖率

接口测试的入口是人工调用相关接口或者做相关动作产生的。jacoco agent监测测试活动,手动dump出来之后生成exec文件,最终生成覆盖率的报告。

其中,需要配置的地方有两个:

4.1 server端--安装jacoco

1.https://www.jacoco.org/jacoco/ 下载下来,随意放在一个目录,解压即可。

180服务器上已经安装了jacoco,放在/home/hik/jacoco目录

2.因为我们服务是通过k8s容器部署的,要想容器内能访问到jacocoagent.jar,设置了一个NFS存储配置如图:

NFS配置

3.声明挂载:

挂载

4.使用:

使用

4.2 server端–启动参数配置

1.JAVA_OPTS参数加上:
-javaagent:/home/lib/jacocoagent.jar=includes=*,output=tcpserver,port=8030,address=0.0.0.0

# -javaagent: 的后面跟jacoco的安装路径
# includes= 选项,选择你要覆盖率的服务
# port= 选项,选择你要打开的端口,和服务端口要不一样,即是一个其他人未占用的端口
# address= 选项,服务所在机器的ip地址(容器里面填写0.0.0.0)

2.重启服务即可。这样server端已经启动了一个jacoco agent对服务进行监控

4.3 client端 – 本地安装ant

http://ant.apache.org 上下载ant,解压

4.4 client端 – 本地配置build.xml

防踩坑提醒:build.xml文件中的jacoco版本和sever端配置的jacoco版本最好一致(jacoco-0.8.5),否则可能会出现“Unable to dump coverage data”错误。

  1. client端也需要安装jacoco
  2. 编写build.xml文件,放在ant解压之后的/bin目录下:
    本地路径和端口需要根据实际情况修改
<?xml version="1.0" ?>
<project name="testExec" xmlns:jacoco="antlib:org.jacoco.ant" default="report">
        <property name="test.server.host" value="10.8.101.180" />
        <property name="local.server.host" value="127.0.0.1" />
        <property name="event-linkage.port" value="31118" />
        <property name="gis.port" value="31119" />
        <property name="stastics.port" value="31120" />
        <tstamp>
            <!-- 自定义时间戳变量 -->
            <format property="current.date.time" pattern="yyyyMMddHHmmss"/>
        </tstamp>
        <!--让ant知道去哪儿找Jacoco-->
        <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
                <!-- 本地jacocoant.jar路径 -->
                <classpath path="G:/software/apache-ant-1.10.4/lib/jacocoant.jar" />
        </taskdef>  
        <target name="clean">
                <!-- 清空文件 -->
                <delete dir="G:/test/fpCMS/report" />
                <delete dir="G:/test/fpCMS/exec" />
        </target>
        <target name="dump">
            <!--dump任务:
                根据前面配置的ip地址,和端口号,访问目标服务,并生成.exec文件。
                reset=true时,会在dump出exec文件后,清空覆盖率数据(默认rest=false);
                append=false时,dump出的exec文件会覆盖原有的exec文件;append=true时,dump出的exec文件     
                追加至原有的exec文件;
            -->
            <jacoco:dump address="${local.server.host}" port="${event-linkage.port}" append=true destfile="G:/test/fpCMS/exec/cloud-eventLink-${current.date.time}.exec" />
            <jacoco:dump address="${local.server.host}" port="${gis.port}" append=true destfile="G:/test/fpCMS/exec/cloud-gis-${current.date.time}.exec" />
            <!--<jacoco:dump address="${local.server.host}" port="${stastics.port}" destfile="G:/test/fpCMS/exec/stastic-${current.date.time}.exec" />-->
        </target>
        <target name="merge">
                <!-- 合并多份exec文件 -->
                <jacoco:merge destfile="G:/test/fpCMS/exec/merged.exec">
                        <fileset dir="G:/test/fpCMS/exec" includes="cloud-*.exec" />
                </jacoco:merge>
        </target>
        <target name="report" depends="dump,merge">
            <!--  Step 3: Create coverage report  -->
            <jacoco:report>
                 <!--
                 This task needs the collected execution data and ... 
                -->
                <executiondata>
                    <file file="G:/test/fpCMS/exec/merged.exec"/>
                </executiondata>
                <!--  the class files and optional source files ...  -->
                <structure name="JaCoCo Ant Example">
                    <!-- 重要!本地class文件和java文件必须和server上保持一致 -->
                    <group name="cloud-event-linkage-service">
                        <classfiles>
                            <fileset dir="G:/workspace/fpCMS/cloud-service/cloud-event-linkage-service/target/classes/"/>
                        </classfiles>
                        <sourcefiles encoding="UTF-8">
                            <fileset dir="G:/workspace/fpCMS/cloud-service/cloud-event-linkage-service/src/main/java/"/>
                        </sourcefiles>
                    </group>
                    <group name="cloud-gis-service">
                        <classfiles>
                            <fileset dir="G:/workspace/fpCMS/cloud-service/cloud-gis-service/target/classes/"/>
                        </classfiles>
                        <sourcefiles encoding="UTF-8">
                            <fileset dir="G:/workspace/fpCMS/cloud-service/cloud-gis-service/src/main/java/"/>
                        </sourcefiles>
                    </group>
                    <!--<group name="cloud-statistics-service">
                        <classfiles>
                            <fileset dir="G:/workspace/fpCMS/cloud-service/cloud-statistics-service/target/classes/"/>
                        </classfiles>
                        <sourcefiles encoding="UTF-8">
                            <fileset dir="G:/workspace/fpCMS/cloud-service/cloud-statistics-service/src/main/java/"/>
                        </sourcefiles>
                    </group>-->
                </structure>
                <!--  生成html报告文件地址  -->
                <html destdir="G:/test/fpCMS/report"/>
            </jacoco:report>
        </target>
</project>

4.5 本地执行ant任务

1.打开命令行,切换到ant安装路径/bin目录下

2.执行 ant report命令(根据build.xml配置,report命令包含了dump,merge,report命令,这些命令可以单独使用),生成报告

3.生成的报告在<html destdir="G:/test/fpCMS/report"/>配置路径下,点击打开index.html:

绿色:执行过的代码
黄色:部分执行
红色:未执行

覆盖报告

4.6 其他说明

1.本地代码和server代码不一致时,报告无法展示

2.不同版本的报告(修改过代码)merge时无法保留之前的记录,会显示最新修改的文件,未修改文件的记录还在

3.build.xml文件比较灵活,理解之后可以自行配置,不一定完全对应上面的版本。参考:https://www.jacoco.org/jacoco/trunk/doc/ant.html

4.ant clean 命令可以删除掉文件

五、与Jenkins集成

待续。

参考:

https://www.jacoco.org/jacoco/
https://sq.163yun.com/blog/article/185102636718170112
https://blog.csdn.net/qq_26392615/article/details/82228972

上一篇下一篇

猜你喜欢

热点阅读