目录
一、什么是Junit?
二、Junit的基础注解有哪些?
三、什么是参数化?参数化通过哪几种方式传输数据?
1、单参数
2、多参数
3、CSV文件获取参数
4、方法获取参数
四、测试用例执行顺序如何控制?
五、什么是断言assert?Assertions类的常用方法?
六、什么是测试套件?如何使用测试套件?
一、什么是Junit?
- Junit是一个用于Java的单元测试框架,用于管理已经编写好的测试用例。
- 使用时需要引入 Junit-jupiter-api 依赖。
- Junit需要从注解、参数化、断言和测试套件四个方面去理解。
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.3</version>
</dependency>
二、Junit的基础注解有哪些?
- @Test:用于表示该方法是一个测试用例,该注解通常不应该和@ParameterizedTest注解同时使用
- @ParameterizedTest:表示方法是参数化测试
- @RepeatedTest:表示方法可重复执行
- @DisplayName:为测试类或者测试方法设置展示名称
- @BeforeEach:表示在每个单元测试之前执行
- @AfterEach:表示在每个单元测试之后执行
- @BeforeAll:表示在所有单元测试之前执行
- @AfterAll:表示在所有单元测试之后执行
- @Tag:表示单元测试类别
- @Disabled:表示测试类或测试方法不执行
- @Timeout:表示测试方法运行如果超过了指定时间将会返回错误
- @ExtendWith:为测试类或测试方法提供扩展类引用
三、什么是参数化?参数化通过哪几种方式传输数据?
- 参数化是指在测试用例需要传入参数时,使用的传输手段。
- 使用时需要引入 junit-jupiter-params 依赖
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.9.3</version>
<scope>compile</scope>
</dependency>
常用注解:
- @ValueSource:为参数化测试指定单个入参来源,支持八大基础类以及String类型,Class类型
- @CsvSource:为参数化测试指定多个入参来源,支持八大基础类以及String类型,Class类型
- @NullSource:表示为参数化测试提供一个null的入参
- @EnumSource:表示为参数化测试提供一个枚举入参
- @CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参
- @MethodSource:表示读取指定方法的返回值作为参数化测试入参(注意方法返回需要是一个流)
参数化通过以下四种方式传输数据:
- 单参数
- 多参数
- CSV文件获取参数
- 方法获取参数
1、单参数
- 使用 @ParameterizedTest 注解
- 使用 @ValueSource 注解,在注解中填入需要传递的单个或多个测试用例
- 通过方法参数接收,每次接收一个测试用例
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
public void oneParameter(int i) {
System.out.println("oneParameter: " + i);
}
2、多参数
- 使用 @ParameterizedTest 注解
- 使用 @CsvSource 注解,在注解中填入需要传递的多个测试用例
- 通过方法参数接收,每次接收的测试用例数量由参数个数决定
@ParameterizedTest
@CsvSource(value = {"张三,12", "李四,13", "王五,14"})
public void multipleParameter(String name, int age) {
System.out.println("csvFileParameter: " + name + "->" + age);
}
3、CSV文件获取参数
- 使用 @ParameterizedTest 注解
- 使用 @CsvFileSource 注解,传入 csv 文件
- 在 resources 目录中,创建对应的 csv 文件,csv 文件每一行为一个参数,参数之间使用 ‘,’ 分隔
- 通过方法参数接收测试用例,每次接收一行
test.scv
张三,12
李四,13
王五,14
----------------------------------------------------------------
@ParameterizedTest
@CsvFileSource(resources = "/test.csv")
public void csvFileParameter(String name, int age) {
System.out.println("csvFileParameter: " + name + "->" + age);
}
4、方法获取参数
- 使用 @ParameterizedTest 注解
- 使用 @MethodSource 注解,指定方法名
- 创建传输参数的方法发,方法必须为 static
- 通过方法参数接收测试用例
public static Stream<Arguments> methodSource() {
return Stream.of(
Arguments.of("张三", 12),
Arguments.of("李四", 13),
Arguments.of("王五", 14)
);
}
@ParameterizedTest
@MethodSource(value = "methodSource")
public void methodParameter(String name, int age) {
System.out.println("csvFileParameter: " + name + "->" + age);
}
四、测试用例执行顺序如何控制?
- 使用注解 @TestMethodOrder,不使用该注解时,测试用例的执行顺序是不确定的。
- 使用注解 @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 修饰类,表示该类中的测试用例可更改优先级。
- 再使用注解 @Order(优先级) 修饰方法,并将代表优先级的数字填入参数中,数字 1 表示最高优先级。
- 使用注解 @TestMethodOrder(MethodOrderer.Random.class) 修饰类,表示该类中的测试用例将被随机执行。
五、什么是断言assert?Assertions类的常用方法?
- 断言表示结果必须符合预期,否则抛出异常,测试不通过。
- 断言使用 Assertions 类。
常用方法 | 说明 |
assertEquals | 判断两个对象或两个原始类型是否相等 |
assertNotEquals | 判断两个对象或两个原始类型是否不相等 |
assertSame | 判断两个对象引用是否指向同一个对象 |
assertNotSame | 判断两个对象引用是否指向不同的对象 |
assertTrue | 判断给定的布尔值是否为 true |
assertFalse | 判断给定的布尔值是否为 false |
assertNull | 判断给定的对象引用是否为 null |
assertNotNull | 判断给定的对象引用是否不为 null |
assertArrayEquals | 数组断言 |
assertAll | 组合断言 |
assertThrows | 异常断言 |
assertTimeout | 超时断言 |
fail | 快速失败 |
六、什么是测试套件?如何使用测试套件?
- 测试套件是用于将多个测试用例的类同时运行的工具(相当于将众多测试打包)。
- 使用测试套件时,需要引入以下两个依赖:
- junit-platform-suite :测试套件
- junit-jupiter-engine :测试套件引擎
- 使用注解 @Suite() 修饰类,表示启用测试套件。
- 可以使用两种方式将测试用例打包为测试套件:
- 可以通过 载入类名 运行测试用例:使用注解 @SelectClasses({类名.class...}) ,在注解中传入需要测试的类。
- 可以通过 载入包名 运行测试用例:将多个测试用例类放入同一个包中,使用注解@SelectPackages({包名...}),在注解中传入需要测试的包。
<!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>