部分轉載自:https://blog.csdn.net/diaoshouyu1982/article/details/101648100
1.jacoco原理
原理:https://mp.weixin.qq.com/s?__biz=MzIxNzEyMzIzOA==&mid=2652314564&idx=1&sn=a93e6154c92acaef9204b8440e66a852&scene=21#wechat_redirect
jacoco的原理是通過在ByteCode時使用的ASM技術修改字節碼文件或者使用自定義類加載器,在字節碼中特定位置插入樁,運行字節碼文件輸出覆蓋信息文件,然後根據文件分析計算得出覆蓋率數據,生成可視化html文件。
簡單來說就是jacoco自己寫了一個class loader,在執行的時候在class文件的不同位置加上類似System.out.printf(“++++”)的代碼,如果執行了這些代碼,jacoco就知道附近的代碼也被執行到了,那麼它就認爲這部分是被測試用例覆蓋好了。
On-the-fly插樁:
JVM中通過-javaagent參數指定特定的jar文件啓動Instrumentation的代理程序,代理程序在通過Class Loader裝載一個class前判斷是否轉換修改class文件,將統計代碼插入class,測試覆蓋率分析可以在JVM執行測試代碼的過程中完成。
Offline模式:
在測試前先對文件進行插樁,然後生成插過樁的class或jar包,測試插過樁 的class和jar包後,會生成動態覆蓋信息到文件,最後統一對覆蓋信息進行處理,並生成報告。
On-the-fly和offline比較:
On-the-fly模式更方便簡單進行代碼覆蓋分析,無需提前進行字節碼插樁,無需考慮classpath 的設置。
簡單來說on the fly這個是用一個新的class loader,然後在執行class文件的過程中加入類似的輸出代碼,offline則是提前先對class文件加入代碼再運行
On-The-Fly模式更加方便的獲取代碼覆蓋率,無需提前進行字節碼插樁,可以實時獲取代碼覆蓋率信息
Offline模式適用於以下場景:
-
1. 運行環境不支持java agent,部署環境不允許設置JVM參數
-
2. 字節碼需要被轉換成其他虛擬機字節碼,如Android Dalvik VM
-
3. 動態修改字節碼過程中和其他agent衝突
-
4. 無法自定義用戶加載類
而(server-client端)採用onthe-fly的方式。
1.1 確定插樁方式
一般運行在服務器java程序的插樁可以在加載class文件進行,運用java Agent的機制,可以理解成"實時插樁"。JaCoCo提供了自己的Agent,完成插樁的同時,還提供了豐富的dump輸出機制,如File,Tcp Server,Tcp Client。覆蓋率信息可以通過文件或是Tcp的形式輸出。這樣外部程序可很方便隨時拿到被測程序的覆蓋率。
2.存儲覆蓋率信息的方式:
在執行測試的同時,向內存中寫入覆蓋率信息
3.將覆蓋率信息存儲到jacoco.exec文件:
監聽被測服務器的address以及Port6300,通過dump命令 dumpCoverageJacoco(true,filename)方法:其主要功能就是反射調用jaCoCo的dump方法,來生成覆蓋率數據,將覆蓋率數據從被監聽的服務器address:port 上dump到jacoco.exec,如下圖: