2023-02-03 16:23:41 +08:00
|
|
|
|
## `JUnit5
|
2022-12-30 10:40:35 +08:00
|
|
|
|
|
2023-02-03 16:23:41 +08:00
|
|
|
|
# 注解
|
2022-12-30 10:40:35 +08:00
|
|
|
|
|
|
|
|
|
JUnit4包路径:**org.junit**
|
|
|
|
|
|
|
|
|
|
JUnit5包路径: **org.junit.jupiter.api**
|
|
|
|
|
|
|
|
|
|
| JUnit4 | JUnit5 | 说明 |
|
|
|
|
|
| --------------- | ---------------------- | ------------------------------------------------------------ |
|
|
|
|
|
| @Test | @Test | 表示该方法是一个测试方法。JUnit5 与 JUnit 4 的 @Test 注解不同的是,它没有声明任何属性,因为 JUnit Jupiter 中的测试扩展是基于它们自己的专用注解来完成的。这样的方法会被继承,除非它们被覆盖 |
|
|
|
|
|
| @BeforeClass | @BeforeAll | 表示使用了该注解的方法应该在当前类中所有使用了 @Test @RepeatedTest、@ParameterizedTest 或者 @TestFactory 注解的方法之前 执行 **仅执行一次**; |
|
|
|
|
|
| @AfterClass | @AfterAll | 表示使用了该注解的方法应该在当前类中所有使用了 @Test、@RepeatedTest、@ParameterizedTest 或者 @TestFactory 注解的方法之后执行 **仅执行一次**; |
|
|
|
|
|
| @Before | @BeforeEach | 表示使用了该注解的方法应该在当前类中每一个使用了 @Test、@RepeatedTest、@ParameterizedTest 或者 @TestFactory 注解的方法之前 执行 |
|
|
|
|
|
| @After | @AfterEach | 表示使用了该注解的方法应该在当前类中每一个使用了 @Test、@RepeatedTest、@ParameterizedTest 或者 @TestFactory 注解的方法之后 执行 |
|
|
|
|
|
| @Ignore | @Disabled | 用于禁用一个测试类或测试方法,当前单元测试置为无效,即单元测试时跳过该测试 |
|
|
|
|
|
| @Category | @Tag | 用于声明过滤测试的 tags,该注解可以用在方法或类上;类似于 TesgNG 的测试组或 JUnit 4 的分类。 |
|
|
|
|
|
| @Parameters | @ParameterizedTest | 表示该方法是一个参数化测试 配合@ValueSource使用 |
|
|
|
|
|
| unknown | @RepeatedTest | @RepeatedTest(n):重复性测试,即执行n次,表示方法是可以按照指定次数[重复执行](https://links.jianshu.com/go?to=https%3A%2F%2Fjunit.org%2Fjunit5%2Fdocs%2Fcurrent%2Fuser-guide%2F%23writing-tests-repeated-tests)。 |
|
|
|
|
|
| unknown | @ValueSource | @ValueSource(ints = {1, 2, 3}):参数化测试提供数据 配合@ParameterizedTest使用 |
|
|
|
|
|
| @RunWith | @ExtendWith | @ExtendWith**用于[以声明方式注册扩展](https://links.jianshu.com/go?to=https%3A%2F%2Fjunit.org%2Fjunit5%2Fdocs%2Fcurrent%2Fuser-guide%2F%23extensions-registration-declarative)。**@Runwith 就是放在测试类名之前,用来确定这个类怎么运行的,用法:@ExtendWith(SpringExtension.class) |
|
|
|
|
|
| @Rule | @ExtendWith | Rule 是一组实现了 TestRule 接口的共享类,提供了验证、监视 TestCase 和外部资源管理等能力 |
|
|
|
|
|
| @ClassRule | @ExtendWith | @ClassRule 用于测试类中的静态变量,必须是 TestRule 接口的实例,且访问修饰符必须为 public。 |
|
|
|
|
|
| @FixMethodOrder | @TestMethodOrder | 用于为测试类配置[测试方法执行顺序](https://links.jianshu.com/go?to=https%3A%2F%2Fjunit.org%2Fjunit5%2Fdocs%2Fcurrent%2Fuser-guide%2F%23writing-tests-test-execution-order-methods);类似于Junit4的 |
|
|
|
|
|
| unknown | @TestInstance | 用于为测试类配置[测试实例生命周期](https://links.jianshu.com/go?to=https%3A%2F%2Fjunit.org%2Fjunit5%2Fdocs%2Fcurrent%2Fuser-guide%2F%23writing-tests-test-instance-lifecycle)。 |
|
|
|
|
|
| unknown | @DisplayName | 为测试类或测试方法声明自定义的[展示名称](https://links.jianshu.com/go?to=https%3A%2F%2Fjunit.org%2Fjunit5%2Fdocs%2Fcurrent%2Fuser-guide%2F%23writing-tests-display-names)。 |
|
|
|
|
|
| unknown | @DisplayNameGeneration | 为测试类声明一个自定义的[显示名称生成器](https://links.jianshu.com/go?to=https%3A%2F%2Fjunit.org%2Fjunit5%2Fdocs%2Fcurrent%2Fuser-guide%2F%23writing-tests-display-name-generator)。 |
|
|
|
|
|
| unknown | @Timeout | 用于测试方法、测试工厂、测试模板或生命周期方法,在其执行超过指定时间时失败。 |
|
|
|
|
|
| unknown | @RegisterExtension | 用于通过字段[以编程方式注册扩展](https://links.jianshu.com/go?to=https%3A%2F%2Fjunit.org%2Fjunit5%2Fdocs%2Fcurrent%2Fuser-guide%2F%23extensions-registration-programmatic)。 |
|
|
|
|
|
| unknown | @TempDir | 用于在生命周期方法或测试方法中通过字段注入或参数注入[临时目录](https://links.jianshu.com/go?to=https%3A%2F%2Fjunit.org%2Fjunit5%2Fdocs%2Fcurrent%2Fuser-guide%2F%23writing-tests-built-in-extensions-TempDirectory);位于org.junit.jupiter.api.io包。 |
|
|
|
|
|
| unknown | @Nested | 嵌套测试 |
|
|
|
|
|
| unknown | @TestClassOrder | 用于@Nested注解的测试类,可以配置[测试类执行顺序](https://links.jianshu.com/go?to=https%3A%2F%2Fjunit.org%2Fjunit5%2Fdocs%2Fcurrent%2Fuser-guide%2F%23writing-tests-test-execution-order-classes)。 |
|
|
|
|
|
| unknown | @TestFactory | 测试工厂 |
|
|
|
|
|
|
2023-02-03 16:23:41 +08:00
|
|
|
|
# 断言
|
2022-12-30 10:40:35 +08:00
|
|
|
|
|
|
|
|
|
| 断言方法 | 描述 |
|
|
|
|
|
| ---------------------- | ------------------------------------------------------------ |
|
|
|
|
|
| assertNull() | 检查对象是否为空 |
|
|
|
|
|
| assertNotNull() | 检查对象是否不为空 |
|
|
|
|
|
| assertEquals() | 判断预期值与实际值是否相等的 |
|
|
|
|
|
| assertNotEquals() | 判断预期值与实际值是否相等的 |
|
|
|
|
|
| assertFalse() | 检查条件是否为假 |
|
|
|
|
|
| assertTrue() | 检查条件是否为真 |
|
|
|
|
|
| assertSame() | 检查两个对象引用是否引用同一对象(即对象是否相等) |
|
|
|
|
|
| assertNotSame() | 检查两个对象引用是否不引用统一对象(即对象不等) |
|
|
|
|
|
| assertArrayEquals() | 判断预期数组与实际数组是否相等 |
|
|
|
|
|
| assertIterableEquals() | 判断预期的和实际的可迭代对象是完全相等的。完全相等意味着集合中元素的数量和顺序必须相同,迭代的元素必须相等。 |
|
|
|
|
|
| assertLinesMatch() | 判断预期字符串列表是否与实际列表相等 |
|
|
|
|
|
| assertTimeout() | 它们是用于测试长时间运行的任务,如果测试任务花费的时间超过指定的持续时间,则测试将失败 |
|
|
|
|
|
| assertThrows() | assetThrows()断言提供的`Executable`执行会引发`expectedType`异常并返回异常 |
|
|
|
|
|
| fail() | *fail()*方法指未通过测试 |
|
|
|
|
|
|
|
|
|
|
Junit4断言静态类:**org.junit.Assert**
|
|
|
|
|
|
|
|
|
|
JUnit5断言静态类:**org.junit.jupiter.Assertions**
|
|
|
|
|
|
2023-02-03 16:23:41 +08:00
|
|
|
|
# 其他
|
2022-12-30 10:40:35 +08:00
|
|
|
|
|
|
|
|
|
**引擎**
|
|
|
|
|
|
|
|
|
|
JUnit4:**junit-vintage-engine**
|
|
|
|
|
|
|
|
|
|
Junit5:**junit-jupiter-engine**
|
|
|
|
|
|
|
|
|
|
**生命周期**
|
|
|
|
|
|
|
|
|
|
![file](assets/522c319566a243e193a47070d58d463f.png)
|
|
|
|
|
|
|
|
|
|
**Spring Test 注解**
|
|
|
|
|
|
|
|
|
|
| 注解 | 说明 |
|
|
|
|
|
| -------------- | ------------------------------------------------------------ |
|
|
|
|
|
| @RollBack | @Rollback是一个测试注解,用来指示 测试管理事务应在回滚后 测试方法已经完成;注解value默认为true表示不进行事务提交,@RollBack(value=false)表示进行事务的提交 |
|
|
|
|
|
| @Transactional | 不进行事务提交 等同于@RollBack(value=true) |
|
|
|
|
|
| @Commit | 进行事务提交 等同于@RollBack(value=false) |
|
|
|
|
|
|
2023-02-03 16:23:41 +08:00
|
|
|
|
# 案例
|
|
|
|
|
|
|
|
|
|
## 嵌套测试+Order
|
|
|
|
|
|
|
|
|
|
执行TestClass 会执行该类下得所有方法
|
|
|
|
|
|
|
|
|
|
@ Nested用于表示注释类是嵌套类。 可以共享的非静态测试类 (即内部类) 使用enclosed类的实例进行设置和状态。封闭类可以是顶级测试类,也可以是 另一个 @ Nested测试类,嵌套可以任意深。
|
|
|
|
|
|
|
|
|
|
@TestMethodOrder注解 设置方法执行顺序策略 有以下三种策略可以设置
|
|
|
|
|
|
|
|
|
|
| 策略类 | 描述 |
|
|
|
|
|
| ----------------------------- | -------------------------- |
|
|
|
|
|
| MethodOrderer.Alphanumeric | 根据方法的字母数字排序 |
|
|
|
|
|
| MethodOrderer.OrderAnnotation | 根据@Order注解进行排序执行 |
|
|
|
|
|
| MethodOrderer.Random | 随机执行 |
|
|
|
|
|
|
|
|
|
|
### @Nested+@TestMethodOrder(MethodOrderer.Alphanumeric.class)
|
|
|
|
|
|
|
|
|
|
**实例代码:**
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
package com.guadou.erp.service.wms.service.impl;
|
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.MethodOrderer;
|
|
|
|
|
import org.junit.jupiter.api.Nested;
|
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
|
import org.junit.jupiter.api.TestMethodOrder;
|
|
|
|
|
/**
|
|
|
|
|
* @author dss
|
|
|
|
|
* @since 2023/2/3
|
|
|
|
|
*/
|
|
|
|
|
public class TestNested {
|
|
|
|
|
@Nested
|
|
|
|
|
@TestMethodOrder(MethodOrderer.Alphanumeric.class)
|
|
|
|
|
class TestClass{
|
|
|
|
|
@Test
|
|
|
|
|
void testa(){
|
|
|
|
|
System.out.println("testa");
|
|
|
|
|
}
|
|
|
|
|
@Test
|
|
|
|
|
void testb(){
|
|
|
|
|
System.out.println("testb");
|
|
|
|
|
}
|
|
|
|
|
@Test
|
|
|
|
|
void testc(){
|
|
|
|
|
System.out.println("testc");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### @Nested+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
|
|
|
|
|
|
|
|
|
**输出信息:**
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
testa
|
|
|
|
|
testb
|
|
|
|
|
testc
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**实例代码:**
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
package com.guadou.erp.service.wms.service.impl;
|
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.*;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author dss
|
|
|
|
|
* @since 2023/2/3
|
|
|
|
|
*/
|
|
|
|
|
public class TestNested {
|
|
|
|
|
@Nested
|
|
|
|
|
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
|
|
|
|
class TestClass{
|
|
|
|
|
@Test
|
|
|
|
|
@Order(3)
|
|
|
|
|
void testa(){
|
|
|
|
|
System.out.println("testa");
|
|
|
|
|
}
|
|
|
|
|
@Test
|
|
|
|
|
@Order(1)
|
|
|
|
|
void testb(){
|
|
|
|
|
System.out.println("testb");
|
|
|
|
|
}
|
|
|
|
|
@Test
|
|
|
|
|
@Order(2)
|
|
|
|
|
void testc(){
|
|
|
|
|
System.out.println("testc");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### @Nested+@TestMethodOrder(MethodOrderer.Random.class)
|
|
|
|
|
|
|
|
|
|
**实例代码:**
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
package com.guadou.erp.service.wms.service.impl;
|
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.*;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author dss
|
|
|
|
|
* @since 2023/2/3
|
|
|
|
|
*/
|
|
|
|
|
public class TestNested {
|
|
|
|
|
@Nested
|
|
|
|
|
@TestMethodOrder(MethodOrderer.Random.class)
|
|
|
|
|
class TestClass{
|
|
|
|
|
@Test
|
|
|
|
|
void testa(){
|
|
|
|
|
System.out.println("testa");
|
|
|
|
|
}
|
|
|
|
|
@Test
|
|
|
|
|
void testb(){
|
|
|
|
|
System.out.println("testb");
|
|
|
|
|
}
|
|
|
|
|
@Test
|
|
|
|
|
void testc(){
|
|
|
|
|
System.out.println("testc");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**输出:**
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
二月 03, 2023 4:22:01 下午 org.junit.jupiter.api.MethodOrderer$Random <clinit>
|
|
|
|
|
信息: MethodOrderer.Random default seed: 4392369797561700
|
|
|
|
|
testa
|
|
|
|
|
testc
|
|
|
|
|
testb
|
|
|
|
|
```
|
|
|
|
|
|