利用jacoco,如何在runtime期间获取项目代码覆盖率?

2019-09-26  本文已影响0人  小明今晚加班

无论你使用哪个服务器,tomcat也好,web-sephery liberty也罢,如何把jacoco这个agent打到我们的image中?如何进行jacoco的配置,以及报告解析成为解决上述问题的关键!
我这里利用liberty为基础镜像,把jacocoagent构建到image中,经过实践采坑,记录一下历程:

  1. 我的自定义Dockerfile文件:
**********************START:DOCKERFILE**********************
FROM websphere-liberty:kernel

COPY sonarTest.war /config/dropins/
COPY jacocoagent.jar /home/

ENV JAVA_TOOL_OPTIONS -javaagent:/home/jacocoagent.jar=output=tcpserver,port=6300,address=*

EXPOSE 9080 9443 6300
**********************END:DOCKERFILE**********************
  1. 构建image:
docker build -t jacoco:v0 . 
  1. 启动image:(这里注意,一定要把6300端口暴露出去,否则影响下一步的获取exec文件)
docker run -d -p 6300:6300
  1. 容器启动之后,就可以通过CLI去获取项目代码覆盖率;
    生成二进制文件:
java -jar jacococli.jar dump --destfile ./jacoco.exec 
  1. 解析二进制文件:(生成report文件夹,在其下有html文件信息;并生成report.xml文件)
java -jar jacococli.jar report ./jacoco.exec --classfiles /Users/zhaochengcai/eclipse-workspace/sonarTest/build/classes/java --sourcefiles /Users/zhaochengcai/eclipse-workspace/sonarTest/src/main/java --html report --xml report.xml

Tips:其中 --classfiles是必须的,也就是项目build之后生成的class文件.

至此,jacocoagent已成功打进我们的image中,并获取了测试覆盖率的文件。


在上述经历中遇到的问题:

  1. 启动image的时候 没有把port 6300给暴露出来,导致第4步生成exec二进制文件的时候出现Connection reset. 这里必须要承认自己在docker方面的基础知识不够扎实!!!
  2. 在构建Dockerfile的时候,address=* 这个参数有点意思,之前我写的是address=localhost,也尝试了address=127.0.0.1,但是在第4步获取exec二进制文件的时候得到的错误都是如下所示:


    Connection reset

    这里要借助jacoco官方文档的一句话:

IP address or hostname to bind to when the output method is tcpserver or connect to when the output method is tcpclient. 
In tcpserver mode the value "*" causes the agent to accept connections on any local address.

也就是说如果用address=* 的话,jacoco agent可以接收本地的任何连接.所以,这里使用 * 通配符为妙.

image.png
上一篇下一篇

猜你喜欢

热点阅读