使用Jacoco統計服務端程式碼覆蓋情況實踐
一、背景
隨著需求的迭代,需求增加的同時,有可能會伴隨著一些功能的下線。如果不對系統已經不用的程式碼進行梳理並刪除不需要的程式碼,那麼就會增加系統維護成本以及理解成本。但經歷比較長的迭代以及系統交接,可能有些程式碼並不確定是否能夠刪除,因此基於此困境基於Jacoco對程式碼進行分析,對系統做“瘦身”。
二、原理
Jacoco本質上是一個測試覆蓋率工具,通過ASM位元組碼增強技術在原始碼中加入探針從而獲取程式碼覆蓋率,有兩個主要功能一是單測覆蓋率二是介面覆蓋率。大部分情況下我們只用於生成單測覆蓋率,而為了實現對服務端程式碼使用情況進行統計,需要使用Jacoco生成服務端的介面測試覆蓋率,即對線上對介面的每一次請求作為介面測試。此外還使用到jacoco ant,用於直接呼叫執行command line命令。
三、最佳實踐
在專案上新增Maven依賴
<dependency> <groupId>org.jacoco</groupId> <artifactId>org.jacoco.ant</artifactId> <version>0.8.3</version> </dependency> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.9.9</version> </dependency>
新增一個url地址,用於Dump Coverage檔案。
@RestController @RequestMapping("coverage") public class CoverageController { @PostMapping("dump") public Result<Boolean> dumpCoverageFile() { DumpTask dumpTask = new DumpTask(); // dump檔案儲存地址 dumpTask.setDestfile(new File("/export/code-cover.exec")); // 多次dump追加形式 dumpTask.setAppend(true); // 選一個空閒介面即可 dumpTask.setPort(8840); // 預設本機tomcat dumpTask.setAddress("127.0.0.1"); dumpTask.execute(); return Result.succeed(true); } }
以上為程式碼需要進行的修改。
此外包部署的環境中需要有jacoco的java agent包,jacocoagent.jar,如果不好聯絡運維進行包上傳,可以直接解壓縮maven對應的包org.jacoco.agent-0.8.3.jar包含有jacocoagent.jar。${jarPath}為佔位符,代表org.jacoco.agent-0.8.3.jar包所在路徑
#decompress file 解壓依賴,獲得jacocoagent.jar包,避免需要聯絡運維上傳包
jar -xvf ${jarPath}
java啟動引數新增:存在多個javaagent時,按順序新增agent引數即可。
-
${agentJarPath}為佔位符代表jacocoagent.jar所在路徑。
-
${packagePath}為佔位符,代表需要統計的包路徑,可使用*進行匹配。
-javaagent:${agentJarPath}=includes=${packagePath},output=tcpserver,port=8840,address=127.0.0.1 -Xverify:none
通過url請求後可以在指定資料夾下找到對應的exec檔案然後通過運維工具或scp等進行檔案下載。
下載檔案成功後,開啟idea->run->show coverage data選擇對應的exec檔案即可獲取服務端的程式碼覆蓋情況。通過程式碼覆蓋情況可對已經不需要的程式碼進行刪除,降低維護成本。