JUnit 是 Java(以及 JVM)的事实上的标准测试框架,广泛用于编写自动化单元测试。 随着 JUnit 6 的发布,该框架已进一步成熟为现代、统一的平台。
在底层,JUnit 6 结合了
- JUnit Platform(测试启动基础设施),
- JUnit Jupiter(编写新测试的编程和扩展模型),
- 以及(可选)JUnit Vintage(用于运行遗留 JUnit 3 / JUnit 4 测试)。
JUnit 6.0.1 = JUnit Platform + JUnit Jupiter + JUnit Vintage
1. JUnit 5 与 JUnit 6
下表显示了 JUnit 6 与 JUnit 5 之间的主要区别,并附有示例说明。
| 特性 / 领域 | JUnit 5 | JUnit 6 |
|---|---|---|
| 最低 Java 版本 | Java 8 | Java 17 |
| 模块 / 平台版本控制 | 虽然所有工件都共享 5.x 版本,但子模块之间存在差异。 | 所有模块都使用单个统一的 6.x 版本,具有同步开发、更轻松的 BOM 管理和可预测的兼容性。 |
| 空值注解 | 没有标准的空值注解 | 引入了内置的 @NonNull、@Nullable、@NullMarked 注解,以改进测试代码的静态代码分析 |
| 扩展 API | 扩展 API 成熟但有时冗长 | 更完善的扩展模型,具有更清晰的生命周期规则、更好的排序语义以及更一致的注释行为。 |
| Vintage 引擎 | 完全可用,可运行 JUnit 3/4 测试 | 仍然可用,但标记为已弃用 |
| 动态测试 | 完全支持 | 引擎内部针对动态测试进行了优化。大型动态测试套件具有更高的性能和更清晰的错误报告。 |
| 迁移构建文件 | 需要 Jupiter + Platform 依赖 | 使用 junit-bom 作为标准 |
| IDE / 工具 | 历史上需要插件来支持 JUnit 5 | 所有主流 IDE 都原生支持 |
| 测试发现和运行时 | 成熟、稳定。由于旧的 Java 兼容性,存在一些反射限制。 | 更高效的发现,更好的并行测试默认设置。 |
| IDE 兼容性 | 强大的 IDE 支持(IntelliJ、Eclipse、VS Code)。IDE 使用适配器来集成 JUnit 5 Platform。 | IDE 已经更新了内置的 JUnit 6 运行器,完全支持新功能(空值允许性、Kotlin 协程测试、统一报告)。减少了对兼容性层的依赖。 |
| API 清理 | 为了兼容性,保留了遗留 API | 移除了或简化了未使用的/令人困惑的 API。优先考虑开发人员体验而非向后兼容性。 |
2. Maven 和 Gradle
如果您正在使用 Maven,这是一个设置 JUnit 6 进行测试的最小 pom.xml 片段。
<project>
...
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>6.0.0</version> <!-- or latest JUnit 6 version -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version> <!-- minimum required for JUnit 6 -->
</plugin>
</plugins>
</build>
...
</project>
对于 Gradle,请使用以下配置
需要 Gradle 7.3+,因为 Java 17 是基线。
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
testImplementation(platform("org.junit:junit-bom:6.0.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
test {
useJUnitPlatform()
}
3. 一个简单的 JUnit 6 测试
这是一个最小的示例,可以开始使用 JUnit 6。此类运行测试并断言一些基本假设。
package com.howtodoinjava;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.DisplayName;
import static org.junit.jupiter.api.Assertions.*;
public class AppTest {
@Test
@DisplayName("Simple test to verify that 1 + 1 equals 2")
void testAddition() {
assertEquals(2, 1 + 1);
}
@Test
@DisplayName("Test string equality")
void testStringEquality() {
String expected = "Hello World!";
String actual = "Hello World!";
assertEquals(expected, actual);
}
@Test
@DisplayName("Test boolean assertion")
void testBooleanAssertion() {
assertTrue(true);
assertFalse(false);
}
@Test
@DisplayName("Test not null assertion")
void testNotNull() {
App app = new App();
assertNotNull(app);
}
}
4. 结论
JUnit 6 是 JUnit 5 的现代、完善的演进,它拥抱 Java 17+,改进了扩展处理,增强了性能,并添加了新功能,例如空值允许性注释和原生 Kotlin 协程支持。编写测试仍然简单且熟悉,使用相同的 @Test 注释和清晰的断言 API。
祝您学习愉快!!
评论