
今天文章中我們給大家介紹覆寫率統計及覆寫率分析,
常見覆寫率統計工具
- 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
- java agent 模式:脫離代碼在運行時插樁,on the fly 模式
jacoco 支持位元組碼插樁與 javaagent 這兩種插樁方式,也就是就算沒有源代碼也可以統計到覆寫率資料,但是最后分析的時候,還是要結合源代碼才能獲得更多的覆寫率細節資料,畢竟覆寫率的統計,并不是只是簡單的覆寫率資料本身的指標高低,
jacoco的作業方式
jacoco 支持四種作業模式
- file:行程結束的時候在本地生成檔案
- tcpserver:開啟埠等待客戶端獲取覆寫率
- tcpclient:主動把覆寫率資料發送出去
- none:不生成覆寫率
很多人都會使用 file 模式,但是 tcp server 模式才是最易用的,因為不需要申請服務器的檔案訪問權限就可控制覆寫率資料,你可以根據自己公司的部署情況選擇合適的作業模式,
on the fly 插樁模式
on the fly 插樁模式是使用最多的,首先需要在你的被測 java 程式啟動的時候,加入 jvm 的一些 javaagent 引數,
-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]destfileoutput:file、tcpserver、tcpclient、noneaddressport
你可以自己設定適合的作業模式,
離線插樁模式,適合 android 的覆寫率統計,需要借助于 maven、gradle 等構建工具的 instrument 指令,
on the fly 插樁模式
jacoco-cli 是 jacoco 的一個組件,可以在不依賴 maven、gradle 構建工具的情況下完成對代碼的分析,主要用于 tcpserver 作業模式下,
用法如下
java -jar jacococli.jar dump [--address <address>] --destfile <path> [--help] \[--port <port>] [--quiet] [--reset] [--retry <count>]
專案演練
這是學院里的一個動手演練的小場景,統計 jmeter 工具的啟動覆寫率
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 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報告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
完整代碼請參考學員論壇中的課程帖中的源代碼,
匯入覆寫率
sonarqube 可以分析 jacoco 的 exec 檔案與 xml 檔案,并自動匯入覆寫率,exec 檔案的分析后續會放棄支持,主支持 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/
匯入覆寫率

可以通過如下引數限定要分析代碼的范圍,通常是指明要覆寫的 package 范圍
- sonar.sources
- sonar.inclusions
匯入覆寫率
sonarqube 可以智能分析新老版本之間的新增代碼的覆寫率,這點非常不錯,以前一些分析代碼 diff 的作業就節省了,他的代碼分析也比較智能,簡單的換行并不會干擾代碼 diff 的分析范圍,

通過覆寫率資料
sonarqube 支持兩種通用的測驗資料匯入
- 通用覆寫率資料:sonar.coverageReportPaths
- 通用測驗執行資料:sonar.testExecutionReportPaths
這樣方便與各種框架進行集成,也方便測驗工程師二次定制,
通用測驗資料模板,

通用覆寫率資料模板

在 sonarqube 的 scanner 分析中,加入對應的配置引數即可匯入通用測驗資料,
通用測驗資料匯入的常見用途
- 將各種測驗工具的測驗報告轉換為 sonarqube 支持的格式從而匯入平臺
- 將各種覆寫率工具的覆寫率報告轉換為標準格式匯入平臺
- 根據需求對差異 diff 覆寫率進行定制,比如除了對新增代碼做覆寫,還要對使用了新增代碼的依賴代碼也做分析
代碼diff方法
代碼的 diff 分析是一個比較大的話題,diff 只是對代碼的最簡單的一個分析策略,要想深入的理解代碼,我們還需要更進一步的分析代碼的呼叫鏈,我們先看最簡單的代碼 diff 分析工具,
- 代碼 diff 分析工具
- JGit:git 分析工具
- JavaParser:語法分析
- ASM:讀取位元組碼
- javap:jdk 自帶位元組碼分析工具
下面是測驗資料,對于做【軟體測驗】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!

最后: 可以在公眾號:傷心的辣條 ! 免費領取一份216頁軟體測驗工程師面試寶典檔案資料,以及相對應的視頻學習教程免費分享!,其中包括了有基礎知識、Linux必備、Shell、互聯網程式原理、Mysql資料庫、抓包工具專題、介面測驗工具、測驗進階-Python編程、Web自動化測驗、APP自動化測驗、介面自動化測驗、測驗高級持續集成、測驗架構開發測驗框架、性能測驗、安全測驗等,
學習不要孤軍奮戰,最好是能抱團取暖,相互成就一起成長,群眾效應的效果是非常強大的,大家一起學習,一起打卡,會更有學習動力,也更能堅持下去,你可以加入我們的測驗技術交流扣扣群:914172719(里面有各種軟體測驗資源和技術討論)
喜歡軟體測驗的小伙伴們,如果我的博客對你有幫助、如果你喜歡我的博客內容,請 “點贊” “評論” “收藏” 一鍵三連哦!
好文推薦
轉行面試,跳槽面試,軟體測驗人員都必須知道的這幾種面試技巧!
面試經:一線城市搬磚!又面軟體測驗崗,5000就知足了…
面試官:作業三年,還來面初級測驗?恐怕你的軟體測驗工程師的頭銜要加雙引號…
什么樣的人適合從事軟體測驗作業?
那個準點下班的人,比我先升職了…
測驗崗反復跳槽,跳著跳著就跳沒了…
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317890.html
標籤:其他
上一篇:Web自動化測驗的理解
