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结果来分析但是我这里的结果一直是空的。有了解的可以说一下哈~
 
 
此文来自于https://www.cnblogs.com/meitian/p/7151437.html
 
 
 
 

jacoco统计server端功能测试覆盖率的更多相关文章

  1. jenkins+jacoco+ant+apache集成统计web端功能测试覆盖率

    一.覆盖率定义 作为一个测试人员,保证产品的软件质量是其工作首要目标,为了这个目标,测试人员常常会通过很多手段或工具来加以保证,覆盖率就是其中一环比较重要的环节. 我们通常会将测试覆盖率分为两个部分, ...

  2. 使用Jacoco统计服务端代码覆盖情况实践

    一.背景 随着需求的迭代,需求增加的同时,有可能会伴随着一些功能的下线.如果不对系统已经不用的代码进行梳理并删除不需要的代码,那么就会增加系统维护成本以及理解成本.但经历比较长的迭代以及系统交接,可能 ...

  3. Jacoco统计web接口/功能测试的代码覆盖率【转】

    原文:https://www.jianshu.com/p/d2fd02d4164b 一.代码覆盖率 通常我们在做单元测试的时候会接触到代码覆盖率的概念,通过在单元测试的过程中收集代码覆盖率去判断测试用 ...

  4. Jacoco收集单元测试、集成测试和系统功能测试覆盖率

    Jacoco收集单元测试.集成测试和系统功能测试覆盖率 2020-02-27  目录 1 安装版本2 被测系统代码示例3 收集单元测试覆盖率4 收集集成和功能测试覆盖率 代码覆盖率可在单元测试.系统测 ...

  5. jacoco统计自动化代码覆盖率

    jacoco统计自动化代码覆盖率 1. 简介 1.1. 什么是Jacoco Jacoco是一个开源的代码覆盖率工具,可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以 ...

  6. Neo4j图数据库管理系统开发笔记之二:管理系统Server端界面一览

    最近在neo4j java api和rmi的基础上,设计了一套neo4j管理工具,分为server端和client端,中间用rmi进行通信.基本功能包括图数据库基本信息维护管理(创建.编辑.删除.统计 ...

  7. 应用java多线程实现server端与多client之间的通信

    应用多线程来实现server与多线程之间的通信的基本步骤 1.server端创建ServerSocket,循环调用accept()等待client链接 2.client创建一个Socket并请求和se ...

  8. Zabbix(一) : 简介以及Server端安装

    一.什么是Zabbix? zabbix由AlexeiVladishev首先开发,目前在维护的是Zabbix SIA.ZABBIX是一个企业级的开源分布式监控解决方案. zabbix为监控网络和服务器的 ...

  9. 分享 koa + mysql 的开发流程,构建 node server端,一次搭建个人博客

    前言 由于一直在用 vue 写业务,为了熟悉下 react 开发模式,所以选择了 react.数据库一开始用的是 mongodb,后来换成 mysql 了,一套下来感觉 mysql 也挺好上手的.re ...

随机推荐

  1. Ethereum(1)—— 基本介绍

    1 环境安装 安装Ethereum 协议的Go语言的最新实现. git clone https://github.com/ethereum/go-ethereum.git make all cd bu ...

  2. Codeforces 700E. Cool Slogans 字符串,SAM,线段树合并,动态规划

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF700E.html 题解 首先建个SAM. 一个结论:对于parent树上任意一个点x,以及它所代表的子树内任 ...

  3. 圆周率pi π 与 角度的对应关系

    圆周率pi π 与 角度的对应关系 π 180° π/2 90° π/4     45° π/6     30°

  4. GA:GA优化BP神经网络的初始权值、阈值,从而增强BP神经网络的鲁棒性—Jason niu

    global p global t global R % 输入神经元个数,此处是6个 global S1 % 隐层神经元个数,此处是10个 global S2 % 输出神经元个数,此处是4个 glob ...

  5. 读取InputStream 中的内容

      读取InputStream 中的内容 ]) { , len); //把读取到的内容写到输出流中 } //<4> 把字节数组转换为字符串 String content = baos.to ...

  6. pandas 数据处理实例

    描述:行标签为日期,列标签为时间,表哥的值是 float 的数值# 一. 读取 csv 文件df=pd.read_csv("delay_3.csv",encoding = &quo ...

  7. vim编辑器操作命令

    vim   [参数]   [文件 ..]         编辑指定的文件 或: vim   [参数]    -     从标准输入(stdin)读取文本 或: vim   [参数]    -t    ...

  8. python统计字词练习

    方法一: import operator from nltk.corpus import stopwords stop_words = stopwords.words('English')#目的是去除 ...

  9. jq冲刺

    1.入口函数$(document).ready(function(){ })简便写法:$(()=>{ }) js的入口函数window.onload()区别js的入口函数要比jq的要晚很多,wi ...

  10. require和import区别

    遵循的模块化规范不一样 模块化规范:即为 JavaScript 提供一种模块编写.模块依赖和模块运行的方案.谁让最初的 JavaScript 是那么的裸奔呢——全局变量就是它的模块化规范. requi ...