一、背景
随着需求的疊代,需求增加的同時,有可能會伴随着一些功能的下線。如果不對系統已經不用的代碼進行梳理并删除不需要的代碼,那麼就會增加系統維護成本以及了解成本。但經曆比較長的疊代以及系統交接,可能有些代碼并不确定是否能夠删除,是以基于此困境基于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所在路徑。
-javaagent:${agentJarPath}=includes=${packagePath},output=tcpserver,port=8840,address=127.0.0.1 -Xverify:none