#Jacoco+Jenkines小白之路 最近工做中正在推广jacoco的增量覆盖率的统计,想学习一波,纯粹采坑中,适合小白学习jacoco。html
###1、代码覆盖率 引入代码覆盖率 : 代码覆盖率是指对现有代码执行状况的统计,计算单个工程下面代码被执行的状况。java
调研了一下市面上使用的增量覆盖率的工具,发现大多数公司都在使用jacoco,那么jacoco到底相比其余工具的优势表如今哪些方面呢?git
市场上主要的代码覆盖率工具:github
- Emma
- Cobertura
- Jacoco
- Clover
比较:(wuli图片是我上百度copy下来的),总结一下jacoco的优点apache
- JaCoCo支持分支覆盖、引入了Agent模式
- EMMA官网已经不维护了,JaCoCo是其团队开发的,能够理解为一个升级版
- JaCoCo社区比较活跃,官网也在不断的维护更新
- 不少第三方的工具提供了对JaCoCo的集成,如sonar、Jenkins等
###2、插桩原理 原理: jacoco的原理是经过在ByteCode时使用的ASM技术修改字节码文件或者使用自定义类加载器,在字节码中特定位置插入桩,运行字节码文件输出覆盖信息文件,而后根据文件分析计算得出覆盖率数据,生成可视化html文件。服务器
简单来讲就是jacoco本身写了一个class loader,在执行的时候在class文件的不一样位置加上相似System.out.printf(“++++”)的代码,若是执行了这些代码,jacoco就知道附近的代码也被执行到了,那么它就认为这部分是被测试用例覆盖好了。 ###3、jacoco原理
maven
offline和 on the fly区别: (简单来讲on the fly这个是用一个新的class loader,而后在执行class文件的过程当中加入相似的输出代码,offline则是提早先对class文件加入代码再运行)工具
On-The-Fly模式更加方便的获取代码覆盖率,无需提早进行字节码插桩,能够实时获取代码覆盖率信息post
Offline模式适用于如下场景:学习
1. 运行环境不支持java agent,部署环境不容许设置JVM参数 2. 字节码须要被转换成其余虚拟机字节码,如Android Dalvik VM 3. 动态修改字节码过程当中和其余agent冲突 4. 没法自定义用户加载类
###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>
</project> 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.从新构建工程,能够看到以下的效果。