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);
}
}
- mvn clean 一下,然后在运行一下,就可以生成全量报告
4.进入文件夹中找到index.html,打开就可以查看全量测报告了
以上就是本地玩转jacoco的教程,因为Jenkins提供了对jacoco的集成,所以接下来是Jenkins+jacoco
1.首先有一台服务器并且配置好了Jenkins,需要将代码上传到git上,我的Jenkins之前就配置好了github,所以我把代码上传到github上
2.Jenkins上配置
3.重新构建工程,可以看到如下的效果。