电子书 – Spring Cloud 指南 – NPI EA (分类=Spring Cloud)
announcement - icon

让我们开始使用 Spring Cloud 的微服务架构

>> 加入 Pro 并下载电子书

电子书 – Mockito – NPI EA (标签 = Mockito)
announcement - icon

模拟是单元测试的重要组成部分,Mockito 库使编写 清晰直观的单元测试 变得容易,用于您的 Java 代码。

通过我们的 Mockito 指南 开始模拟,并改进您的应用程序测试

下载电子书

电子书 – Java 并发 – NPI EA (分类=Java 并发)
announcement - icon

在应用程序中处理并发可能是一个棘手的过程,其中包含许多 潜在的陷阱。 扎实的掌握基本知识将有助于最大程度地减少这些问题。

通过我们的 Java 并发 指南开始了解多线程应用程序

>> 下载电子书

电子书 – 响应式 – NPI EA (分类=响应式)
announcement - icon

Spring 5 增加了对使用 Spring WebFlux 模块进行响应式编程的支持,此支持自那时起不断改进。 开始使用 Reactor 项目基础知识和 Spring Boot 中的响应式编程

>> 加入 Pro 并下载电子书

电子书 – Java Streams – NPI EA (分类=Java Streams)
announcement - icon

自从 Java 8 引入以来,Stream API 已成为 Java 开发的基础。 基本操作,例如迭代、过滤、映射元素序列,使用起来看似很简单。

但这些也可能被过度使用并陷入一些常见陷阱。

更好地了解 Stream 的工作方式 以及如何将其与其他语言功能结合使用,请查看我们关于 Java Streams 的指南

>> 加入 Pro 并下载电子书

电子书 – Jackson – NPI EA (分类=Jackson)
announcement - icon

用 Jackson 正确处理 JSON

下载电子书

电子书 – HTTP 客户端 – NPI EA (分类=Http 客户端)
announcement - icon

充分利用 Apache HTTP 客户端

下载电子书

电子书 – Maven – NPI EA (分类 = Maven)
announcement - icon

开始使用 Apache Maven

下载电子书

电子书 – 持久化 – NPI EA (分类=持久化)
announcement - icon

您在努力实现正确的持久化层 Spring 吗?

探索电子书

电子书 – RwS – NPI EA (分类=Spring MVC)
announcement - icon

使用 Spring 构建 REST API 吗?

下载电子书

课程 – LS – NPI EA (分类=Jackson)
announcement - icon

通过 Learn Spring 课程开始学习 Spring 和 Spring Boot

>> 学习 SPRING
课程 – RWSB – NPI EA (分类=REST)
announcement - icon

通过构建一个完整的 REST API,深入了解 Spring Boot 3 和 Spring 6,使用该框架

>> 全新的“REST With Spring Boot”

课程 – LSS – NPI EA (分类=Spring Security)
announcement - icon

是的,Spring Security 可能很复杂,从核心内的更高级功能到框架中深入的 OAuth 支持。

我将安全材料构建为 两个完整的课程 - 核心和 OAuth,以针对这些更复杂的场景进行实践。 我们探索何时以及如何使用每个功能,并 在后台项目中对其进行编码

您可以在这里探索该课程

>> 学习 Spring Security

课程 – LSD – NPI EA (标签=Spring Data JPA)
announcement - icon

Spring Data JPA 是处理 JPA 复杂性的绝佳方式,它具有 Spring Boot 的强大简洁性

通过引导式参考课程开始使用 Spring Data JPA

>> 查看课程

合作伙伴 – Moderne – NPI EA (类别=Spring Boot)
announcement - icon

使用 OpenRewrite 安全且自动地重构 Java 代码。

手动重构大型代码库既缓慢、有风险,又容易拖延。OpenRewrite 应运而生。这个用于大规模、自动化代码转换的开源框架可以帮助团队安全、一致地进行现代化改造。

每个月,OpenRewrite 的创建者和维护者 Moderne 都会举办现场、实践培训课程——一个面向初学者,一个面向经验丰富的用户。您将了解配方的运作方式、如何将其应用于项目,以及如何自信地进行代码现代化改造。

参加下一次课程,带来您的问题,并学习如何自动化通常会占用您 sprint 时间的工作。

合作伙伴 – LambdaTest – NPI EA (类别=测试)
announcement - icon

回归测试是发布流程中的重要步骤,以确保新代码不会破坏现有功能。随着代码库的不断发展,我们希望频繁运行这些测试,以便尽早发现任何问题。

确保这些测试以自动化的方式频繁运行的最佳方法当然是将其包含在 CI/CD 管道中。 这样,每次向仓库提交代码时,回归测试将自动执行。

在本教程中,我们将学习如何使用 Selenium 创建回归测试,然后使用 GitHub Actions 将它们包含在我们的管道中,在 LambdaTest 云网格上运行

>> 如何使用 GitHub Actions 运行 Selenium 回归测试

课程 – LJB – NPI EA (类别 = Core Java)
announcement - icon

通过编码方式构建 Java 的坚实、实用的基础

>> 学习 Java 基础

合作伙伴 – LambdaTest – NPI (类别 = 测试)
announcement - icon

回归测试是发布流程中的重要步骤,以确保新代码不会破坏现有功能。随着代码库的不断发展,我们希望频繁运行这些测试,以便尽早发现任何问题。

确保这些测试以自动化的方式频繁运行的最佳方法当然是将其包含在 CI/CD 管道中。 这样,每次向仓库提交代码时,回归测试将自动执行。

在本教程中,我们将学习如何使用 Selenium 创建回归测试,然后使用 GitHub Actions 将它们包含在我们的管道中,在 LambdaTest 云网格上运行

>> 如何使用 GitHub Actions 运行 Selenium 回归测试

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. 单模块项目报告

首先,我们需要一个使用 Javajvm-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 报告。 以下是报告在浏览器中显示的方式

Single module package summary from HTML Report Single module tests summary from HTML Report

该报告提供了包和测试类的清晰细分,使其易于导航和分析测试结果。

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-libraryjvm-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 中提供。在浏览器中打开时,该报告提供了跨所有模块的测试结果的统一视图,如下所示

Multi module package summary from HTML Report Multi module tests summary from HTML Report

上述报告将所有模块的测试结果合并到一个统一的 HTML 输出中。它包括有关通过和失败的测试、执行时间、成功率以及测试失败时的详细错误消息的信息。

5. 结论

Gradle 中的 JUnit HTML 报告提供了对测试执行的清晰可见性,帮助团队有效地跟踪质量。只需进行最少的设置,单模块项目即可自动生成详细的报告,总结结果、突出显示故障并有助于调试。对于更大的多模块项目,test-report-aggregation 插件变得至关重要,它将所有模块的结果合并到一个统一的 HTML 报告中。

测试像微服务或大型单体这样的复杂系统需要一个统一的视图,这尤其有用。通过正确配置根项目并将子模块连接起来,团队可以简化质量保证、改善协作并获得对项目的全面视图。

支持本文的代码可在 GitHub 上获取。 一旦你Baeldung Pro 会员 身份登录,就开始学习并在项目上进行编码。
Baeldung Pro – NPI EA (类别 = Baeldung)
announcement - icon

Baeldung Pro 具有完全无广告以及最终具有深色模式,提供干净的学习体验

>> 探索干净的 Baeldung

一旦早期采用者的席位全部用完,价格将上涨并保持在每年 33 美元。

电子书 – HTTP 客户端 – NPI EA (类别=HTTP 客户端)
announcement - icon

Apache HTTP Client 是一个非常强大的库,适用于简单和高级用例,在测试 HTTP 端点时尤其适用。 查看我们的指南,涵盖基本请求和响应处理,以及安全性、Cookie、超时等。

>> 下载电子书

电子书 – Java 并发 – NPI EA (分类=Java 并发)
announcement - icon

在应用程序中处理并发可能是一个棘手的过程,其中包含许多 潜在的陷阱。 扎实的掌握基本知识将有助于最大程度地减少这些问题。

通过我们的 Java 并发 指南开始了解多线程应用程序

>> 下载电子书

电子书 – Java Streams – NPI EA (分类=Java Streams)
announcement - icon

自从 Java 8 引入以来,Stream API 已成为 Java 开发的基础。 基本操作,例如迭代、过滤、映射元素序列,使用起来看似很简单。

但这些也可能被过度使用并陷入一些常见陷阱。

更好地了解 Stream 的工作方式 以及如何将其与其他语言功能结合使用,请查看我们关于 Java Streams 的指南

>> 加入 Pro 并下载电子书

电子书 – 持久化 – NPI EA (分类=持久化)
announcement - icon

您在努力实现正确的持久化层 Spring 吗?

探索电子书

课程 – LS – NPI EA (类别=REST)

announcement - icon

从 Spring Boot 开始,通过 Learn Spring 课程了解核心 Spring。

>> 查看课程

合作伙伴 – Moderne – NPI EA (标签=重构)
announcement - icon

现代 Java 团队行动迅速——但代码库并不总是跟上。 框架会发生变化,依赖关系会漂移,技术债务会累积,直到它开始拖慢交付速度。 OpenRewrite 就是为此而构建的:一个开源重构引擎,可在保持开发人员意图不变的同时自动化重复的代码更改。

由 Moderne 的 OpenRewrite 创建者和维护者领导的每月培训系列,将介绍实际的迁移和现代化模式。 无论您是重构配方的新手,还是准备编写自己的配方,您都将学习以安全且可扩展的方式进行重构的实用方法。

如果您曾经希望重构感觉像编写代码一样自然——并且一样快速——这是一个很好的起点

电子书 Jackson – NPI EA – 3 (类别 = Jackson)
© .