Gradle JUnit 生成 HTML 报告
最后更新:2025 年 9 月 20 日
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. 示例实现
Calculator 类演示了简单的算术运算及其相应的测试类
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 上获取。 一旦你以 Baeldung Pro 会员 身份登录,就开始学习并在项目上进行编码。















