美文网首页测试技术
JaCoCo + Ant测试代码覆盖率

JaCoCo + Ant测试代码覆盖率

作者: 圣瓦伦 | 来源:发表于2019-11-06 16:31 被阅读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文件,最终生成覆盖率的报告。

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

    • server端---即测试服务器
    • client端—即需要分析exec文件的地方,比如本地或者jenkins

    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

    相关文章

      网友评论

        本文标题:JaCoCo + Ant测试代码覆盖率

        本文链接:https://www.haomeiwen.com/subject/qjnubctx.html