Jacoco+Jenkines小白之路

#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.從新構建工程,能夠看到以下的效果。

相關文章
相關標籤/搜索