# 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](img/afb801e2a7677f26c4c2fa69d2902a04.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](img/077bf64db3fe32ef5528c68cbb15a72e.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](img/e96e610844c9b44c75a62ba8709804a4.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](img/94e42e360ea142a1079b36d2dc5549e6.png)

`@SelectClasses` – 单个类示例



#### 指定多个类

将参数中的类名称作为数组（在大括号`{}`中）传递给`@SelectClasses`注解。

```java
@RunWith(JUnitPlatform.class)
@SelectClasses( { ClassATest.class, ClassBTest.class, ClassCTest.class } )
public class JUnit5TestSuiteExample 
{
}

```

![@SelectClasses - Multiple Test Classes Example](img/af170c949617666aadbdfc4a63c430dc.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)