junit5
JUnit5在2017年就发布了,你还在用junit4吗?
什么是junit5
与以前的JUnit版本不同,JUnit 5由三个不同子项目的多个不同模块组成。
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
JUnit Platform为在JVM上启动测试框架提供基础。它还定义了TestEngine API, 用来开发在平台上运行的测试框架。此外,平台提供了一个控制台启动器],用于从命令行启动平台,并为Gradle和Maven提供构建插件以[基于JUnit 4的Runner,用于在平台上运行任意TestEngine
。
JUnit Jupiter是在JUnit 5中编写测试和扩展的新型编程模型和[扩展模型][]的组合.Jupiter子项目提供了TestEngine
,用于在平台上运行基于Jupiter的测试。
JUnit Vintage提供TestEngine
,用于在平台上运行基于JUnit 3和JUnit 4的测试。
为什么需要 JUnit 5
自从有了类似 JUnit 之类的测试框架,Java 单元测试领域逐渐成熟,开发人员对单元测试框架也有了更高的要求:更多的测试方式,更少的其他库的依赖。
因此,大家期待着一个更强大的测试框架诞生,JUnit 作为Java测试领域的领头羊,推出了 JUnit 5 这个版本,主要特性:
- 提供全新的断言和测试注解,支持测试类内嵌
- 更丰富的测试方式:支持动态测试,重复测试,参数化测试等
- 实现了模块化,让测试执行和测试发现等不同模块解耦,减少依赖
- 提供对 Java 8 的支持,如 Lambda 表达式,Sream API等。
基本注解
@Test: 表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试
@ParameterizedTest: 表示方法是参数化测试
@RepeatedTest: 表示方法可重复执行
@DisplayName: 为测试类或者测试方法设置展示名称
@BeforeEach: 表示在每个单元测试之前执行
@AfterEach: 表示在每个单元测试之后执行
@BeforeAll: 表示在所有单元测试之前执行
@AfterAll: 表示在所有单元测试之后执行
@Tag: 表示单元测试类别,类似于JUnit4中的@Categories
@Disabled: 表示测试类或测试方法不执行,类似于JUnit4中的@Ignore
@Timeout: 表示测试方法运行如果超过了指定时间将会返回错误
@ExtendWith: 为测试类或测试方法提供扩展类引用
常用注解格式:
class StandardTests {
//与junit4的@beforeClass类似,每个测试类运行一次
@BeforeAll
static void initAll() {
}
//与junit4中@before类似,每个测试用例都运行一次
@BeforeEach
void init() {
}
@Test
@DisplayName("成功测试")
void succeedingTest() {
}
@Test
@DisplayName("失败测试")
void failingTest() {
fail("a failing test");
}
//禁用测试用例
@Test
@Disabled("for demonstration purposes")
void skippedTest() {
// not executed
}
@Test
void abortedTest() {
assumeTrue("abc".contains("Z"));
fail("test should have been aborted");
}
//与@BeforeEach对应,每个测试类执行一次,一般用于恢复环境
@AfterEach
void tearDown() {
}
//与@BeforeAll对应,每个测试类执行一次,一般用于恢复环境
@AfterAll
static void tearDownAll() {
}
}
新特性
显示名称
@DisplayName("显示名称测试")
class DisplayNameDemo {
@Test
@DisplayName("我的 第一个 测试 用例")
void testWithDisplayNameContainingSpaces() {
}
@Test
@DisplayName("╯°□°)╯")
void testWithDisplayNameContainingSpecialCharacters() {
}
@Test
@DisplayName("