公司突然要求自動化測試對代碼的覆蓋率,故研究了一波jacoco相關
現狀
- 要拉取的是接口自動化測試的覆蓋率,非單元測試的,所以本身必須是在服務部署通過的情況下進行覆蓋率的收集
- 我們這使用的是容器,java springboot的框架
agent官網去學習了一波
調研了一波
- ant和maven的方法都是在編譯過程中單元測試時出分辨率
- jacoco agent是在服務啟動后,收集代碼覆蓋率
https://www.jacoco.org/jacoco/trunk/doc/
本次主要會用到2個功能 agent和cli
https://www.jacoco.org/jacoco/trunk/doc/agent.html
https://www.jacoco.org/jacoco/trunk/doc/cli.html
其實實際使用並不難,主要是在springboot的啟動命令里面加入javaagent的參數配置,官方提供了2種方案(tcpclient沒看到外面有人使用 故先忽略)
- output=file
- 在每次服務結束時統一收集覆蓋率dump
- java -javaagent:/tmp/jacoco/lib/jacocoagent.jar=includes=*,output=file,append=true,destfile=/tmp/jacoco/service/demo/jacoco.exec -jar demo-0.0.1-SNAPSHOT.jar
- output=tcpserver
- 開放一個tcp端口,可以在過程中收集覆蓋率dump
- java -javaagent:/tmp/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=localhost,append=true -jar demo-0.0.1-SNAPSHOT.jar
- 需要通過jacococli.jar 來獲取dump
- java -jar jacococli.jar dump --address localhost --port 6300 --destfile ./jacoco-demo.exec
- 語句解釋:出自https://testerhome.com/topics/20632
-
-
-javaagent
jdk5之后新增的參數,主要用來在運行jar包的時候,以一種方式介入字節碼加載過程,如有興趣自行百度。注意后面有個冒號: -
/home/admin/jacoco/jacocoagent.jar
需要用來介入class文件加載過程的jar包,想深入了解的,百度“插樁”哈。
這是一個jar包的絕對路徑。 -
includes=*
這個代表了,啟動時需要進行字節碼插樁的包過濾,*代表所有的class文件加載都需要進行插樁。
假如你們公司內部代碼都有相同的包前綴:com.mycompany
你可以寫成:includes=com.mycompany.* -
output=tcpserver
這個地方不用改動,代表以tcpserver方式啟動應用並進行插樁 -
port=2014
這是jacoco開啟的tcpserver的端口,請注意這個端口不能被占用 -
address=192.168.110.1
這是對外開發的tcpserver的訪問地址。可以配置127.0.0.1,也可以配置為實際訪問ip
配置為127.0.0.1的時候,dump數據只能在這台服務器上進行dump,就不能通過遠程方式dump數據。
配置為實際的ip地址的時候,就可以在任意一台機器上(前提是ip要通,不通都白瞎),通過ant xml或者api方式dump數據。
舉個栗子:
我如上配置了192.168.110.1:2014作為jacoco的tcpserver啟動服務,
那我可以在任意一台機器上進行數據的dump,比如在我本機windows上用api或者xml方式調用dump。
如果我配置了127.0.0.1:2014作為啟動服務器,那么我只能在這台測試機上進行dump,其他的機器都無法連接到這個tcpserver進行dump。
-
獲取出來的就是exec的dump文件,那么接下來就要生成報告了
官方又提供了2種方案,其他我
- ant轉報告
- 開發工具直接展示
- jacococli.jar 轉報告
ant本身需要安裝環境,還要定制build.xml,個人比較懶,而且平時使用ant的機會也不多,所以沒用這個方案
開發工具直接看結果可以(idea Analyze->Show Coverage Data->選擇exec文件),但后續不利於做二次開發
jacococli.jar 本身有report方法是專門用來轉報告的
java -jar jacococli.jar report ./jacoco-demo.exec --classfiles /Users/oukotoshuu/IdeaProjects/demo/target/classes/com --sourcefiles /Users/oukotoshuu/IdeaProjects/demo/src/main/java --html report --xml report.xml
經個人嘗試:
--classfiles 必須項,是編譯后target 文件夾下的classes里面的com

Jacoco 包含了多種尺度的覆蓋率計數器,包含指令級(Instructions,C0 coverage),分支(Branches,C1 coverage)、圈復雜度(Cyclomatic Complexity)、行(Lines)、方法(Non-abstract Methods)、類(Classes)。
➢ Instructions:Jacoco 計算的最小單位就是字節碼指令。指令覆蓋率表明了在所有的指令中,
哪些被指令過以及哪些沒有被執行。這項指數完全獨立於源碼格式並且在任何情況下有效,不需要類文件
的調試信息。
➢ Branches:Jacoco 對所有的 if 和 switch 指令計算了分支覆蓋率。這項指標會統計所有的分支數
量,並同時支出哪些分支被執行,哪些分支沒有被執行。這項指標也在任何情況都有效。異常處理不考慮在分支范圍內。
➢ Cyclomatic Complexity:Jacoco 為每個非抽象方法計算圈復雜度,並也會計算每個類,包,組的復雜度。根據 McCabe1996 的定義,圈復雜度可以理解為覆蓋所有的可能情況最少使用的測試用
例數。這項參數也在任何情況下有效。
➢ Lines:該項指數在有調試信息的情況下計算。
➢ Methods:每一個非抽象方法都至少有一條指令。若一個方法至少被執行了一條指令,就認為它被執行過。因為 JaCoco 直接對字節碼進行操作,所以有些方法沒有在源碼顯示(比如某些構造方法和由編
譯器自動生成的方法)也會被計入在內。
➢ Classes:每個類中只要有一個方法被執行,這個類就被認定為被執行。同 5 一樣,有些沒有在源碼聲明的方法被執行,也認定該類被執行。
--sourcefiles 理論可以不傳,不傳的話 只能到文件級的展示,再細 需要具體代碼和行數就需要這個了

--csv 這個維度只能到代碼文件級 pass

--xml 這個就比較細致了適合目前的需求

接下來目標就是再實際過程中實施了,到時候看下坑有多大吧,后面根據這個為基礎搞實時的代碼覆蓋率,長路漫漫 學習不止~
參考:
