測試覆蓋率是對測試完成程度的度量 。它通常依據(jù)某種覆蓋準則來對測試用例執(zhí)行情況進行衡量 , 以判斷測試執(zhí)行得是否充分 。
——出自《計算機科學(xué)技術(shù)名詞 》第三版
常見覆蓋率統(tǒng)計工具
emma 與是為單元測試而設(shè)計的覆蓋率統(tǒng)計, 與 emma 同屬于一家公司,但是是為了更廣泛的覆蓋率統(tǒng)計而設(shè)計的工具 。
的文檔中有個章節(jié),里面對的定位描述的很好 。原文的大意是說其他的工具沒有得到積極有效的維護,而且其他的工具都是為了單一任務(wù)而設(shè)計,他們不是為了 “集成” 而生 。從這一點上我們就可以看出的設(shè)計理念 。
得益于的設(shè)計理念,以及良好的 api 設(shè)計,它可以輕松的與已有的工具集成 , 甚至進行平臺化 。它也可以同時用于單元測試與集成測試,所以是一款非常優(yōu)秀的覆蓋率統(tǒng)計工具 , 很多公司的精準化測試,就是重度依賴了。
覆蓋率分析原理
要了解代碼覆蓋率的統(tǒng)計原理,我們就需要去深入了解 jvm 的機制 。這方面的知識是 java 領(lǐng)域的高端進階知識,限于篇幅,我們只講解下大概的原理,完整內(nèi)容請參考 VM 虛擬機系列的書籍,以及早年發(fā)布的若干代碼插樁的資料 。
簡單說下原理,java 源代碼會被 javac 編譯為 class 文件,class 文件保存了 class 的基本信息與 jvm 的指令集 。java 的底層,也就是 jvm 在解析 class 的時候,會把文件格式的 class 讀取到內(nèi)存并運行 。也是借鑒了這一整套的設(shè)計理念 , 上的其實是與 art 。
當我們要統(tǒng)計代碼覆蓋率的時候,就需要在代碼的執(zhí)行路徑上加入探針分析 。通常是在讀取類的時候,在關(guān)鍵的指令塊的出口與入口增加標記 。當指令塊被執(zhí)行后,就會命中探針并完成記錄 。
【軟件測試丨只懂黑盒測試也能學(xué)會的代碼覆蓋率及精準化測試】要修改最底層的 jvm 字節(jié)碼往往是比較麻煩的,需要精通 jvm 的各種指令以及 java class 結(jié)構(gòu) 。這方面的處理目前已有有非常成熟的開源項目可以做大了,如下就是一些知名的字節(jié)碼修改工具 。
其中 ASM 是所有字節(jié)碼操作的底層基礎(chǔ),是最底層的字節(jié)碼修改工具 。其他工具是它之上的一些高級封裝 。借助于這些工具與 JVM 自身的一些調(diào)試特性,我們就可以對 jvm 代碼或者進程進行便捷的操縱了 。
插樁方式
插樁方式有很多種,常見的方式如下
支持字節(jié)碼插樁與這兩種插樁方式 。也就是就算沒有源代碼也可以統(tǒng)計到覆蓋率數(shù)據(jù),但是最后分析的時候,還是要結(jié)合源代碼才能獲得更多的覆蓋率細節(jié)數(shù)據(jù) 。畢竟覆蓋率的統(tǒng)計,并不是只是簡單的覆蓋率數(shù)據(jù)本身的指標高低 。
的工作方式
支持四種工作模式
很多人都會使用 file 模式,但是 tcp模式才是最易用的 。因為不需要申請服務(wù)器的文件訪問權(quán)限就可控制覆蓋率數(shù)據(jù) 。你可以根據(jù)自己公司的部署情況選擇合適的工作模式 。
on the fly 插樁模式
on the fly 插樁模式是使用最多的 。首先需要在你的被測 java 程序啟動的時候,加入 jvm 的一些參數(shù) 。
-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]destfileoutput:file、tcpserver、tcpclient、noneaddressport
你可以自己設(shè)置適合的工作模式 。
離線插樁模式c語言apache下載配置,適合的覆蓋率統(tǒng)計,需要借助于 maven、 等構(gòu)建工具的指令 。
on the fly 插樁模式

文章插圖

文章插圖
-cli 是的一個組件 , 可以在不依賴 maven、 構(gòu)建工具的情況下完成對代碼的分析 。主要用于工作模式下 。
用法如下
java -jar jacococli.jar dump [--address ] --destfile[--help] [--port ] [--quiet] [--reset] [--retry ]項目演練
這是學(xué)院里的一個動手演練的小場景,統(tǒ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.jarjava -javaagent:org.jacoco.agent-0.8.6-20200329.124039-45-runtime.jar-jar $project_root/bin/ApacheJMeter.jar#退出jmeter#生成覆蓋率報告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/#生成帶有源代碼的覆蓋率報告 java -jar $jacoco_cli_jar reportjacoco.exec--classfiles "$project_root/bin/ApacheJMeter.jar"--classfiles $project_root/lib/ext/ApacheJMeter_http.jar--html jmeter_coverage/ --sourcefiles ~/projects/jmeter/src/#生成xml報告java -jar $jacoco_cli_jar report jacoco_tcpserver2.exec--classfiles "$project_root/bin/ApacheJMeter.jar" --classfiles $project_root/lib/ext/ApacheJMeter_http.jar --xmljmeter_coverage_tcpserver2/jacoco.xml完整代碼請參考學(xué)員論壇中的課程帖中的源代碼 。
導(dǎo)入覆蓋率
可以分析的 exec 文件與 xml 文件c語言apache下載配置,并自動導(dǎo)入覆蓋率 。exec 文件的分析后續(xù)會放棄支持,主支持 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ù)限定要分析代碼的范圍 , 通常是指明要覆蓋的范圍
導(dǎo)入覆蓋率
可以智能分析新老版本之間的新增代碼的覆蓋率,這點非常不錯,以前一些分析代碼 diff 的工作就節(jié)省了 。他的代碼分析也比較智能,簡單的換行并不會干擾代碼 diff 的分析范圍 。
通過覆蓋率數(shù)據(jù)
支持兩種通用的測試數(shù)據(jù)導(dǎo)入
這樣方便與各種框架進行集成,也方便測試工程師二次定制 。
通用測試數(shù)據(jù)模板 。
通用覆蓋率數(shù)據(jù)模板
在的分析中,加入對應(yīng)的配置參數(shù)即可導(dǎo)入通用測試數(shù)據(jù) 。
通用測試數(shù)據(jù)導(dǎo)入的常見用途
代碼diff方法
代碼的 diff 分析是一個比較大的話題,diff 只是對代碼的最簡單的一個分析策略,要想深入的理解代碼,我們還需要更進一步的分析代碼的調(diào)用鏈 。我們先看最簡單的代碼 diff 分析工具 。
代碼 diff 分析工具
本文到此結(jié)束,希望對大家有所幫助 。
- 1分鐘合并100份Word文件居然這么簡單?不用代碼或插件,只需兩步
- 開啟電腦后只能進入安全模式,不能正常開機,該如何處理?
- 賽季只拿到58分的保安隊長杜德利 ?杜德利評湖人
- 讓電腦變成真正的辦公神器,只安裝了這7個精華軟件,免費又好用
- 男友不主動牽手擁抱還有親吻 ?交往大半年男朋友只牽手親吻
- 男朋友要用彩禮錢買房子首付 ?男友買房只寫我名字不給彩禮
- 論女強人我只服張柏芝 ?張柏芝20年前青澀素顏照笑容甜美
- SolidWorks只讀與Windows只讀,誰真誰假
- ?螃蟹有幾只腳
- 新婚夜就這樣度過了,只能用一個字來表達 ?新婚之夜都是怎樣度過的
