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 开发中进行单元测试的首选框架。