目录

一、什么是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>