zoukankan      html  css  js  c++  java
  • 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对象
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/111testing/p/11180302.html
Copyright © 2011-2022 走看看