JUnit 5测试套件@Suite注解详解

后端 潘老师 7个月前 (10-24) 163 ℃ (0) 扫码查看

JUnit 5测试套件使用@Suite注解进行编写。套件有助于我们运行分散在多个类和包中的测试。

我们可以使用Include和Exclude注解(稍后在本文档中讨论)来过滤测试包、测试类或甚至测试方法。

@RunWith(JUnitPlatform.class)已被弃用,转而使用@Suite注解,并将在JUnit平台2.0中删除。

1.项目结构和Maven依赖项

对于这个例子,我们使用以下项目结构。

要运行套件,包括junit-platform-suite-engine依赖项(版本1.8或更高版本)。

<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-suite-engine</artifactId>
    <version>1.8.1</version>
</dependency>

2.创建测试套件

2.1 @Suite

创建套件很容易。只需向一个类添加@Suite注解,并开始将测试类和测试方法纳入或排除在套件中。

当我们想要运行套件时,只需将其作为普通的JUnit测试类运行,它将执行套件中包含的所有测试。

@SelectPackages({"com.howtodoinjava.junit5.examples.packageA"
                ,"com.howtodoinjava.junit5.examples.packageB"})
@IncludeTags("production")
@Suite
public class JUnit5TestSuiteExample {
}

2.2 @SuiteDisplayName

使用此注解为在JUnit平台上作为测试套件执行的注释的测试类提供显示名称。

显示名称通常用于IDE和构建工具中的测试报告,并可能包含空格、特殊字符和表情符号。

@IncludeTags("production")
@Suite
@SuiteDisplayName("A demo Test Suite")
public class JUnit5TestSuiteExample {
}

3. 包括和排除测试

JUnit 5提供以下注解来包括或排除套件中的测试。

  • @SelectClasses
  • @SelectPackages
  • @IncludePackages
  • @ExcludePackages
  • @IncludeClassNamePatterns
  • @ExcludeClassNamePatterns
  • @IncludeTags
  • @ExcludeTags

让我们详细了解这些注解。

3.1 @SelectPackages

@SelectPackages 用于指定通过 @RunWith(JUnitPlatform.class) 运行测试套件时要选择的包名。

@Suite
@SelectPackages("com.howtodoinjava.junit5.examples.packageA")
public class JUnit5TestSuiteExample
{
}

3.1.1. 指定单个包

将 “packageName” 作为参数传递给 @SelectPackages 注解。

3.1.2. 指定多个包

将包名作为字符串数组(在花括号 {} 中)传递给 @SelectPackages 注解的参数。

@Suite
@SelectPackages({"com.howtodoinjava.junit5.examples.packageA",
                     "com.howtodoinjava.junit5.examples.packageB"})
public class JUnit5TestSuiteExample
{
}

请注意,如果我们在 @SelectPackages 注解中传递 ‘com.demo.app’,则包 ‘com.demo.app’ 中和其所有子包中的测试类都将被选入测试套件中。

3.2 @SelectClasses

@SelectClasses 注解指定了通过 @RunWith(JUnitPlatform.class) 运行测试套件时要选择的类。

3.2.1. 指定单个测试类

将 ClassName.class 作为参数传递给 @SelectClasses 注解。

@Suite
@SelectClasses( ClassATest.class )
public class JUnit5TestSuiteExample
{
}

3.2.2. 指定多个测试类

将类名作为数组(在花括号 {} 中)传递给 @SelectClasses 注解的参数。

@Suite
@SelectClasses( { ClassATest.class, ClassBTest.class, ClassCTest.class } )
public class JUnit5TestSuiteExample
{
}

3.3. @IncludePackages 和 @ExcludePackages

我们知道 @SelectPackages 会导致其所有子包也被扫描以寻找测试类。如果您想排除任何特定包或包含任何包,则可以使用 @IncludePackages 和 @ExcludePackages 注解。

3.3.1. @IncludePackages 例子

@Suite
@SelectPackages("com.howtodoinjava.junit5.examples")
@IncludePackages("com.howtodoinjava.junit5.examples.packageC")
public class JUnit5TestSuiteExample
{
}

这只会添加来自 com.howtodoinjava.junit5.examples.packageC 中的测试类,即 ClassCTest。

3.3.2. @ExcludePackages 例字

@Suite
@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。

3.4. @IncludeClassNamePatterns 和 @ExcludeClassNamePatterns

很多时候,将所有包或测试类名包含在选择注解中并不可行。在这种情况下,您可以提供一个更广泛的包范围,并对要包含或排除的测试类应用过滤。

要指定要排除或包含的测试类名模式,您可以使用 @IncludeClassNamePatterns 和 @ExcludeClassNamePatterns 注解。

3.4.1. @IncludeClassNamePatterns 例子

包含所有以 ATest 或 ATests 结尾的测试类名。

@Suite
@SelectPackages("com.howtodoinjava.junit5.examples")
@IncludeClassNamePatterns({"^.*ATests?$"})
public class JUnit5TestSuiteExample
{
}

3.4.2. @ExcludeClassNamePatterns 例子

排除所有以 ATest 或 ATests 结尾的测试类名。

@Suite
@SelectPackages("com.howtodoinjava.junit5.examples")
@ExcludeClassNamePatterns({"^.*ATests?$"})
public class JUnit5TestSuiteExample
{
}

您可以在上述注解中使用多个模式。如果有多个模式,它们将使用 OR 语义组合。

这意味着如果一个类的全名匹配至少一个模式,该类将被包含/排除在测试套件之外。

3.5 @IncludeTags 和 @ExcludeTags

在企业应用程序中,您可能有标记的测试用例,您想在特定的环境(例如开发或生产)中运行。您也可以根据这些标签从测试套件中包括或排除测试。

3.5.1. @IncludeTags 例子

此测试套件将运行标记为 production 的 com.howtodoinjava.junit5.examples 包(及其子包)中的所有测试。

@Suite
@SelectPackages("com.howtodoinjava.junit5.examples")
@IncludeTags("production")
public class JUnit5TestSuiteExample
{
}

3.5.2. @ExcludeTags 例子

此测试套件将排除标记为 development 的 com.howtodoinjava.junit5.examples 包(及其子包)中的所有测试。

@Suite
@SelectPackages("com.howtodoinjava.junit5.examples")
@ExcludeTags("development")
public class JUnit5TestSuiteExample
{
}

 

显然,在 JUnit 5 中创建测试套件有多种方法,它对过滤到/从测试套件的测试提供了强大的支持。

4.运行单个测试套件

默认情况下,mvn test 将运行应用程序中的所有测试和套件。

使用 Maven surefire 插件的配置和测试元素来包含测试执行中的测试套件和类。在以下示例中,我们正在执行单个套件 TempDirectoryTestSuite。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>3.0.0-M7</version>
  <configuration>
    <test>com.howtodoinjava.junit5.examples.suites.TempDirectoryTestSuite</test>
  </configuration>
</plugin>
我尝试使用 JVM 系统属性 test 从命令行运行上面的套件,但它执行应用程序中的所有测试和套件。请让我知道它是否适用于您。

如果我们想要排除一些测试类和套件,我们可以使用 exclude 标签。

<configuration>
  <excludes>
      <exclude>一些需要排除的测试</exclude>
  </excludes>
</configuration>

版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10303.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】