天天看點

使用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檔案即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