测试按测试函数字典序进行

测试方法名字

(可以给类前面的加,也可以给测试方法前面加)


@DisplayName("My 1st JUnit 5 test! ")
class Test1 {

    @DisplayName("我的第一個測試")
    @Test
    void testFirstTest() {
        System.out.println("我的第一個測試開始測試");
    }

    @DisplayName("我的第二個測試")
    @Test
    void testSecondTest() {
        System.out.println("我的第二個測試開始測試");
    }
}

2. before and after


        @BeforeAll 
        public static void init(){
            System.out.println("初始化資料");
        }

        @AfterAll 
        public static void cleanup(){
            System.out.println("清理資料");
        }

        @BeforeEach 
        public void tearup(){
            System.out.println("當前測試方法開始");
        }

        @AfterEach 
        public void tearDown(){
               System.out.println("當前測試方法結束");
        }
        @Test
        void testFirstTest(){
            System.out.println("我的第一個測試開始測試");
        }
        @Test
        void testSecondTest(){
            System.out.println("我的第二個測試開始測試");
        }

3. 测试失败提示

    assertEquals(2,calculator.add(1,1),"1 + 1 should equal 2");

4. 取消测试

    @Test 
    @Disabled

.

5. 测试类树状嵌套(只给class 使用)

JUnit 5提供了 @Nested注解,能够以静态内部成员类的形式对测试用例类进行逻辑分组。并且每个静态内部类都可以有自己的生命周期方法, 这些方法将按从外到内层次顺序执行。


@DisplayName("first")
class TestingAStackDemo {
    @Test
    @DisplayName("1")
    void isInstantiatedWithNew() {
        new Stack<>();
    }

    @Nested
    @DisplayName("Second")
    class WhenNew {
        @Test
        @DisplayName("2")
        void isEmpty() {
            System.out.println("a");
        }
    }

    @Test
    @DisplayName("3")
    void test3() {
        new Stack<>();
    }
}

6. 重复测试

@RepeatedTest(value = 3)

@DisplayName("自定义名称重复测试") 
@RepeatedTest(value = 3, name = "{displayName} 第 {currentRepetition} 次")

@RepeatedTest 注解内用

currentRepetition 变量表示已经重复的次数,

totalRepetitions 变量表示总共要重复的次数,

displayName 变量表示测试方法显示名称,

我们直接就可以使用这些内置的变量来重新定义测试方法重复运行时的名称。

7.断言

断言有助于通过测试用例的实际输出来验证期望的输出。 为简单起见,所有 JUnit Jupiter
断言都是org.junit.jupiter.Assertions类中的静态方法,例如assertEquals()assertNotEquals()


assertEquals 断言预期值和实际值相等
assertAll 分组断言,执行其中包含的所有断言
assertArrayEquals 断言预期数组和实际数组相等
assertFalse 断言条件为假
assertNotNull 断言不为空
assertSame 断言两个对象相等
assertTimeout 断言超时
fail 使单元测试失败

8.假设

Assumptions类提供静态方法来支持基于假设的条件测试执行。
假设失败会导致测试中止。 通常在没有必要继续执行给定测试方法的情况下使用假设。

假设失败 当前测试被忽略

    @Test
    void testOnProd(){
         Assumptions.assumeFalse(1+1==2);
         System.out.println("okkkk");
    }

image-20210928194852962

假设与断言:

假设仅在假设为真时才会运行。如果为假,将被跳过。

在断言为假的情况下,它会提供预定义的错误消息。


一个测试失败时,Asserts和Assumes都会停止,然后继续进行下一个测试。区别在于,失败的Assert将失败记录为失败的测试,而Assume仅移至下一个测试。

简而言之,假设用于禁用测试

9.参数化测试

@ParameterizedTest 表示方法是参数化测试

@ValueSource

它可以让你指定一个原生类型(String,int,long或double)的数组,并且只能为每次调用提供一个参数。

@ParameterizedTest 
@ValueSource(ints = {1, 2, 3})
void testWithValueSource(int argument){
        assertNotNull(argument);
}

image-20210928200023488

默认测试数组所有值

@CsvSource

@CsvSource允许您将参数列表表示为以逗号分隔的值(例如,字符串文字)

@ParameterizedTest 
@CsvSource({"foo, 1", "bar, 2", "'baz, qux', 3"})
void testWithCsvSource(String first,int second){
        assertNotNull(first);
        assertNotEquals(0,second);
        System.out.println(first+" "+second);
        }

image-20210928201142177