1. 程式人生 > >Gradle進階:3:結合Jacoco進行覆蓋率確認

Gradle進階:3:結合Jacoco進行覆蓋率確認

在這裡插入圖片描述
上篇文章我們瞭解到瞭如何使用Gradle結合Junit對建立的SpringBoot的應用進行單體測試,這篇文章來接著確認一些如何視覺化地確認測試覆蓋率。

前提

Jacoco是Java Code Coverage Library的縮寫,它是用於確認java應用單體測試覆蓋率的有效工具,最重要的一個前提是需要有測試用例,所以本文是在前面一篇文章的基礎之上的,關於如何使用gradle進行spring boot的單體測試這裡不再贅述。

Gradle方式使用Jacoco

build.gradle新增

  • 新增Jacoco的plugin

apply plugin: ‘jacoco’

  • 新增使用設定
    後面會給出同樣方式使用maven和jacoco的方法,從直觀的感受來說gradle寫的更加人性化一些,從如下可以讀出,jacoco的相關結果的報告是以html方式生成。當然根據需要還可以加上check.dependsOn jacocoTestReport的依賴,這樣使用gradle build可以直接生成結果,較為方便。

jacocoTestReport {
reports {
xml.enabled false
html.enabled true
}
}

  • build.gradle
    添加了上述內容的build.gradle為:
liumiaocn:springboot liumiao$ cat build.gradle 
buildscript {
	ext {
		springBootVersion = '2.1.1.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
	}
}

apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.liumiaocn'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
	mavenCentral()
}


dependencies {
	implementation('org.springframework.boot:spring-boot-starter-web')
        testImplementation('org.springframework.boot:spring-boot-starter-test')
}

jacocoTestReport {
    reports {
        xml.enabled false
        html.enabled true
    }
}

check.dependsOn jacocoTestReport
liumiaocn:springboot liumiao$ 

執行命令

有多種方式可以生成jacoco的reports,這裡由於依賴已經建立,可以直接使用gradle build即可,當然也可以按照順序執行jacocoTestReport。

執行命令:gradle build

  • 執行日誌
liumiaocn:springboot liumiao$ gradle clean;

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
liumiaocn:springboot liumiao$ gradle build

> Task :test
2018-12-13 06:42:10.567  INFO 52478 --- [       Thread-6] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

BUILD SUCCESSFUL in 5s
6 actionable tasks: 6 executed
liumiaocn:springboot liumiao$

結果確認

上述gradle build執行的時候實際是執行了jacoco外掛的jacocoTestReport任務,其生成的方式應該是html的,位置位於build/reports/jacoco:

liumiaocn:springboot liumiao$ tree build
build
├── classes
│   └── java
│       ├── main
│       │   └── com
│       │       └── liumiaocn
│       │           └── springbootdemo
│       │               └── SpringbootdemoApplication.class
│       └── test
│           └── com
│               └── liumiaocn
│                   └── springbootdemo
│                       └── SpringbootdemoApplicationTests.class
├── jacoco
│   └── test.exec
├── libs
│   └── springbootdemo-0.0.1-SNAPSHOT.jar
├── reports
│   ├── jacoco
│   │   └── test
│   │       └── html
│   │           ├── com.liumiaocn.springbootdemo
│   │           │   ├── SpringbootdemoApplication.html
│   │           │   ├── SpringbootdemoApplication.java.html
│   │           │   ├── index.html
│   │           │   └── index.source.html
│   │           ├── index.html
│   │           ├── jacoco-resources
│   │           │   ├── branchfc.gif
│   │           │   ├── branchnc.gif
│   │           │   ├── branchpc.gif
│   │           │   ├── bundle.gif
│   │           │   ├── class.gif
│   │           │   ├── down.gif
│   │           │   ├── greenbar.gif
│   │           │   ├── group.gif
│   │           │   ├── method.gif
│   │           │   ├── package.gif
│   │           │   ├── prettify.css
│   │           │   ├── prettify.js
│   │           │   ├── redbar.gif
│   │           │   ├── report.css
│   │           │   ├── report.gif
│   │           │   ├── session.gif
│   │           │   ├── sort.gif
│   │           │   ├── sort.js
│   │           │   ├── source.gif
│   │           │   └── up.gif
│   │           └── jacoco-sessions.html
│   └── tests
│       └── test
│           ├── classes
│           │   └── com.liumiaocn.springbootdemo.SpringbootdemoApplicationTests.html
│           ├── css
│           │   ├── base-style.css
│           │   └── style.css
│           ├── index.html
│           ├── js
│           │   └── report.js
│           └── packages
│               └── com.liumiaocn.springbootdemo.html
├── resources
│   └── main
│       └── application.properties
├── test-results
│   └── test
│       ├── TEST-com.liumiaocn.springbootdemo.SpringbootdemoApplicationTests.xml
│       └── binary
│           ├── output.bin
│           ├── output.bin.idx
│           └── results.bin
└── tmp
    ├── bootJar
    │   └── MANIFEST.MF
    ├── compileJava
    ├── compileTestJava
    └── expandedArchives
        └── org.jacoco.agent-0.8.1.jar_8059ed6e1ab8b88aac5d9097fad847bb
            ├── META-INF
            │   ├── MANIFEST.MF
            │   └── maven
            │       └── org.jacoco
            │           └── org.jacoco.agent
            │               ├── pom.properties
            │               └── pom.xml
            ├── about.html
            ├── jacocoagent.jar
            └── org
                └── jacoco
                    └── agent
                        └── AgentJar.class

42 directories, 48 files
liumiaocn:springboot liumiao$

Jacoco的報告目錄中也有一個index.html,通過它也可以一目瞭然地看到覆蓋率的視覺化的結果。

  • 應用的整體覆蓋率狀況summary
    在這裡插入圖片描述
  • package單位的覆蓋率狀況summary
    在這裡插入圖片描述
  • class單位的覆蓋率狀況summary
    在這裡插入圖片描述
  • 程式碼行粒度的覆蓋率確認詳細
    在這裡插入圖片描述

Maven方式使用Jacoco

同樣是使用plugin方式,maven使用gradle的方法總結如下,可以與gradle進行一下簡單的對比

Pom新增

	<profiles>
		<profile>
			<id>sonar-jacoco-coverage</id>
			<activation>
				<activeByDefault>true</activeByDefault>
			</activation>
			<build>
				<pluginManagement>
					<plugins>
						<plugin>
							<groupId>org.jacoco</groupId>
							<artifactId>jacoco-maven-plugin</artifactId>
							<version>0.7.8</version>
						</plugin>
					</plugins>
				</pluginManagement>
				<plugins>
					<plugin>
						<groupId>org.jacoco</groupId>
						<artifactId>jacoco-maven-plugin</artifactId>
						<configuration>
							<append>true</append>
						</configuration>
						<executions>
							<execution>
								<id>jacoco-ut</id>
								<goals>
									<goal>prepare-agent</goal>
								</goals>
							</execution>
							<execution>
								<id>jacoco-it</id>
								<goals>
									<goal>prepare-agent-integration</goal>
								</goals>
							</execution>
							<execution>
								<id>jacoco-site</id>
								<phase>verify</phase>
								<goals>
									<goal>report</goal>
								</goals>
							</execution>
						</executions>
					</plugin>
				</plugins>
			</build>
		</profile>
	</profiles>

執行命令

執行如下命令則可完成單體測試以及結合sonar對jacoco生成出來的內容進行分析與顯示,會下載jacoco-maven-plugin進行實際的操作。

mvn test

詳細可以參看maven+junit+spring boot+jacoco+sonarqube的簡單示例,因為maven和gradle同屬同類,所以使用的demo測試程式碼這裡也儘量相同,以利於比較。

總結

這篇文章介紹了gradle中結合jacoco對spring boot的單體測試結果進行視覺化展示,同時比較了maven的使用方式,後續進一步介紹如何與sonarqube進行整合。

參考內容

https://www.eclemma.org/jacoco/trunk/index.html