jacoco統計server端功能測試覆蓋率


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結果來分析但是我這里的結果一直是空的。有了解的可以說一下哈~
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM