美文网首页
Jacoco踩坑过程

Jacoco踩坑过程

作者: 慕止 | 来源:发表于2020-12-13 13:57 被阅读0次

    引论

    之前一直想做这个覆盖率来着,年初的时候,大佬就说这个要做起来。
    对于测试来说,覆盖率是绕不过去的。分为需求覆盖率,代码覆盖率。

    需求覆盖:指的是测试人员对需求的了解程度,根据需求的可测试性来拆分成各个子需求点,来编写相应的测试用例,最终建立一个需求和用例的映射关系,以用例的测试结果来验证需求的实现,可以理解为黑盒覆盖。

    代码覆盖:为了更加全面的覆盖,我们可能还需要理解被测程序的逻辑,需要考虑到每个函数的输入与输出,逻辑分支代码的执行情况,这个时候我们的测试执行情况就以代码覆盖率来衡量,可以理解为白盒覆盖。

    一个是我们的业务能力,一个是我们的技术能力。

    JAVA代码覆盖率工具JaCoCo-原理篇 >> jacoco原理篇参考

    原理

    看完原理篇就会发现,似乎是一个单元测试的工具。
    那我们首先就从原理上自己试试。然后打开IDE自己去写写demo。


    demo

    单元测试覆盖率达到70%

    image.png

    然后发现,只能开发单测写全了,是不是就没我们什么事了
    但这是一个误区,为什么呢。
    有句谚语:条条大路通罗马。
    开发写的单测是一个方式,我们走需求覆盖,接口覆盖也是另外一个方式。

    第一步,启动服务

    方案:on-the-fly模式+ant dump+Jenkins jacoco plugs插件

    On-the-fly插桩:

    JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。

    Jenkins 配置拉源码,ant dump exec文件,生成报告。

    服务上我结合了docker
    以我demo为例
    这是dockerfile文件

    FROM registry.cn-hangzhou.aliyuncs.com/mzdeveloper/base_jdk8
    # 将targer目录下的jar包复制到docker容器/home/springboot目录下面目录下面
    ENV APP_NAME=demo
    ENV C_ENVIRONMENT="dev"
    ENV JAVA_OPTS="-server"
    ENV PROFILE=docker
    
    COPY ./${APP_NAME}.jar /data/${APP_NAME}.jar
    COPY ./jacocoagent.jar /tmp/jacocoagent.jar
    
    #带java agnet参数运行java -jar命令,注意address要写0.0.0.0
    ENTRYPOINT exec java -javaagent:/tmp/jacocoagent.jar=includes=*,output=tcpserver,port=6305,address=0.0.0.0 $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=${PROFILE} -jar /data/${APP_NAME}.jar
    EXPOSE 8080
    EXPOSE 6305
    

    build完之后,推到harbor,嫌麻烦直接本机启动。

    docker run -d -p 8081:8080 -p 6305:6305 demo:1.1
    

    启动完毕,用接口跑跑看看正常不。


    postman调用

    配置Jenkins

    安装步骤的啥的就不说了
    插件要下载

    • git
    • maven
    • jacoco

    新建一个自由风格
    记得先去添加git凭证
    我这边用的gitee


    拉代码的配置 maven和ant
    jacocoexecPath=$WORKSPACE/coverage/promotion.exec
    reportfolderPath=$WORKSPACE/coverage/report
    server_ip=your_server
    server_port=6305
    

    build.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="wftestReport" xmlns:jacoco="antlib:org.jacoco.ant" default="jacoco">
        <!--Jacoco 的安装路径-->
        <property name="jacocoantPath" value="/var/jenkins_home/jacoco/jacocoant.jar"/>
        <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>
    </project>
    
    配置jacoco

    以上Jenkins构建配置

    最终效果

    这个过程不是那么容易弄。我也是解决了很多问题才可以的。

    以下记录主要问题

    FAQ

    1. mvn 失败
      我Jenkins也是docker构建的。既然找不到mvn那我们自己装上去就可以了
      主要是要在Jenkins shell里面加上
      source /etc/profile

    2. ant识别的时候 server_port问题
      注意是否打开了端口

    3. classPath怎么来的
      由于jacoco特性,我们必须要有源码,也就是target下的class
      所以配置上我们也需要源码上的 src 和 class,加mvn正是如此
      才能生成报告

    参考资料:

    相关文章

      网友评论

          本文标题:Jacoco踩坑过程

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