Jacoco踩坑过程

引论

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

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

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

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

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



    
    
    
        
    

    
    
        
    

配置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正是如此
    才能生成报告

参考资料:

  • Java 覆盖率 Jacoco 插桩的不同形式总结和踩坑记录
  • onthefly动态插桩覆盖率统计
  • Jenkins集成jacoco收集集成测试覆盖率

你可能感兴趣的:(Jacoco踩坑过程)