Jacoco+Jenkines小白之路

最近工作中正在推广jacoco的增量覆盖率的统计,想学习一波,纯粹采坑中,适合小白学习jacoco。

一、代码覆盖率

引入代码覆盖率 :

代码覆盖率是指对现有代码执行情况的统计,计算单个工程下面代码被执行的情况。

调研了一下市面上使用的增量覆盖率的工具,发现大多数公司都在使用jacoco,那么jacoco到底相比其他工具的优点表现在哪些方面呢?

市场上主要的代码覆盖率工具:

  • Emma
  • Cobertura
  • Jacoco
  • Clover

比较:(wuli图片是我上百度copy下来的),总结一下jacoco的优势

  • JaCoCo支持分支覆盖、引入了Agent模式
  • EMMA官网已经不维护了,JaCoCo是其团队开发的,可以理解为一个升级版
  • JaCoCo社区比较活跃,官网也在不断的维护更新
  • 很多第三方的工具提供了对JaCoCo的集成,如sonar、Jenkins等

二、插桩原理

原理:

jacoco的原理是通过在ByteCode时使用的ASM技术修改字节码文件或者使用自定义类加载器,在字节码中特定位置插入桩,运行字节码文件输出覆盖信息文件,然后根据文件分析计算得出覆盖率数据,生成可视化html文件。

简单来说就是jacoco自己写了一个class loader,在执行的时候在class文件的不同位置加上类似System.out.printf(“++++”)的代码,如果执行了这些代码,jacoco就知道附近的代码也被执行到了,那么它就认为这部分是被测试用例覆盖好了。

三、jacoco原理

offline和 on the fly区别: (简单来说on the fly这个是用一个新的class loader,然后在执行class文件的过程中加入类似的输出代码,offline则是提前先对class文件加入代码再运行)

On-The-Fly模式更加方便的获取代码覆盖率,无需提前进行字节码插桩,可以实时获取代码覆盖率信息

Offline模式适用于以下场景:

1. 运行环境不支持java agent,部署环境不允许设置JVM参数
2. 字节码需要被转换成其他虚拟机字节码,如Android Dalvik VM
3. 动态修改字节码过程中和其他agent冲突
4. 无法自定义用户加载类

四、搭建小demo

接下来就进入正题了,我们可以现在本地的Maven工程中插入jacoco插件学习一下,只需要3步,跟我一起学习吧

1.pom.xml文件中插入jacoco的插件及版本

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>jacoco</groupId>
<artifactId>jacoco</artifactId>
<version>1.0-SNAPSHOT</version> <name>JaCoCo Examples</name> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!-- Sonar -->
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<!-- The destination file for the code coverage report has to be set to the same value
in the parent pom and in each module pom. Then JaCoCo will add up information in
the same report, so that, it will give the cross-module code coverage. -->
<sonar.jacoco.itReportPath>${project.basedir}/target/jacoco.exec</sonar.jacoco.itReportPath>
<sonar.language>java</sonar.language>
</properties> <dependencies>
<!--
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies> <build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
</plugin>
</plugins>
</pluginManagement> <plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<!--<configuration>-->
<!--<includes>com.*</includes>-->
<!--</configuration>-->
<executions>
<execution>
<id>pre-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-test</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>

2.写一个Java方法及它的测试方法(这个测试方法就是用来测试你写的方法的并且计算你的全量覆盖率的),我写了个超级超级简单的HelloWorld方法

public class HelloWorld {

 public HelloWorld(){}
public String Method1(){
return "Hello World";
}
public int Method2(int a,int b){
return a+b;
}

}

public class HelloWorldTest {

@Test
public void testMethod1(){
HelloWorld helloWorld=new HelloWorld();
String string=helloWorld.Method1();
Assert.assertNotNull(string);
}

}

3. mvn clean 一下,然后在运行一下,就可以生成全量报告





4.进入文件夹中找到index.html,打开就可以查看全量测报告了

以上就是本地玩转jacoco的教程,因为Jenkins提供了对jacoco的集成,所以接下来是Jenkins+jacoco

1.首先有一台服务器并且配置好了Jenkins,需要将代码上传到git上,我的Jenkins之前就配置好了github,所以我把代码上传到github上

2.Jenkins上配置

3.重新构建工程,可以看到如下的效果。

Jacoco+Jenkines小白之路的更多相关文章

  1. 1、Java小白之路前言

    大二一年准备好好学习Java,养成一个良好的习惯写博客,但是由于各种各样的原因,并没有坚持下来.而正好又赶上大三结束,去实习,发现自己的基础还是有些薄弱,所以决定,重新走上这条Java小白之路. 时隔 ...

  2. 1、JAVA的小白之路

    大学的时光过得很快,转眼我已经大二了,在大一时,学习了C\C++,对于语言有一定基础,在未来的道路上,我需要攒足干劲,积累足够的知识和技能,去走上社会. 我的第一任大学班主任告诉我:“作为程序员,你至 ...

  3. iOS-重回block小白之路

    在我刚刚接触iOS开发的时候,是通过MJ老师讲的OC基础入门的,iOS圈的人应该基本都知道MJ大神吧,即便如此大神,讲解完block之后我依然感觉晕晕乎乎的,直到后来真正进公司做项目,依然感觉这是自己 ...

  4. 简单使用Unity导航系统(小白之路)

    1.介绍 NavMesh:是一种根据场景中几何图像创建出来的3D网格.它会使导航和寻路变得很容易. 简单来说,NavMesh是一种我们在游戏世界中,可以让游戏角色在其表面行走并且导航的平面. 2.注意 ...

  5. 微信小程序开发 --- 小白之路 --- 心得

    1.前言 今天 ,发现我的饭卡不见了....悲催 ,看了一下学校的微信小程序,查了下我这饭卡的流水记录,嗯...最后出现的地方在洗澡房... 好吧,扯远了,虽然没找到,可是突发奇想 ,小程序挺方便的, ...

  6. web开发小白之路

    今天就来谈谈本人从事web开发的一系列白只又白的经历,本人刚开始是从事ios开发的,由于一系列的变故现在变为了web前端开发,不过说来也奇怪,刚开始接触前端时间可以说是彻底蒙圈,各种选择器,各种适配搞 ...

  7. unity中调用其他脚本函数的方法(小白之路)

    第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用-- 第二种,GameObject.Find("脚本所在物体名").SendMessage(& ...

  8. unity中Ray、RaycastHit 、Raycast(小白之路)

    1.Ray Ray(Vector3 origin, Vector3 direction) Ray:在程序中可以理解为射线,就是以某个位置(origin)朝某个方向(direction)的一条射线,是一 ...

  9. python小白之路

    阅读目录: 第一章:计算机基础 计算机硬件.操作系统.网络协议 第二章:python基础 初识python.常量变量.输入输出运算符.条件与循环语句.数字与字符串.列表与字典.元组与集合.阶段小测.字 ...

随机推荐

  1. Jsuop Whitelist

    Jsuop使用示例代码 使用jsoup HTML Cleaner 方法进行清除,但需要指定一个可配置的 Whitelist.http://jsoup.org/apidocs/org/jsoup/saf ...

  2. javascript模式(2)--模块模式

    在nodeJs中,可以定义自己的模块,然后通过exports来暴露API.一般是这么写的:模块依赖,私有成员和要暴露的对象.在原生js中也可以有类似的写法来组织自己的代码.可以提供一个松耦合.结构清晰 ...

  3. TED #04#

    Christopher Ategeka: How adoption worked for me 1. I experienced all the negative effects of poverty ...

  4. JS中的slice和splice

    1,slice  : 定义:接收一个或两个参数,它可以创建一个由当前数组中的一项或多项组成的新数组,注意是新数组哦~ 也就是说它不会修改原来数组的值. 用法:slice( para1 ),会截取从pa ...

  5. awk处理excel表格数据

    拿到一个ip的excel表格,要对单元格中的ip进行扫描,一看有点乱,有空格分割的,有"/"分割的,有带括号(分割的,有好几百个: 要把左边的变为右边的格式,用excel自带的功能 ...

  6. 20145315 《Java程序设计》实验四实验报告

    20145315 <Java程序设计>实验四实验报告 第一步 安装Android Studio 按教程安装即可,安装过程中需要配置JAVA_HOME环境变量为jdk安装目录. 第二步 在I ...

  7. JMeter的下载以及安装使用

    下载 https://jmeter.apache.org/download_jmeter.cgi 安装 无须安装,解压之后即可使用. 解压到C:\Program Files\apache-jmeter ...

  8. Mininet 跑一个简单的ping测试

    安装地址:https://github.com/mininet/mininet/wiki/Mininet-VM-Images 登录用户:mininet 密码:mininet 执行命令:sudo mn ...

  9. java学习之浅谈多线程4--SwingWorker

    GUI事件处理和绘图代码在一个被称为事件分发线程的特殊线程中执行.如果一个事件需要很长的时间处理,线程就不能顾及到队列中的其他任务.为了解决这个问题,可以运行费时的任务来处理单独线程中的事件.Swin ...

  10. hdu 4549 M斐波那契数列 矩阵快速幂+欧拉定理

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem ...