一、背景
隨着需求的迭代,需求增加的同時,有可能會伴隨着一些功能的下線。如果不對系統已經不用的代碼進行梳理並刪除不需要的代碼,那么就會增加系統維護成本以及理解成本。但經歷比較長的迭代以及系統交接,可能有些代碼並不確定是否能夠刪除,因此基於此困境基於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文件即exec文件,請求時間產生的exec文件代表的是從啟動到dump時的所有請求覆蓋的代碼。
@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啟動參數添加,即指定JVM相關的那個啟動參數:存在多個javaagent時,比如可能還有性能監控等等,按順序添加agent參數即可即 -javaagent:${agent1} -javaagent:...。
-
${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文件即可獲取服務端的代碼覆蓋情況。通過代碼覆蓋情況可對已經不需要的代碼進行刪除,降低維護成本。
