K8s 上使用 jacoco 测试代码覆盖率

说明

  • jacoco 可以统计代码覆盖率,常用于测试过程中使用,检查测试场景对代码的覆盖情况
  • 使用 jacoco agent 方式进行测试
  • 在 k8s 上运行,jacoco agent 的 port 使用 NodePort 模式供外部 jacococli 访问生成报告

配置

构建包含jacoco 的 tomcat 镜像

  • Dockerfile
    • JACOCO_INCLUDE:对要插桩的包进⾏过滤,* 表示所有
    • JACOCO_PORT:agent 暴露的供 jacococli 连接的端口
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
FROM xtomcat:latest

COPY ./pkgs/jacocoagent.jar /tools/jacocoagent.jar
COPY ./tomcat-bins/setenv-with-jacocoagent.sh /tomcat/bin/setenv.sh

ENV JVM_XMX="256"
ENV JVM_XMX="512"
ENV JACOCO_INCLUDE="*"
ENV JACOCO_PORT="9080"

EXPOSE 9080
  • setenv-with-jacocoagent.sh
1
2
3
4
CATALINA_HOME="/tomcat"
CATALINA_BASE="/tomcat"
JAVA_OPTS="-server -Xms${JVM_XMS}M -Xmx${JVM_XMX}M -javaagent:/tools/jacocoagent.jar=includes=${JACOCO_INCLUDE},output=tcpserver,port=${JACOCO_PORT},address=*,append=true"
CATALINA_PID="/tomcat/bin/PID.pid"

以 Deployment 部署后,通过 NodePort 模式的 server

  • 将 9080 映射到 node 的 32191 端口
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
apiVersion: v1
kind: Service
metadata:
  name: "test-jacoco-service"
  labels:
    app: "test-jacoco-service"
  namespace: test-ns
spec:
  type: NodePort
  ports:
    - port: 9080
      name: jcoco
      targetPort: 9080
      nodePort: 32191
  selector:
    app: "test-jacoco-service"

生成查看报告

dump 生成覆盖率文件

  • 本地运行 jacococli 生成 dump
1
java -jar jacococli.jar dump --address XXX.XXX.XXX.XXX --port 32191  --destfile ./jacoco_dump.exec

分析 exec 文件生成 html 报告

  • 代码目录需先执行打包命令,生成 class 文件
1
mvn -Dmaven.test.skip=true -am clean package
  • 生成报告
1
2
java -jar jacococli.jar report ./jacoco_dump.exec --classfiles PROJECT_NAME/MODULE_NAME/target/classes/ \
--sourcefiles PROJECT_NAME/MODULE_NAME/src/main/java/ --html report_html

查看 html