JUnit5的Tag、Filter、Order、Lifecycle


Tag

JUnit5可以使用@Tag注解給測試類和測試方法打tag,這些tag能用來在執行時進行過濾,它跟group有點類似。

tag應該遵循以下規則:

  • 不能為null或者為空。
  • 不能包含空格。
  • 不能包含ISO控制字符。
  • 不能包含保留字符:, ( ) & | !

示例代碼:

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("fast")
@Tag("model")
class TaggingDemo {

    @Test
    @Tag("taxes")
    void testingTaxCalculation() {
    }

}

@Tag還可以通過元注解和組合注解,實現自定義注解,參考:

https://dongfanger.gitee.io/blog/JUnit/002-JUnit5注解學習指引.html#id2

Filter

打好了tag后,在執行時可以進行過濾,比如Maven配置:

<!-- ... -->
<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
            <configuration>
                <groups>acceptance | !feature-a</groups>
                <excludedGroups>integration, regression</excludedGroups>
            </configuration>
        </plugin>
    </plugins>
</build>
<!-- ... -->

groups用來指定包含哪些tag,excludedGroups用來指定排除哪些tag。

Order

JUnit5默認使用了某種算法來確定test方法的執行順序。我們可以通過@TestMethodOrder進行自定義,既可以使用內置類,也可以使用實現了MethodOrderer接口的類。

內置類如下:

  • DisplayName 按DisplayName的字母數字順序
  • OrderAnnotation 通過@Order注解指定順序
  • Random 隨機順序
  • Alphanumeric 按test方法名和參數列表的字母數字順序

示例:

import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(OrderAnnotation.class)
class OrderedTestsDemo {

    @Test
    @Order(1)
    void nullValues() {
        // perform assertions against null values
    }

    @Test
    @Order(2)
    void emptyValues() {
        // perform assertions against empty values
    }

    @Test
    @Order(3)
    void validValues() {
        // perform assertions against valid values
    }

}

也可以配置全局的JUnit5的默認執行順序,比如在src/test/resources/junit-platform.properties中:

junit.jupiter.testmethod.order.default = \
    org.junit.jupiter.api.MethodOrderer$OrderAnnotation

Lifecycle

JUnit5默認會在執行測試方法前給每個測試類創建一個實例對象,讓測試方法相互獨立,這叫做per-method測試實例生命周期。

就算測試方法被disable了也會創建實例。

如果想讓每個測試類只創建一個實例對象,測試方法共用這一個實例,那么可以使用注解@TestInstance(Lifecycle.PER_CLASS),這叫做pre-class測試實例生命周期。

pre-class有一些好處,比如:

  • 在實例中存儲變量,然后通過@BeforeEach@AfterEach修改。
  • @BeforeAll@AfterAll可以作用於非靜態方法和接口default方法。
  • @BeforeAll@AfterAll可以作用於@Nested嵌套測試類。

有兩種方式可以設置全局的生命周期模式,第一種是JVM啟動參數:

-Djunit.jupiter.testinstance.lifecycle.default=per_class

第二種方式是配置文件,比如src/test/resources/junit-platform.properties

junit.jupiter.testinstance.lifecycle.default = per_class

如果要進行全局配置,建議使用配置文件,這樣在出現問題時方便進行追溯。

小結

本文首先介紹了給測試類和測試方法打tag進行分組,然后可以在運行時根據tag進行過濾,接着介紹了如何制定測試方法的執行順序,最后介紹了兩種生命周期:per-methodpre-class

參考資料:

https://junit.org/junit5/docs/current/user-guide/#writing-tests-tagging-and-filtering

https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order

https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM