Gradle JUnit 產生 HTML 報告
1.概述
測試在現代軟體開發中起著至關重要的作用。 Gradle 是一款強大的建置自動化工具,它提供了內建功能,可建立詳細的 HTML 測試報告,並以易於閱讀的格式顯示測試結果。在 Gradle 專案中,JUnit 是單元測試和整合測試的首選。
在本教學中,我們將探討如何在單模組和多模組 Gradle 專案中產生 JUnit HTML 報告。我們還將介紹配置、可運行範例和單元測試。這些報告包含已通過和未通過的測試資訊、執行時間以及測試失敗時的詳細錯誤訊息。
2. 在 Gradle 中設定 JUnit
當我們執行test
任務時,Gradle 會自動為 JUnit 測試產生 HTML 報告。預設配置只需極少的設置,即可在標準 Gradle 專案中直接使用。以下配置應新增至build.gradle.kts
檔案:
test {
useJUnitPlatform()
reports {
html.enabled = true
junitXml.enabled = true
}
}
這可確保每次測試執行後都能獲得 XML 和 HTML 報告。 HTML 報告預設會產生在build/reports/tests/test
目錄中。此位置包含一個index.html
文件,該文件是查看測試結果的主要入口。為了示範 HTML 報告的生成過程,讓我們建立一個簡單的 Gradle 專案來示範基本功能。
3. 單模組專案報告
首先,我們需要一個使用Java
和jvm-test-suite
外掛程式的簡單專案。單模組專案是在 Gradle 中開始使用 JUnit 報告的最簡單方法。透過應用Java
和jvm-test-suite
插件,我們可以輕鬆設定 JUnit 5 測試。 test
任務執行時,測試執行會產生一份詳細的 HTML 報告,並建立一個視覺化報告,用於在套件和類別層級查看測試結果。
以下配置應用專案所需的外掛程式和依賴項,確保測試無縫運行並自動產生報表:
plugins {
id("java")
id("jacoco")
}
group = "com.baeldung.gradle"
version = "1.0-SNAPSHOT"
repositories {
mavenCentral()
}
dependencies {
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
}
tasks.test {
useJUnitPlatform()
reports {
html.required = true
junitXml.required = true
}
finalizedBy(tasks.jacocoTestReport)
}
此 Gradle 建置腳本應用了Java
和JaCoCo
插件,配置了 JUnit 5 進行測試,並確保測試結果以 HTML 和 XML 格式產生。它還會連結jacocoTestReport
任務,以便在測試完成後自動執行,以產生覆蓋率報告。
3.1. 範例實現
計算器類別及其對應的測試類別演示了簡單的算術運算:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int subtract(int a, int b) {
return a - b;
}
public int multiply(int a, int b) {
return a * b;
}
public int divide(int a, int b) {
if (b == 0) {
throw new ArithmeticException("Division by zero is not allowed");
}
return a / b;
}
}
3.2. 範例測試類
透過執行此測試類,Gradle 執行單元測試並產生結構化報告,其中包含通過/失敗統計資料和每種方法的詳細結果:
public class CalculatorUnitTest {
private Calculator calculator;
@BeforeEach
void setUp() {
calculator = new Calculator();
}
@Test
void shouldAddTwoNumbers() {
int result = calculator.add(5, 3);
assertEquals(8, result);
}
@Test
void shouldSubtractTwoNumbers() {
int result = calculator.subtract(10, 4);
assertEquals(6, result);
}
@Test
void shouldThrowExceptionForDivisionByZero() {
assertThrows(ArithmeticException.class, () -> calculator.divide(10, 0));
}
@Test
void shouldMultiplyTwoNumbers() {
int result = calculator.multiply(4, 7);
assertEquals(28, result);
}
}
當我們執行./gradlew test
時,將在專案的build/reports/tests/test/index.html
路徑下產生一份 HTML 報告。報告在瀏覽器中的顯示方式如下:
該報告提供了套件和測試類別的清晰細分,使得導航和分析測試結果變得容易。
4. 多模組專案報告
在大型應用程式中,程式碼庫通常會被劃分為多個模組,預設情況下,每個模組都會產生各自的測試報告。雖然這對於模組層級的洞察很有用,但它會使評估專案整體測試健康狀況變得更加困難。
為了解決這個問題,Gradle 提供了test-report-aggregation
插件,它可以收集所有模組的結果。使用此插件,我們可以在根層級產生一個統一的 HTML 報告,從而在一個地方全面了解整個專案的測試狀態。
在多模組 Gradle 專案中,我們維護多個build.gradle.kts
檔案。一個位於根目錄,另一個位於每個模組目錄。它們各自有不同的用途。
4.1. 根建置文件
該檔案應用test-report-aggregation
外掛程式來收集並合併所有模組的測試結果。它還定義了報告配置,並將子項目納入聚合流程。最終結果是一份統一的、位於根層級的 HTML 報告,反映專案的整體測試狀態:
plugins {
id("java")
id("jvm-test-suite")
id("test-report-aggregation")
}
repositories {
mavenCentral()
}
dependencies {
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
}
testing {
suites {
val test by getting(JvmTestSuite::class) {
useJUnitJupiter()
}
}
}
reporting {
reports {
val testAggregateTestReport by existing(AggregateTestReport::class)
}
}
dependencies {
subprojects.forEach { sub ->
testReportAggregation(project(sub.path))
}
}
運行./gradlew test
會執行專案及其子模組中的所有單元測試,並產生單獨的報告。然後, testAggregateTestReport
任務會收集這些結果,並在根目錄中產生一個合併的 HTML 報表。同時執行這兩個任務可確保匯總報告中的結果保持最新。
4.2.模組建置文件
每個模組都使用java-library
和jvm-test-suite
外掛程式在 JUnit Jupiter 中配置自己的測試。這些模組級配置確保各個模組可以獨立運行和驗證其測試,同時仍將其結果貢獻到根級別的匯總報告:
plugins {
id("java-library")
id("jvm-test-suite")
}
repositories {
mavenCentral()
}
testing {
suites {
val test by getting(JvmTestSuite::class) {
useJUnitJupiter()
}
}
}
總之,這種設定使我們能夠在模組範圍和專案範圍審查測試結果,確保清晰度和全面的可見性。
4.3. 模組中的範例測試
在本文中,我們將使用兩個模組 modulea 和 moduleb,每個模組都包含各自的測試檔案。預設情況下,這些模組在執行測試時會產生單獨的報告。透過在根層級使用test-report-aggregation
,它們的結果將合併為一個包含整個專案的 HTML 報告。
模組 A 中的範例測試:
class ModuleATest {
@Test
void givenNumbers_whenAdd_thenCorrect() {
int sum = 2 + 3;
assertEquals(5, sum);
}
}
模組 B 中的範例測試:
class ModuleBTest {
@Test
void givenString_whenCheckLength_thenCorrect() {
String word = "Hello World";
assertTrue(word.length() > 3);
}
}
若要產生總計報告,請從專案根目錄執行指令./gradlew test testAggregateTestReport
。
合併後的報告將在junit-report-multi-module/build/reports/tests/index.html
中提供。在瀏覽器中開啟該報告時,它將提供所有模組測試結果的合併視圖,如下所示:
上述報告將所有模組的測試結果合併為一個統一的 HTML 輸出。它包含通過和失敗的測試資訊、執行時間、成功率以及測試失敗時的詳細錯誤訊息。
5. 結論
Gradle 中的 JUnit HTML 報告清晰地展現了測試執行情況,幫助團隊有效地追蹤品質。只需極少的設置,單模組專案即可自動產生詳細的報告,總結結果、突出顯示故障並輔助調試。對於規模較大的多模組項目, test-report-aggregation
插件至關重要,它可以將所有模組的結果合併到一份統一的 HTML 報告中。
測試微服務或大型單體應用等複雜系統需要統一的視圖,這一點尤其重要。透過配置根專案並正確連接子模組,團隊可以簡化品質保證流程、改善協作並獲得對專案的全面了解。
與往常一樣,這些範例的程式碼可在 GitHub 上取得。