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進行整合。