引論
之前一直想做這個(gè)覆蓋率來(lái)著霉颠,年初的時(shí)候,大佬就說(shuō)這個(gè)要做起來(lái)荆虱。
對(duì)于測(cè)試來(lái)說(shuō),覆蓋率是繞不過去的朽们。分為需求覆蓋率怀读,代碼覆蓋率。
需求覆蓋:指的是測(cè)試人員對(duì)需求的了解程度骑脱,根據(jù)需求的可測(cè)試性來(lái)拆分成各個(gè)子需求點(diǎn)菜枷,來(lái)編寫相應(yīng)的測(cè)試用例,最終建立一個(gè)需求和用例的映射關(guān)系叁丧,以用例的測(cè)試結(jié)果來(lái)驗(yàn)證需求的實(shí)現(xiàn)啤誊,可以理解為黑盒覆蓋。
代碼覆蓋:為了更加全面的覆蓋拥娄,我們可能還需要理解被測(cè)程序的邏輯蚊锹,需要考慮到每個(gè)函數(shù)的輸入與輸出,邏輯分支代碼的執(zhí)行情況稚瘾,這個(gè)時(shí)候我們的測(cè)試執(zhí)行情況就以代碼覆蓋率來(lái)衡量牡昆,可以理解為白盒覆蓋。
一個(gè)是我們的業(yè)務(wù)能力摊欠,一個(gè)是我們的技術(shù)能力丢烘。
JAVA代碼覆蓋率工具JaCoCo-原理篇 >> jacoco原理篇參考
原理
看完原理篇就會(huì)發(fā)現(xiàn),似乎是一個(gè)單元測(cè)試的工具些椒。
那我們首先就從原理上自己試試播瞳。然后打開IDE自己去寫寫demo。
單元測(cè)試覆蓋率達(dá)到70%
然后發(fā)現(xiàn)免糕,只能開發(fā)單測(cè)寫全了赢乓,是不是就沒我們什么事了
但這是一個(gè)誤區(qū)忧侧,為什么呢。
有句諺語(yǔ):條條大路通羅馬骏全。
開發(fā)寫的單測(cè)是一個(gè)方式苍柏,我們走需求覆蓋,接口覆蓋也是另外一個(gè)方式姜贡。
第一步试吁,啟動(dòng)服務(wù)
方案:on-the-fly模式+ant dump+Jenkins jacoco plugs插件
On-the-fly插樁:
JVM中通過-javaagent參數(shù)指定特定的jar文件啟動(dòng)Instrumentation的代理程序,代理程序在通過Class Loader裝載一個(gè)class前判斷是否轉(zhuǎn)換修改class文件楼咳,將統(tǒng)計(jì)代碼插入class熄捍,測(cè)試覆蓋率分析可以在JVM執(zhí)行測(cè)試代碼的過程中完成。
Jenkins 配置拉源碼母怜,ant dump exec文件余耽,生成報(bào)告。
服務(wù)上我結(jié)合了docker
以我demo為例
這是dockerfile文件
FROM registry.cn-hangzhou.aliyuncs.com/mzdeveloper/base_jdk8
# 將targer目錄下的jar包復(fù)制到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參數(shù)運(yùn)行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,嫌麻煩直接本機(jī)啟動(dòng)轨域。
docker run -d -p 8081:8080 -p 6305:6305 demo:1.1
啟動(dòng)完畢袱耽,用接口跑跑看看正常不。
配置Jenkins
安裝步驟的啥的就不說(shuō)了
插件要下載
- git
- maven
- jacoco
新建一個(gè)自由風(fēng)格
記得先去添加git憑證
我這邊用的gitee
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 任務(wù):
根據(jù)前面配置的 ip 地址干发,和端口號(hào)朱巨,
訪問目標(biāo) Tomcat 服務(wù),并生成 .exec 文件枉长。-->
<target name="dump">
<jacoco:dump address="${server_ip}" reset="false" destfile="${jacocoexecPath}" port="${server_port}" append="true"/>
</target>
</project>
以上Jenkins構(gòu)建配置
這個(gè)過程不是那么容易弄冀续。我也是解決了很多問題才可以的。
以下記錄主要問題
FAQ
mvn 失敗
我Jenkins也是docker構(gòu)建的必峰。既然找不到mvn那我們自己裝上去就可以了
主要是要在Jenkins shell里面加上
source /etc/profile
ant識(shí)別的時(shí)候 server_port問題
注意是否打開了端口classPath怎么來(lái)的
由于jacoco特性洪唐,我們必須要有源碼,也就是target下的class
所以配置上我們也需要源碼上的 src 和 class吼蚁,加mvn正是如此
才能生成報(bào)告
參考資料: