Docker 的優點
966
2025-03-31
測試覆蓋率是對測試完成程度的度量。它通常依據某種覆蓋準則來對測試用例執行情況進行衡量,以判斷測試執行得是否充分
。
——出自《
計算機科學技術名詞 》第三版
今天文章中我們給大家介紹覆蓋率統計及覆蓋率分析。在10月13日20:00,資深測試開發架構師思寒將光臨直播間手把手教大家如何搞定精準化測試!
溫馨提示:你以為代碼覆蓋率與精準化測試知識與黑盒測試無緣?不,你只是沒遇到思寒講的這節課。
常見覆蓋率統計工具
emma
cobertura
jacoco
emma 與 cobertura 是為單元測試而設計的覆蓋率統計,jacoco 與 emma 同屬于一家公司,但是是為了更廣泛的覆蓋率統計而設計的工具。
Jacoco
jacoco 的文檔中有個 mission 章節,里面對 jacoco 的定位描述的很好。原文的大意是說其他的工具沒有得到積極有效的維護,而且其他的工具都是為了單一任務而設計,他們不是為了 “集成” 而生。從這一點上我們就可以看出 jacoco 的設計理念。
得益于 jacoco 的設計理念,以及良好的 api 設計,它可以輕松的與已有的工具集成,甚至進行平臺化。它也可以同時用于單元測試與集成測試,所以是一款非常優秀的覆蓋率統計工具,很多公司的精準化測試,就是重度依賴了 jacoco。
覆蓋率分析原理
要了解代碼覆蓋率的統計原理,我們就需要去深入了解 jvm 的機制。這方面的知識是 java 領域的高端進階知識,限于篇幅,我們只講解下大概的原理,完整內容請參考 VM 虛擬機系列的書籍,以及 newrelic 早年發布的若干代碼插樁的資料。
簡單說下原理,java 源代碼會被 javac 編譯為 class 文件,class 文件保存了 class 的基本信息與 jvm 的指令集。java 的底層 runtime,也就是 jvm 在解析 class 的時候,會把文件格式的 class 讀取到內存并運行。android 也是借鑒了這一整套的設計理念,android 上的 runtime 其實是 dalvik 與 art。
當我們要統計代碼覆蓋率的時候,就需要在代碼的執行路徑上加入探針分析。通常是在讀取類的時候,在關鍵的指令塊的出口與入口增加標記。當指令塊被執行后,就會命中探針并完成記錄。
要修改最底層的 jvm 字節碼往往是比較麻煩的,需要精通 jvm 的各種指令以及 java class 結構。這方面的處理目前已有有非常成熟的開源項目可以做大了,如下就是一些知名的字節碼修改工具。
ASM
JavaAssist
ByteBuddy、BTrace、JVM-Sandbox
其中 ASM 是所有字節碼操作的底層基礎,是最底層的字節碼修改工具。其他工具是它之上的一些高級封裝。借助于這些工具與 JVM 自身的一些調試特性,我們就可以對 jvm 代碼或者進程進行便捷的操縱了。
插樁方式
插樁方式有很多種,常見的方式如下
源代碼插樁:offline 插樁,支持 android
字節碼插樁:offline 插樁,支持 android
javaagent 模式:脫離代碼在運行時插樁,on the fly 模式
jacoco 支持字節碼插樁與 javaagent 這兩種插樁方式。也就是就算沒有源代碼也可以統計到覆蓋率數據,但是最后分析的時候,還是要結合源代碼才能獲得更多的覆蓋率細節數據。畢竟覆蓋率的統計,并不是只是簡單的覆蓋率數據本身的指標高低。
jacoco的工作方式
jacoco 支持四種工作模式
file:進程結束的時候在本地生成文件
tcpserver:開啟端口等待客戶端獲取覆蓋率
tcpclient:主動把覆蓋率數據發送出去
none:不生成覆蓋率
很多人都會使用 file 模式,但是 tcp server 模式才是最易用的。因為不需要申請服務器的文件訪問權限就可控制覆蓋率數據。你可以根據自己公司的部署情況選擇合適的工作模式。
on the fly 插樁模式是使用最多的。首先需要在你的被測 java 程序啟動的時候,加入 jvm 的一些 javaagent 參數。
-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2] destfile output:file、tcpserver、tcpclient、none address port
你可以自己設置適合的工作模式。
離線插樁模式,適合 android 的覆蓋率統計,需要借助于 maven、gradle 等構建工具的 instrument 指令。
jacoco-cli 是 jacoco 的一個組件,可以在不依賴 maven、gradle 構建工具的情況下完成對代碼的分析。主要用于 tcpserver 工作模式下。
用法如下
java -jar jacococli.jar dump [--address
] --destfile這是學院里的一個動手演練的小場景,統計 jmeter 工具的啟動覆蓋率
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。