Skip to content

JUnit5 测试用例结构

JUnit5 测试用例结构

JUnit5 声明测试用例

  • 使用 @Test 注解表示为测试方法
  • 实例:新建一个文件夹 在文件夹中 新建一个测试类 CaseTest
  • 在类中编写测试方法 在方法左侧出现可执行的标志代表识别成功
  • 方法代码
package JUnit5structure;

import org.junit.jupiter.api.Test;

public class CaseTest {
    //使用Test注解表示为测试方法
    @Test
    //hogwarts为测试标题
    void hogwarts(){
        //测试方法中的每一个操作都是测试步骤
        System.out.print("CaseTest的第一条测试用例");
    }
}
  • 执行查看结果 在这里我们可以看到测试方法名与下方测试用例代码名称对应,控制台输出正常。

Junit5 相关注解

JUnit5 测试用例名称

  • 可以通过使用 @DisplayName 注解定义测试函数别名
@DisplayName("这里写测试函数别名")
  • 在测试函数上方添加@DisplayName 注解,再次执行查看结果。
package JUnit5structure;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

public class CaseTest {
    //使用Test注解表示为测试方法
    @Test
    //@DisplayName注解修改测试用例名称
    @DisplayName("CaseTest的第一条测试用例")
    //hogwarts为测试标题
    void hogwarts(){
        //测试方法中的每一个操作都是测试步骤
        System.out.print("CaseTest的第一条测试用例");
    }
}
  • 点击测试方法右侧执行标志
  • 可以看到测试方法的别名设置成功

JUnit5 测试用例断言

  • jupiter 中提供的 Assertions 类中提供了许多断言方法
    • assertEquals
    • assertTrue
    • assertNotNull
    • assertAll
    • assertThrows
  • assertEquals 使用示例
//测试用例中的断言信息,第一个值为预期结果,第二个值为实际结果
assertEquals(3, 1 + 1);

  • 执行查看结果 断言失败 因为 1+1!=3 预期结果不能与实际结果 断言失败 测试用例不通过

JUnit5 @BeforeEach

  • 在测试之前我们可能会需要进行一些数据准备,或者在测试之前需要进行的一些操作,可以编写一个方法,方法中编写在每个测试函数执行前需要进行的操作,在该方法上方添加@BeforeEach 注解即可实现,记得导入模块哦。
  • 使用示例:

    • 编写 setup 方法,方法中编写在每条测试用例执行前需要进行的操作
    @BeforeEach
    void setup(){
        System.out.print("在每个测试用例前执行------------");
    }
    
    • 在新增加一个测试用例,方便对比效果。
    • 整体代码:
    package JUnit5structure;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.DisplayName;
    import org.junit.jupiter.api.Test;
    
    import static org.junit.jupiter.api.Assertions.assertEquals;
    
    public class CaseTest {
    
        @BeforeEach
        void setup(){
            System.out.println("在每个测试用例前执行------------");
        }
    
        //使用Test注解表示为测试方法
        @Test
        //@DisplayName注解修改测试用例名称
        @DisplayName("CaseTest的第1条测试用例")
        //hogwarts为测试标题
        void hogwarts(){
            //测试方法中的每一个操作都是测试步骤
            System.out.println("CaseTest的第1条测试用例");
            //测试用例中的断言信息,第一个值为预期结果,第二个值为实际结果
            assertEquals(2, 1 + 1);
        }
    
        @Test
        //@DisplayName注解修改测试用例名称
        @DisplayName("CaseTest的第2条测试用例")
            //hogwarts为测试标题
        void secondhogwarts(){
            //测试方法中的每一个操作都是测试步骤1
            System.out.println("CaseTest的第2条测试用例");
            //测试用例中的断言信息,第一个值为预期结果,第二个值为实际结果
            assertEquals(2, 1 + 1);
        }
    }
    
    • 运行查看执行结果
    • 结果表明在每个测试方法执行前,setup 方法都执行了

JUnit5 @AfterEach

  • 与@BeforeEach 类似,在测试中可能会遇到在每条测试用例执行后我们需要进行的一些操作,就可以用到@AfterEach,与@BeforeEach 的使用方法类似。
  • 使用示例:

    • 将每条测试用例执行后我们需要进行的一些操作放在一个方法中,方法前添加@AfterEach 注解,记得导入哦
    @AfterEach
    void teardown(){
        System.out.println("在每个用例后都会执行=============");
    }
    
    • 执行查看结果,可以看到 teardown 方法中的操作在每条测试用例执行后执行了。
    • 实现代码:
    package JUnit5structure;
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.DisplayName;
    import org.junit.jupiter.api.Test;
    
    import static org.junit.jupiter.api.Assertions.assertEquals;
    
    public class CaseTest {
    
        @BeforeEach
        void setup(){
            System.out.println("在每个测试用例前执行------------");
        }
        @AfterEach
        void teardown(){
            System.out.println("在每个用例后都会执行=============");
        }
        //使用Test注解表示为测试方法
        @Test
        //@DisplayName注解修改测试用例名称
        @DisplayName("CaseTest的第1条测试用例")
        //hogwarts为测试标题
        void hogwarts(){
            //测试方法中的每一个操作都是测试步骤
            System.out.println("CaseTest的第1条测试用例");
            //测试用例中的断言信息,第一个值为预期结果,第二个值为实际结果
            assertEquals(2, 1 + 1);
        }
    
        @Test
        //@DisplayName注解修改测试用例名称
        @DisplayName("CaseTest的第2条测试用例")
            //hogwarts为测试标题
        void secondhogwarts(){
            //测试方法中的每一个操作都是测试步骤1
            System.out.println("CaseTest的第2条测试用例");
            //测试用例中的断言信息,第一个值为预期结果,第二个值为实际结果
            assertEquals(2, 1 + 1);
        }
    }
    

JUnit5 @BeforeAll

  • 有些操作我们或许只在执行所有测试用例前需要执行一次,而并不需要每次都执行,这里我们就可以用到@BeforeAll 注解,在静态方法中编写在在执行测试之前需要指定的操作,静态方法前添加@BeforeAll 注解
  • 使用示例

    • 编写静态方法存放执行测试用例之前需要进行的操作
    • 注意需要将方法声明为静态方法!
    @BeforeAll
    static void setupAll(){
        System.out.println("在所有测试用例前执行------------");
    }
    
    • 执行测试类查看结果,可以看到 setupAll 方法中的内容只打印了一次,也就是在执行类最初被调用了一次。
    • 实现代码
    package JUnit5structure;
    import org.junit.jupiter.api.*;
    
    import static org.junit.jupiter.api.Assertions.assertEquals;
    
    public class CaseTest {
        //BeforeAll注解可以实现在所有用例执行前执行
        @BeforeAll
        static void setupAll(){
            System.out.println("在所有测试用例前执行------------");
        }
        //BeforeEach注解可以实现在每个测试用例前执行
        @BeforeEach
        void setup(){
            System.out.println("在每个测试用例前执行------------");
        }
        //AfterEach注解可以实现在每个测试用例后执行
        @AfterEach
        void teardown(){
            System.out.println("在每个用例后都会执行=============");
        }
        //使用Test注解表示为测试方法
        @Test
        //@DisplayName注解修改测试用例名称
        @DisplayName("CaseTest的第1条测试用例")
        //hogwarts为测试标题
        void hogwarts(){
            //测试方法中的每一个操作都是测试步骤
            System.out.println("CaseTest的第1条测试用例");
            //测试用例中的断言信息,第一个值为预期结果,第二个值为实际结果
            assertEquals(2, 1 + 1);
        }
    
        @Test
        //@DisplayName注解修改测试用例名称
        @DisplayName("CaseTest的第2条测试用例")
            //hogwarts为测试标题
        void secondhogwarts(){
            //测试方法中的每一个操作都是测试步骤1
            System.out.println("CaseTest的第2条测试用例");
            //测试用例中的断言信息,第一个值为预期结果,第二个值为实际结果
            assertEquals(2, 1 + 1);
        }
    }
    

JUnit5 @AfterAll

  • 与@BeforeAll 类似,在测试中可能会遇到在执行所有测试用例后我们需要进行的一些操作,就可以用到@AfterAll,与@BeforeAll 的使用方法类似。
  • 使用示例:

    • 编写静态方法存放执行所有测试用例后需要进行的操作
    • 注意需要将方法声明为静态方法!
    //AfterAll注解可以实现在所有用例执行后执行
    @AfterAll
    static void teardownAll(){
        System.out.println("在所有用例后只执行一次**********");
    }
    
    • 执行查看结果,可以看到在所有测试用例执行后,teardownALL 函数才会执行且只执行一次。
    • 实现代码:
    package JUnit5structure;
    import org.junit.jupiter.api.*;
    
    import static org.junit.jupiter.api.Assertions.assertEquals;
    
    public class CaseTest {
        //BeforeAll注解可以实现在所有用例执行前执行
        @BeforeAll
        static void setupAll(){
            System.out.println("在所有测试用例前执行------------");
        }
        //AfterAll注解可以实现在所有用例执行后执行
        @AfterAll
        static void teardownAll(){
            System.out.println("在所有用例后只执行一次**********");
        }
        //BeforeEach注解可以实现在每个测试用例前执行
        @BeforeEach
        void setup(){
            System.out.println("在每个测试用例前执行------------");
        }
        //AfterEach注解可以实现在每个测试用例后执行
        @AfterEach
        void teardown(){
            System.out.println("在每个用例后都会执行=============");
        }
        //使用Test注解表示为测试方法
        @Test
        //@DisplayName注解修改测试用例名称
        @DisplayName("CaseTest的第1条测试用例")
        //hogwarts为测试标题
        void hogwarts(){
            //测试方法中的每一个操作都是测试步骤
            System.out.println("CaseTest的第1条测试用例");
            //测试用例中的断言信息,第一个值为预期结果,第二个值为实际结果
            assertEquals(2, 1 + 1);
        }
    
        @Test
        //@DisplayName注解修改测试用例名称
        @DisplayName("CaseTest的第2条测试用例")
            //hogwarts为测试标题
        void secondhogwarts(){
            //测试方法中的每一个操作都是测试步骤1
            System.out.println("CaseTest的第2条测试用例");
            //测试用例中的断言信息,第一个值为预期结果,第二个值为实际结果
            assertEquals(2, 1 + 1);
        }
    }
    

关于 All 和 Each 区别

  • All 在一个测试类中只执行一次,Each 为有多少个方法,执行多少次。
  • All 只可以修饰 static 方法,Each 可以修饰普通方法。
  • BeforeEach、BeforeAll 同时存在,先执行 BeforeAll,再执行 BeforeEach。
  • AfterEach、AfterAll 同时存在,先执行 AfterEach,再执行 AfterAll。