測(cè)試覆蓋率是對(duì)測(cè)試完成程度的度量绸贡。它通常依據(jù)某種覆蓋準(zhǔn)則來對(duì)測(cè)試用例執(zhí)行情況進(jìn)行衡量闸与,以判斷測(cè)試執(zhí)行得是否充分。??
?——出自《計(jì)算機(jī)科學(xué)技術(shù)名詞 》第三版??
今天文章中我們給大家介紹覆蓋率統(tǒng)計(jì)及覆蓋率分析狰右。在10月13日20:00玖瘸,資深測(cè)試開發(fā)架構(gòu)師思寒將光臨直播間手把手教大家如何搞定精準(zhǔn)化測(cè)試秸讹!??
溫馨提示:你以為代碼覆蓋率與精準(zhǔn)化測(cè)試知識(shí)與黑盒測(cè)試無緣?不雅倒,你只是沒遇到思寒講的這節(jié)課璃诀。
常見覆蓋率統(tǒng)計(jì)工具??
? * emma
? * cobertura
? * jacoco
emma 與 cobertura 是為單元測(cè)試而設(shè)計(jì)的覆蓋率統(tǒng)計(jì),jacoco 與 emma 同屬于一家公司蔑匣,但是是為了更廣泛的覆蓋率統(tǒng)計(jì)而設(shè)計(jì)的工具劣欢。
Jacoco??
jacoco 的文檔中有個(gè) mission 章節(jié),里面對(duì) jacoco
的定位描述的很好裁良。原文的大意是說其他的工具沒有得到積極有效的維護(hù)凿将,而且其他的工具都是為了單一任務(wù)而設(shè)計(jì),他們不是為了 “集成”
而生价脾。從這一點(diǎn)上我們就可以看出 jacoco 的設(shè)計(jì)理念牧抵。
得益于 jacoco 的設(shè)計(jì)理念,以及良好的 api
設(shè)計(jì)侨把,它可以輕松的與已有的工具集成犀变,甚至進(jìn)行平臺(tái)化。它也可以同時(shí)用于單元測(cè)試與集成測(cè)試秋柄,所以是一款非常優(yōu)秀的覆蓋率統(tǒng)計(jì)工具获枝,很多公司的精準(zhǔn)化測(cè)試,就是重度依賴了
jacoco骇笔。
覆蓋率分析原理??
要了解代碼覆蓋率的統(tǒng)計(jì)原理省店,我們就需要去深入了解 jvm 的機(jī)制。這方面的知識(shí)是 java
領(lǐng)域的高端進(jìn)階知識(shí)笨触,限于篇幅萨西,我們只講解下大概的原理,完整內(nèi)容請(qǐng)參考 VM 虛擬機(jī)系列的書籍旭旭,以及 newrelic 早年發(fā)布的若干代碼插樁的資料谎脯。
簡單說下原理,java 源代碼會(huì)被 javac 編譯為 class 文件持寄,class 文件保存了 class 的基本信息與 jvm 的指令集源梭。java
的底層 runtime,也就是 jvm 在解析 class 的時(shí)候稍味,會(huì)把文件格式的 class 讀取到內(nèi)存并運(yùn)行废麻。android
也是借鑒了這一整套的設(shè)計(jì)理念,android 上的 runtime 其實(shí)是 dalvik 與 art模庐。
當(dāng)我們要統(tǒng)計(jì)代碼覆蓋率的時(shí)候烛愧,就需要在代碼的執(zhí)行路徑上加入探針分析。通常是在讀取類的時(shí)候,在關(guān)鍵的指令塊的出口與入口增加標(biāo)記怜姿。當(dāng)指令塊被執(zhí)行后慎冤,就會(huì)命中探針并完成記錄。
要修改最底層的 jvm 字節(jié)碼往往是比較麻煩的沧卢,需要精通 jvm 的各種指令以及 java class
結(jié)構(gòu)蚁堤。這方面的處理目前已有有非常成熟的開源項(xiàng)目可以做大了,如下就是一些知名的字節(jié)碼修改工具但狭。
? * ASM
? * JavaAssist
? * ByteBuddy披诗、BTrace、JVM-Sandbox
其中 ASM 是所有字節(jié)碼操作的底層基礎(chǔ)立磁,是最底層的字節(jié)碼修改工具呈队。其他工具是它之上的一些高級(jí)封裝。借助于這些工具與 JVM
自身的一些調(diào)試特性唱歧,我們就可以對(duì) jvm 代碼或者進(jìn)程進(jìn)行便捷的操縱了宪摧。
插樁方式??
###??
###??
插樁方式有很多種,常見的方式如下
? * 源代碼插樁:offline 插樁迈喉,支持 android
? * 字節(jié)碼插樁:offline 插樁,支持 android
? * javaagent 模式:脫離代碼在運(yùn)行時(shí)插樁温圆,on the fly 模式
jacoco 支持字節(jié)碼插樁與 javaagent
這兩種插樁方式挨摸。也就是就算沒有源代碼也可以統(tǒng)計(jì)到覆蓋率數(shù)據(jù),但是最后分析的時(shí)候岁歉,還是要結(jié)合源代碼才能獲得更多的覆蓋率細(xì)節(jié)數(shù)據(jù)得运。畢竟覆蓋率的統(tǒng)計(jì),并不是只是簡單的覆蓋率數(shù)據(jù)本身的指標(biāo)高低锅移。
jacoco的工作方式??
###??
jacoco 支持四種工作模式
? * file:進(jìn)程結(jié)束的時(shí)候在本地生成文件
? * tcpserver:開啟端口等待客戶端獲取覆蓋率
? * tcpclient:主動(dòng)把覆蓋率數(shù)據(jù)發(fā)送出去
? * none:不生成覆蓋率
很多人都會(huì)使用 file 模式熔掺,但是 tcp server
模式才是最易用的。因?yàn)椴恍枰暾?qǐng)服務(wù)器的文件訪問權(quán)限就可控制覆蓋率數(shù)據(jù)非剃。你可以根據(jù)自己公司的部署情況選擇合適的工作模式置逻。
on the fly 插樁模式??
on the fly 插樁模式是使用最多的。首先需要在你的被測(cè) java 程序啟動(dòng)的時(shí)候备绽,加入 jvm 的一些 javaagent 參數(shù)券坞。
? *? ?*? ?*? ?*? ?*?
? ? -javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]destfileoutput:file、tcpserver肺素、tcpclient恨锚、noneaddressport
你可以自己設(shè)置適合的工作模式。
離線插樁模式倍靡,適合 android 的覆蓋率統(tǒng)計(jì)猴伶,需要借助于 maven、gradle 等構(gòu)建工具的 instrument 指令。
on the fly 插樁模式??
jacoco-cli 是 jacoco 的一個(gè)組件他挎,可以在不依賴 maven筝尾、gradle 構(gòu)建工具的情況下完成對(duì)代碼的分析。主要用于 tcpserver
工作模式下雇盖。
用法如下
? *? ?*?
? ? java -jar jacococli.jar dump [--address <address>] --destfile <path> [--help] \[--port <port>] [--quiet] [--reset] [--retry <count>]
項(xiàng)目演練??
這是學(xué)院里的一個(gè)動(dòng)手演練的小場(chǎng)景忿等,統(tǒng)計(jì) jmeter 工具的啟動(dòng)覆蓋率
? *? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*? ?*?
? ? project_root=/Users/seveniruby/temp/java_2/jacoco/apache-jmeter-5.2.1jacoco_cli_jar=org.jacoco.cli-0.8.6-20200329.124045-45-nodeps.jar??
? ? java -javaagent:org.jacoco.agent-0.8.6-20200329.124039-45-runtime.jar \? -jar $project_root/bin/ApacheJMeter.jar??
? ? #退出jmeter??
? ? #生成覆蓋率報(bào)告java -jar $jacoco_cli_jar report jacoco.exec \--classfiles "$project_root/bin/ApacheJMeter.jar" \--classfiles $project_root/lib/ext/ApacheJMeter_http.jar \--html jmeter_coverage/??
? ? #生成帶有源代碼的覆蓋率報(bào)告 java -jar $jacoco_cli_jar report? jacoco.exec? \ --classfiles "$project_root/bin/ApacheJMeter.jar" \ --classfiles $project_root/lib/ext/ApacheJMeter_http.jar \ --html jmeter_coverage/ --sourcefiles ~/projects/jmeter/src/??
? ? #生成xml報(bào)告java -jar $jacoco_cli_jar report jacoco_tcpserver2.exec? \--classfiles "$project_root/bin/ApacheJMeter.jar" \--classfiles $project_root/lib/ext/ApacheJMeter_http.jar \--xml? jmeter_coverage_tcpserver2/jacoco.xml
完整代碼請(qǐng)參考學(xué)員論壇中的課程帖中的源代碼。??
導(dǎo)入覆蓋率??
sonarqube 可以分析 jacoco 的 exec 文件與 xml 文件崔挖,并自動(dòng)導(dǎo)入覆蓋率贸街。exec 文件的分析后續(xù)會(huì)放棄支持,主支持 xml
文件的分析狸相。
? *? ?*? ?*? ?*? ?*? ?*? ?*? ?*?
? ? ?sonar-scanner? ?\? -Dsonar.host.url=http://sonarqube.testing-studio.com:9000? ?\? -Dsonar.login=$SONARQUBE_TOKEN? ?\? -Dsonar.projectKey=jmeter? ?\? -Dsonar.projectVersion=1.0? \? -Dsonar.coverage.jacoco.xmlReportPaths=$PWD/jmeter_coverage_tcpserver2/jacoco.xml \? -Dsonar.projectBaseDir=/Users/seveniruby/projects/jmeter/ \? -Dsonar.java.binaries=/Users/seveniruby/projects/jmeter/
導(dǎo)入覆蓋率??
可以通過如下參數(shù)限定要分析代碼的范圍薛匪,通常是指明要覆蓋的 package 范圍
? * sonar.sources
? * sonar.inclusions
導(dǎo)入覆蓋率??
sonarqube 可以智能分析新老版本之間的新增代碼的覆蓋率,這點(diǎn)非常不錯(cuò)脓鹃,以前一些分析代碼 diff
的工作就節(jié)省了逸尖。他的代碼分析也比較智能,簡單的換行并不會(huì)干擾代碼 diff 的分析范圍瘸右。??
通過覆蓋率數(shù)據(jù)??
sonarqube 支持兩種通用的測(cè)試數(shù)據(jù)導(dǎo)入
? * 通用覆蓋率數(shù)據(jù):sonar.coverageReportPaths
? * 通用測(cè)試執(zhí)行數(shù)據(jù):sonar.testExecutionReportPaths
這樣方便與各種框架進(jìn)行集成娇跟,也方便測(cè)試工程師二次定制。
通用測(cè)試數(shù)據(jù)模板太颤。
通用覆蓋率數(shù)據(jù)模板
在 sonarqube 的 scanner 分析中苞俘,加入對(duì)應(yīng)的配置參數(shù)即可導(dǎo)入通用測(cè)試數(shù)據(jù)。
通用測(cè)試數(shù)據(jù)導(dǎo)入的常見用途
? * 將各種測(cè)試工具的測(cè)試報(bào)告轉(zhuǎn)換為 sonarqube 支持的格式從而導(dǎo)入平臺(tái)
? * 將各種覆蓋率工具的覆蓋率報(bào)告轉(zhuǎn)換為標(biāo)準(zhǔn)格式導(dǎo)入平臺(tái)
? * 根據(jù)需求對(duì)差異 diff 覆蓋率進(jìn)行定制龄章,比如除了對(duì)新增代碼做覆蓋吃谣,還要對(duì)使用了新增代碼的依賴代碼也做分析
代碼diff方法??
代碼的 diff 分析是一個(gè)比較大的話題,diff
只是對(duì)代碼的最簡單的一個(gè)分析策略做裙,要想深入的理解代碼岗憋,我們還需要更進(jìn)一步的分析代碼的調(diào)用鏈。我們先看最簡單的代碼 diff 分析工具锚贱。
代碼 diff 分析工具
? * JGit:git 分析工具
? * JavaParser:語法分析
? * ASM:讀取字節(jié)碼
? * javap:jdk 自帶字節(jié)碼分析工具
?** _?
來霍格沃茲測(cè)試開發(fā)學(xué)社仔戈,學(xué)習(xí)更多軟件測(cè)試與測(cè)試開發(fā)的進(jìn)階技術(shù),知識(shí)點(diǎn)涵蓋web自動(dòng)化測(cè)試 app自動(dòng)化測(cè)試拧廊、接口自動(dòng)化測(cè)試杂穷、測(cè)試框架、性能測(cè)試卦绣、安全測(cè)試耐量、持續(xù)集成/持續(xù)交付/DevOps,測(cè)試左移滤港、測(cè)試右移廊蜒、精準(zhǔn)測(cè)試趴拧、測(cè)試平臺(tái)開發(fā)、測(cè)試管理等內(nèi)容山叮,課程技術(shù)涵蓋bash著榴、pytest、junit屁倔、selenium脑又、appium、postman锐借、requests问麸、httprunner、jmeter钞翔、jenkins严卖、docker、k8s布轿、elk哮笆、sonarqube、jacoco汰扭、jvm-sandbox等相關(guān)技術(shù)稠肘,全面提升測(cè)試開發(fā)工程師的技術(shù)實(shí)力
QQ交流群:484590337
公眾號(hào) TestingStudio
視頻資料領(lǐng)取:https://qrcode.testing-studio.com/f?from=jianshu&url=https://ceshiren.com/t/topic/15844