jacoco可以統計,功能測試時,server代碼調用的覆蓋情況。這里對服務器端的java代碼進行統計。
操作步驟如下:
第一步:更改server的啟動腳本,使用jacocoagent.jar啟動服務
1.下載jacocoagent.jar
jacocoagent.jar在下載的zip的./lib/目錄下,使用方法-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]
2.修改啟動server的參數,使用jacocoagent.jar記錄服務的操作數據
啟動項增加下面內容:
-javaagent:/opt/soft/jacoco/lib/jacocoagent.jar=destfile=/home/work/jacoco/${SERVICE_NAME}/${SERVICE_NAME}jacoco.exec,append=true,classdumpdir=/home/work/jacoco/${SERVICE_NAME/class/,includes=com.*,excludes=*.scf.*:*.entity.*:*.entitys.*,output=file"
說明:
1.javaagent:后面跟jacocoagent.jar的地址
2.destfile為輸出的exec的保存地址,exec文件是用來分析覆蓋率的
3.classdumpdir:agent調用到的所有class文件存儲的位置
更多jacocoagent.jar的參數詳見官網:http://www.eclemma.org/jacoco/trunk/doc/agent.html
第二步:生成覆蓋率報告
1.下載jacoco的包(這里是使用maven進行下載)
<dependencies> <!-- https://mvnrepository.com/artifact/org.jacoco/jacoco-maven-plugin --> <dependency> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.9</version> </dependency> </dependencies>
2.從服務器上拿生成的exec文件放到要生成報告的機器上
exec地址為啟動腳本中destfile指定的文件
理論上不用殺server進程就可以直接copy到最新的exec文件,但是如果遇到報告結果是空的情況,可以考慮先kill server進程,再拷貝exec文件
3.創建工程,新建java類ReportGenerator,用來生成報告
import java.io.File; import java.io.IOException; import org.jacoco.core.analysis.Analyzer; import org.jacoco.core.analysis.CoverageBuilder; import org.jacoco.core.analysis.IBundleCoverage; import org.jacoco.core.tools.ExecFileLoader; import org.jacoco.report.DirectorySourceFileLocator; import org.jacoco.report.FileMultiReportOutput; import org.jacoco.report.IReportVisitor; import org.jacoco.report.html.HTMLFormatter; public class testjacoco { private final String title; private final File executionDataFile; private final File classesDirectory; private final File sourceDirectory; private final File reportDirectory; private ExecFileLoader execFileLoader; public testjacoco(final File projectDirectory ) { this.title = projectDirectory.getName(); this.executionDataFile = new File(projectDirectory, "scfzzpostjacoco.exec");//覆蓋率的exec文件地址 this.classesDirectory = new File(projectDirectory, "/");//目錄下必須包含源碼編譯過的class文件,用來統計覆蓋率。所以這里用server打出的jar包地址即可 // this.sourceDirectory =null; this.sourceDirectory = new File("/opt/RD_Code/server/zhuanzhuan_scf_zzpost_4-0-38_BRANCH/service/", "src/main/java");//源碼的/src/main/java,只有寫了源碼地址覆蓋率報告才能打開到代碼層。使用jar只有數據結果 this.reportDirectory = new File(projectDirectory, "coveragereport");//要保存報告的地址 } public void create() throws IOException { loadExecutionData(); final IBundleCoverage bundleCoverage = analyzeStructure(); createReport(bundleCoverage); } private void createReport(final IBundleCoverage bundleCoverage) throws IOException { final HTMLFormatter htmlFormatter = new HTMLFormatter(); final IReportVisitor visitor = htmlFormatter .createVisitor(new FileMultiReportOutput(reportDirectory)); visitor.visitInfo(execFileLoader.getSessionInfoStore().getInfos(), execFileLoader.getExecutionDataStore().getContents()); visitor.visitBundle(bundleCoverage, new DirectorySourceFileLocator( sourceDirectory, "utf-8", 4)); visitor.visitEnd(); } private void loadExecutionData() throws IOException { execFileLoader = new ExecFileLoader(); execFileLoader.load(executionDataFile); } private IBundleCoverage analyzeStructure() throws IOException { final CoverageBuilder coverageBuilder = new CoverageBuilder(); final Analyzer analyzer = new Analyzer( execFileLoader.getExecutionDataStore(), coverageBuilder); analyzer.analyzeAll(classesDirectory); return coverageBuilder.getBundle(title); } public static void main(final String[] args) throws IOException { testjacoco generator = new testjacoco(new File("/opt/RD_Code/server/untitled/"));//傳遞工程目錄 generator.create(); } }
說明:主要調用testjacoco()方法來做入口生成報告
1.this.title:報告的標題
2.this.executionDataFile:第一步生成的exec的文件
3.this.classesDirectory:源碼的class文件,只要傳遞class所在的目錄就可以(或者用編譯過的jar包也可以),不傳遞會報錯,用來統計覆蓋率
4.this.sourceDirectory:源碼目錄,可以不賦值使用null,但這種覆蓋率結果只有看到方法名級別,不能直接看到方法中具體的覆蓋結果
5.new File():實際是獲得第一個參數+第二個參數的地址,轉為File對象
結果如下:


紅色表示未覆蓋,綠色表示覆蓋到了,黃色表示覆蓋到分支了
如果.this.sourceDirectory沒有指定源碼,是進入不了上面第二張圖的
其他:jacoco還有很多其他接口,但是我不會用,如果大家有好的資料可以分享一下。
比如ExecutionDataServer這個方法應該可以遠程獲得服務的exec結果來分析但是我這里的結果一直是空的。有了解的可以說一下哈~