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-method
和pre-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