🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# JUnit5 测试套件示例 > 原文: [https://howtodoinjava.com/junit5/junit5-test-suites-examples/](https://howtodoinjava.com/junit5/junit5-test-suites-examples/) 使用 **JUnit5 测试套件**,您可以运行分散到多个测试类和不同包中的测试。 JUnit5 提供了两个注解:[`@SelectPackages`](http://junit.org/junit5/docs/current/api/index.html?org/junit/platform/runner/SelectPackages.html)和[`@SelectClasses`](http://junit.org/junit5/docs/current/api/index.html?org/junit/platform/runner/SelectClasses.html)以创建测试套件。 此外,您可以使用其他注解来过滤测试包,类甚至测试方法。 ```java Table of Contents Project Structure for Test classes and Suite Create Test Suite with JUnit5 @SelectPackages Create Test Suite with JUnit5 @SelectClasses Filtering Packages with @IncludePackages and @ExcludePackages Filtering Test Classes with @IncludeClassNamePatterns and @ExcludeClassNamePatterns Filtering Tests with @IncludeTags and @ExcludeTags ``` 测试类名称必须遵循正则表达式模式`^.*Tests?$`。 这意味着测试类名称必须以`Test`或`Tests`结尾。 例如`UserMgmtTests`,`DeviceMgmtTest`等。 ## 1\. 测试类和套件的项目结构 对于此示例,我使用以下项目结构。 ![JUnit5 Test Suite Project Structure](https://img.kancloud.cn/d3/d1/d3d16230017f93fdd7265bdc3c79e1ff_355x379.png) JUnit5 测试套件项目结构 ## 2\. 使用`@SelectPackages`创建测试套件 `@SelectPackages`指定通过`@RunWith(JUnitPlatform.class)`运行测试套件时要选择的包的名称。 #### 指定单个包 将`packageName`作为参数传递给`@SelectPackages`注解。 ```java @RunWith(JUnitPlatform.class) @SelectPackages("com.howtodoinjava.junit5.examples.packageA") public class JUnit5TestSuiteExample { } ``` ![@SelectPackages - Single Package Example](https://img.kancloud.cn/fb/0b/fb0bc6af14adc1efea14abc3265d79bd_504x145.png) `@SelectPackages` – 单个包示例 #### 指定多个包 将参数中的程序包名称作为字符串数组(在大括号`{}`中)传递给`@SelectPackages`注解。 ```java @RunWith(JUnitPlatform.class) @SelectPackages({"com.howtodoinjava.junit5.examples.packageA","com.howtodoinjava.junit5.examples.packageB"}) public class JUnit5TestSuiteExample { } ``` ![@SelectPackages - Multiple Packages Example](https://img.kancloud.cn/6d/2f/6d2f73d4955eba93016dd2208e2553a0_505x196.png) `@SelectPackages` – 多个包示例 请注意,如果我们在`@SelectPackages`注解中传递`packageX`,则将“**此软件包及其所有子软件包中的测试类**”用于测试套件。 ## 3\. 使用`@SelectClasses`创建测试套件 `@SelectClasses`指定通过`@RunWith(JUnitPlatform.class)`运行测试套件时要选择的类。 #### 指定单个类 将`ClassName.class`作为参数传递到`@SelectClasses`注解。 ```java @RunWith(JUnitPlatform.class) @SelectClasses( ClassATest.class ) public class JUnit5TestSuiteExample { } ``` ![@SelectClasses - Single Class Example](https://img.kancloud.cn/fb/0b/fb0bc6af14adc1efea14abc3265d79bd_504x145.png) `@SelectClasses` – 单个类示例 #### 指定多个类 将参数中的类名称作为数组(在大括号`{}`中)传递给`@SelectClasses`注解。 ```java @RunWith(JUnitPlatform.class) @SelectClasses( { ClassATest.class, ClassBTest.class, ClassCTest.class } ) public class JUnit5TestSuiteExample { } ``` ![@SelectClasses - Multiple Test Classes Example](https://img.kancloud.cn/8a/0b/8a0b1e9b2b827bb554ded375af735d4c_553x186.png) `@SelectClasses` – 多个测试类示例 ## 4\. `@IncludePackages`和`@ExcludePackages` 我们了解到`@SelectPackages`也会导致其所有子包都被扫描以查找测试类。 如果要排除任何特定的子包,或包括任何包,则可以使用 [`@IncludePackages`](http://junit.org/junit5/docs/current/api/org/junit/platform/suite/api/IncludePackages.html)和[`@ExcludePackages`](http://junit.org/junit5/docs/current/api/org/junit/platform/suite/api/ExcludePackages.html)注解。 #### `@IncludePackages`示例 ```java @RunWith(JUnitPlatform.class) @SelectPackages("com.howtodoinjava.junit5.examples") @IncludePackages("com.howtodoinjava.junit5.examples.packageC") public class JUnit5TestSuiteExample { } ``` 这只会添加`com.howtodoinjava.junit5.examples.packageC`中的测试类(即`ClassCTest`)中的测试。 #### `@ExcludePackages`示例 ```java @RunWith(JUnitPlatform.class) @SelectPackages("com.howtodoinjava.junit5.examples") @ExcludePackages("com.howtodoinjava.junit5.examples.packageC") public class JUnit5TestSuiteExample { } ``` 这将添加`com.howtodoinjava.junit5.examples`中测试类的测试,但不包括子包`com.howtodoinjava.junit5.examples.packageC`(即`ClassATest`和`ClassBTest`)中的所有测试类。 ## 5\. `@IncludeClassNamePatterns`和`@ExcludeClassNamePatterns` 很多时候,在选择注解中包含所有包或测试类名称是不可行的。 在这种情况下,您可能会提供更广泛的包范围,并通过 appy 筛选将哪些测试类包括在套件中或从套件中排除。 要指定要排除或包含的测试类名称模式,可以使用[`@IncludeClassNamePatterns`](http://junit.org/junit5/docs/current/api/org/junit/platform/suite/api/IncludeClassNamePatterns.html)和[`@ExcludeClassNamePatterns`](http://junit.org/junit5/docs/current/api/org/junit/platform/suite/api/ExcludeClassNamePatterns.html)注解。 #### `@IncludeClassNamePatterns`示例 包括名称以`ATest`或`ATests`结尾的所有测试类。 ```java @RunWith(JUnitPlatform.class) @SelectPackages("com.howtodoinjava.junit5.examples") @IncludeClassNamePatterns({"^.*ATests?$"}) public class JUnit5TestSuiteExample { } ``` #### `@ExcludeClassNamePatterns`示例 排除名称以`ATest`或`ATests`结尾的所有测试类。 ```java @RunWith(JUnitPlatform.class) @SelectPackages("com.howtodoinjava.junit5.examples") @ExcludeClassNamePatterns({"^.*ATests?$"}) public class JUnit5TestSuiteExample { } ``` 您可以在上述注解中应用多个模式。 在多种模式的情况下,它们使用“OR”语义进行组合。 这意味着,如果类别的完全限定名称**与至少一种模式**匹配,则该类别将包含在测试套件中/从测试套件中排除。 ## 6\. `@IncludeTags`和`@ExcludeTags` 在企业应用中,您可能已经标记了要在特定环境中运行的测试用例,例如开发或生产。 您还可以在测试套件中包含或排除基于这些标记的测试。 #### `@IncludeTags`示例 此测试套件将运行包`com.howtodoinjava.junit5.examples`(及其子包)中标记有`production`的所有测试。 ```java @RunWith(JUnitPlatform.class) @SelectPackages("com.howtodoinjava.junit5.examples") @IncludeTags("production") public class JUnit5TestSuiteExample { } ``` #### `@ExcludeTags`示例 此测试套件将排除包`com.howtodoinjava.junit5.examples`(及其子包)中所有带有`development`标签的测试。 ```java @RunWith(JUnitPlatform.class) @SelectPackages("com.howtodoinjava.junit5.examples") @ExcludeTags("development") public class JUnit5TestSuiteExample { } ``` 显然,有多种方法**在 JUnit5** 中创建测试套件,并且它强烈支持**过滤测试套件**中的测试。 将我的问题放在评论部分。 学习愉快! [源码下载](https://github.com/lokeshgupta1981/Junit5Examples/tree/master/JUnit5Examples)