使用 JUnit 創建測試套件
一、簡介
JUnit 是最流行的 Java 應用程序測試框架之一,具有強大而靈活的方式來創建自動化單元測試。它的特性之一是能夠創建測試套件,這使我們能夠對多個測試進行分組。
在本教程中,我們將探索如何使用 JUnit 創建測試套件。首先,我們將實施並運行一個簡單的測試套件。之後,我們將探索一些配置以包含或排除一些測試。
2. 創建測試套件
正如我們所知,測試套件是組合在一起並作為一個單元運行的測試的集合。我們使用它們將測試組織成邏輯組,例如針對特定組件或應用程序功能的測試。我們還可以輕鬆地按特定順序執行測試或根據特定標準運行測試的子集。
JUnit 5 提供了多種創建測試套件的方法。在開始之前,我們需要確保包含junit-platform-suite
依賴項:
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>1.9.2</version>
<scope>test</scope>
</dependency>
JUnit Platform Suite Engine負責使用 JUnit 中的一個或多個測試引擎運行自定義測試套件。它還為我們帶來了額外的 API,我們將使用這些 API 來創建測試套件。
2.1.使用@Suite
註解
實現測試套件最簡單的方法是使用@Suite
類級註解,這也是最推薦的解決方案。從 JUnit Platform 的 1.8.0 版本開始,這個註解就可用了.
讓我們準備一個JUnitTestSuite類:
@Suite
@SuiteDisplayName("My Test Suite")
public class JUnitTestSuite {
}
在此示例中,我們使用@Suite
註釋告訴 JUnit 將此類標記為可在單個單元中執行。此外,我們添加了一個可選的@SuiteDisplayName
註釋並指定了一個自定義標題。
從現在開始,我們可以使用此類通過使用我們的 IDE 或maven-surefire-plugin
在單次運行中執行此套件中配置的所有測試。請注意,目前此套件不包含任何測試。
2.2.使用@RunWith
註解
或者, 我們可以使用使用 JUnit 4 Runners 模型的@RunWith
註釋重寫我們的測試套件:
@RunWith(JUnitPlatform.class)
@SuiteDisplayName("My Test Suite")
public class JUnitTestSuite {
}
如果我們缺少JUnitPlafrom
類,我們需要包含一個額外的依賴項:
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.9.2</version>
<scope>test</scope>
</dependency>
因此,這個測試套件的工作方式與我們之前通過@Suite
註釋創建的測試套件類似。僅建議使用早期版本的 JUnit 的開發人員使用此解決方案。此外, JUnitPlatform
runner 自 1.8.0 以來已被棄用,以支持@Suite
並將在未來的版本中刪除。
3. 包括和排除測試
目前,我們的測試套件不包含任何測試。 JUnit Platform Suite Engine 提供了多個註釋以在我們的測試套件中包含或排除測試。
我們可以區分兩組主要的註解: @Select
和@Include
/ @Exclude
。
@Select
註釋指定 JUnit 應在其中查找測試的資源。同時, @Include
/ @Exclude
註釋指定了附加條件以包含或排除以前找到的測試。
如果沒有@Select
註釋,這兩個註釋將無法工作。我們可以混合所有註釋來確定我們想要運行哪些測試。
現在讓我們通過配置我們的測試套件來了解其中的一些。
3.1. @SelectClasses
為我們的測試套件選擇測試的最常見方法是使用@SelectClasses
註釋指定測試類:
@Suite
@SelectClasses({ClassOneUnitTest.class, ClassTwoUnitTest.class})
public class JUnitTestSuite {
}
測試套件現在執行來自兩個類的所有@Test
標記的方法。
3.2. @SelectPackages
我們可以使用**@SelectPackages
來提供用於測試掃描的包**,而不是指定類列表:
@Suite
@SelectPackages({"com.baeldung.testsuite", "com.baeldung.testsuitetwo"})
public class JUnitTestSuite {
}
值得注意的是,此註釋還執行子包中的所有類。
3.3. @IncludePackages
和@ExcludePackages
現在,我們知道如何包含包中的所有類。要進一步指定是否包含或排除包,我們可以分別使用@IncludePackages
和@ExcludePackage
s
註解:
@Suite
@SelectPackages({"com.baeldung.testsuite")
@IncludePackages("com.baeldung.testsuite.subpackage")
public class JUnitTestSuite {
}
上面的配置只執行com.baeldung.testsuite.subpackage
包中的所有測試,忽略其他發現。
讓我們看看如何排除單個包:
@Suite
@SelectPackages("com.baeldung.testsuite")
@ExcludeEngines("com.baeldung.testsuite.subpackage")
public class JUnitTestSuite {
}
現在,JUnit 執行com.baeldung.testsuite
包及其子包中的所有測試,僅忽略com.baeldung.testsuite.subpackage
中的類。
3.4. @IncludeClassNamePatterns
和@ExcludeClassNamePatterns
如果我們不想使用包指定包含規則,我們可以使用@IncludeClassNamePatterns
和@ExcludeClassNamePatterns
註解並對類名進行正則表達式檢查:
@Suite
@SelectPackages("com.baeldung.testsuite")
@IncludeClassNamePatterns("com.baeldung.testsuite.Class.*UnitTest")
@ExcludeClassNamePatterns("com.baeldung.testsuite.ClassTwoUnitTest")
public class JUnitTestSuite {
}
此示例包括在沒有其子包的com.baeldung.testsuite
包中找到的所有測試。類名必須匹配Class.*UnitTest
正則表達式模式,例如ClassOneUnitTest
和ClassThreeUnitTest
。
此外,我們還嚴格排除了滿足第一個條件的ClassTwoUnitTest
名稱。我們知道,在 Java 中,完整的類名還包括它的包。在定義模式時也應考慮到這一點。
3.5. @IncludeTags
和@ExcludeTags
正如我們所知,在 JUnit 中,我們可以通過@Tag
註解來標記類和方法。這是使用簡單值過濾測試的簡單方法。我們可以在定義測試用例時使用相同的機制,使用@IncludeTags
和@ExcludeTags
來運行帶有指定@Tag
的測試:
@Suite
@SelectPackages("com.baeldung.testsuite")
@IncludeTags("slow")
public class JUnitTestSuite {
}
該測試套件將掃描com.baeldung.testsuite
包和所有子包,僅運行帶有@Tag(“slow”)
註釋的測試。
現在讓我們反轉配置:
@Suite
@SelectPackages("com.baeldung.testsuite")
@ExcludeTags("slow")
public class JUnitTestSuite {
}
在此示例中,JUnit運行所有沒有@Tag(“slow”)
註釋的測試,包括未標記的測試。
值得注意的是,在 JUnit 中,我們還可以在測試類中標記單個方法。使用@IncludeTags
和@ExcludeTags
還允許我們包含類中的各個方法,這與之前的註釋不同。
4。結論
JUnit 提供了一種創建自動化測試的簡單方法,包括創建測試套件的能力。我們可以使用測試套件將測試組織成邏輯組,以特定順序運行一組測試,或基於特定標準運行測試子集。
在本文中,我們討論了通過@Suite
和@RunWith
API 實現測試套件的兩種方法。然後我們探索了一些額外的註釋並檢查了我們如何為我們的測試套件選擇測試。最後,我們修改了所選測試的列表,根據不同的條件包括和排除它們。
與往常一樣,本文中使用的示例可以在 GitHub 上找到。