測(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ā)布的若干代碼插樁的資料。
簡(jiǎn)單說下原理,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ì),并不是只是簡(jiǎn)單的覆蓋率數(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é)省了。他的代碼分析也比較智能,簡(jiǎn)單的換行并不會(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ì)代碼的最簡(jiǎn)單的一個(gè)分析策略,要想深入的理解代碼,我們還需要更進(jìn)一步的分析代碼的調(diào)用鏈。我們先看最簡(jiǎn)單的代碼 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)?。篽ttps://qrcode.testing-studio.com/f?from=jianshu&url=https://ceshiren.com/t/topic/15844