71、单元测试-Junit5简介

发布于:2025-06-22 ⋅ 阅读:(20) ⋅ 点赞:(0)

71、单元测试-Junit5简介

# JUnit 5 简介

JUnit 5 是 Java 平台上最流行的单元测试框架之一,是 JUnit 的重大升级版本,引入了许多新特性和改进,旨在提供更现代化、灵活和强大的测试体验。

## 主要组成部分

JUnit 5 由三个模块组成:

#### JUnit Platform

- **作用**:是整个 JUnit 5 的基础,定义了在 JVM 上启动测试框架的基础设施。

- **功能**:

    - 提供 TestEngine API,允许开发自定义测试框架。

    - 支持从命令行、构建工具(如 Maven、Gradle)启动测试。

    - 提供与其他测试框架的集成机制。

#### JUnit Jupiter

- **作用**:是 JUnit 5 的核心模块,包含新的编程模型和扩展模型,用于编写测试用例。

- **功能**:

    - 提供丰富的注解,如 `@Test`、`@BeforeEach`、`@AfterEach`、`@ParameterizedTest` 等。

    - 支持 Lambda 表达式和流式 API,简化测试代码编写。

    - 提供强大的断言库 `org.junit.jupiter.api.Assertions`。

#### JUnit Vintage

- **作用**:提供对 JUnit 3 和 JUnit 4 测试用例的支持,确保旧版测试可以在 JUnit 5 平台上运行。

- **功能**:通过 Vintage 引擎,兼容并执行旧版本的测试代码。

## 主要特性

#### 注解驱动

- 引入新的注解,增强测试生命周期控制,如:

    - `@BeforeEach` 和 `@AfterEach`:每个测试方法前后执行。

    - `@BeforeAll` 和 `@AfterAll`:所有测试方法前后执行一次。

    - `@DisplayName`:为测试类或方法提供自定义名称。

#### 参数化测试

- 支持使用不同的参数多次运行同一个测试方法,简化复杂测试场景。

- 提供 `@ParameterizedTest` 注解,结合 `@ValueSource`、`@CsvSource`、`@MethodSource` 等注解定义参数来源。

#### 动态测试

- 允许在运行时动态生成测试用例。

- 使用 `JUnit Jupiter` 的 `DynamicTest` 类创建动态测试。

#### 条件测试执行

- 根据特定条件决定是否执行测试方法。

- 提供 `@EnabledIf`、`@DisabledIf`、`@EnabledOnOs`、`@DisabledOnOs` 等注解,实现条件控制。

#### 扩展模型

- 提供丰富的扩展点,允许自定义测试执行流程、报告生成等。

- 支持编写自定义扩展,实现特定需求。

## 环境配置

#### Maven 项目

在 `pom.xml` 中添加依赖:

```xml

<dependencies>

    <dependency>

        <groupId>org.junit.jupiter</groupId>

        <artifactId>junit-jupiter-api</artifactId>

        <version>5.8.2</version>

        <scope>test</scope>

    </dependency>

    <dependency>

        <groupId>org.junit.jupiter</groupId>

        <artifactId>junit-jupiter-engine</artifactId>

        <version>5.8.2</version>

        <scope>test</scope>

    </dependency>

</dependencies>

```

#### Gradle 项目

在 `build.gradle` 中添加依赖:

```groovy

dependencies {

    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'

    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'

}

```

## 示例

```java

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class CalculatorTest {

    @Test

    void testAddition() {

        Calculator calculator = new Calculator();

        int result = calculator.add(2, 3);

        assertEquals(5, result, "2 + 3 should equal 5");

    }

    @ParameterizedTest

    @ValueSource(ints = {1, 2, 3})

    void testMultiplication(int a) {

        Calculator calculator = new Calculator();

        int result = calculator.multiply(a, a);

        assertEquals(a * a, result, a + " * " + a + " should equal " + a * a);

    }

}

```

## 总结

JUnit 5 通过模块化设计、丰富的注解和扩展机制,提供了更灵活、强大的单元测试功能,提高了测试代码的可读性和可维护性,是 Java 开发中进行单元测试的首选框架。


网站公告

今日签到

点亮在社区的每一天
去签到