jacoco覆蓋率報告(server-client端)(一)

部分轉載自: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就知道附近的代碼也被執行到了,那麼它就認爲這部分是被測試用例覆蓋好了。
1166661-20190410200022307-1592802059.png

1166661-20190410200058534-1907942547.png

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. 1. 運行環境不支持java agent,部署環境不允許設置JVM參數

  2. 2. 字節碼需要被轉換成其他虛擬機字節碼,如Android Dalvik VM

  3. 3. 動態修改字節碼過程中和其他agent衝突

  4. 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,如下圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章