引论
之前一直想做这个覆盖率来着,年初的时候,大佬就说这个要做起来。
对于测试来说,覆盖率是绕不过去的。分为需求覆盖率,代码覆盖率。
需求覆盖:指的是测试人员对需求的了解程度,根据需求的可测试性来拆分成各个子需求点,来编写相应的测试用例,最终建立一个需求和用例的映射关系,以用例的测试结果来验证需求的实现,可以理解为黑盒覆盖。
代码覆盖:为了更加全面的覆盖,我们可能还需要理解被测程序的逻辑,需要考虑到每个函数的输入与输出,逻辑分支代码的执行情况,这个时候我们的测试执行情况就以代码覆盖率来衡量,可以理解为白盒覆盖。
一个是我们的业务能力,一个是我们的技术能力。
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
-
mvn 失败
我Jenkins也是docker构建的。既然找不到mvn那我们自己装上去就可以了
主要是要在Jenkins shell里面加上
source /etc/profile
-
ant识别的时候 server_port问题
注意是否打开了端口 -
classPath怎么来的
由于jacoco特性,我们必须要有源码,也就是target下的class
所以配置上我们也需要源码上的 src 和 class,加mvn正是如此
才能生成报告
参考资料:
网友评论