1. 程式人生 > 實用技巧 >使用Jacoco獲取 Java 程式的程式碼執行覆蓋率

使用Jacoco獲取 Java 程式的程式碼執行覆蓋率

Jacoco是Java Code Coverage的縮寫,顧名思義,它是獲取Java程式碼執行覆蓋率的一個工具,通常用它來獲取單元測試覆蓋率。它通過分析Java位元組碼來得到程式碼執行覆蓋率,因此它還可以分析任何基於JVM的語言(如Croovy、Kotlin)的覆蓋率。本文不討論如何用Jacoco獲取單元測試的程式碼覆蓋率,而是從Jacoco的原理出發,介紹如何通過Jacoco獲取SIT或者UAT的測試覆蓋率。更準確來講,是獲取一個應用執行過的程式碼佔總程式碼的比率。包括位元組碼指令覆蓋率,分支覆蓋率,圈複雜度覆蓋率,行覆蓋率,方法覆蓋率和類覆蓋率。

Jacoco原理簡介

Jacoco通過修改餵給JVM的位元組碼來達到獲取那些程式碼執行了的目的。修改方式有兩種,一種線上(on-the-fly),是通過Java agent,在JVM執行位元組碼之前動態對其進行修改,這種方式更靈活,也是Jcoco的一大特性。另一種是離線(offline)模式,在Java程式位元組碼檔案(.class檔案)生成之前進行修改,這樣的位元組碼就不純了。一般在無法使用on-the-fly方式的時候才使用offline方式。

上面這些概括起來講,Jacoco最牛X的地方就在於它能夠知道一個基於JVM的應用程式中哪些程式碼(指令、分支、行、方法、類)被執行了。用它除以總程式碼量,就得到了程式碼執行覆蓋率。

由此,我們可以推斷出Jacoco生成單元測試覆蓋率報告的原理:單元測試程式碼會呼叫被測試程式碼,被測試程式碼的位元組碼指令會被Jacoco截獲,用被截獲的程式碼量除以總程式碼量,就算出了單元測試程式碼覆蓋率。舉一反三,在SIT或者UT的時候,也需要執行Java應用程式中的程式碼,因此可以也通過Jacoco獲取被執行過的程式碼,從而計算出SIT,UT測試程式碼覆蓋率。

使用Jacoco生成程式碼執行覆蓋率報告

接下來通過一個實驗介紹如何使用Jacoco獲取一個Java web應用程式碼的執行率。就拿Tomcat自帶的example應用來做實驗,我們在啟動Tomcat時帶上Jacoco的Java agent;然後在頁面上做一些點選操作,觸發後臺Java程式碼的執行;再抓取包含執行情況資料,放到.exec的二進位制檔案中;最後由這些二進位制檔案生成html格式的報告,驗證被覆蓋的程式碼是否和我們點選的內容相關。

下載Jacoco(https://www.jacoco.org),解壓縮。

下載Tomcat(https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/清華mirror),然後解壓縮,進入bin目錄,找到catalina.bat檔案(Windows)。

修改如下程式碼,讓Tomcat在啟動時帶上Javacoco的agent。

set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"

修改為

set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS% -javaagent:C:\Users\Robot\Application\jacoco-0.8.5\lib\jacocoagent.jar=destfile=jacoco.exec,output=tcpserver"

其中指定了javaagent是C:\Users\Robot\Application\jacoco-0.8.5\lib\jacocoagent.jar,解壓Jacoco可以得到;指定了output是tcpserver,也就是需要通過訪問一個地址才能獲取到資料。預設地址是本地IP地址,埠號是6300。其它引數說明見:https://www.jacoco.org/jacoco/trunk/doc/agent.html

設定完成之後,雙擊Tomcat bin目錄下的startup.bat,啟動Tomcat。控制檯可以看見javaagent設定生效。此時Jacoco就可以動態地攔截餵給JVM的位元組碼,並且監聽6300埠號和所以本機地址,等待獲取程式碼執行情況資料(暫且稱為.exec檔案資料)的請求。

輸入地址http://127.0.0.1:8080/,開啟Tomcat 歡迎頁面,做一些點選操作,可以確定它已經執行了一些位元組碼。

獲取執行情況資料,在jacococli.jar所在目錄(與jacocoagent.jar目錄一致)執行命令:

java -jar jacococli.jar dump  --port 6300 --destfile data/jacoco-it.exec

Jacoco會在當前目錄下生成data/jacoco-it.exec檔案,這個檔案是一個二進位制檔案,我們無法直接檢視它,需要用它生成html或者其它格式的檔案。

執行如下命令生成html報告。--classfiles制定應用程式的class檔案所在目錄,--html指定html報告所在目錄。

java -jar jacococli.jar report data/jacoco-it.exec --classfiles C:/Users/Robot/Application/apache-tomcat-9.0.29/webapps/examples/WEB-INF/classes --html html

開啟html目錄下的index.html檔案就可以看到報告了。

小結

上面實驗比較簡單,只為輔助對Jacoco原理的理解。理解了原理之後,參照官網的手冊就可以用Jacoco來做一些實用的操作,提高Java程式碼的質量。