JUnit 5 测试套件选择测试方法

JUnit 5 test suite choose test methods

正在对 类 Junit 5 和 Spring 引导 REST 控制器测试进行一些测试。

@SpringBootTest
@AutoConfigureMockMvc
public class TestClassA {
   @Autowired
   private MockMvc mockMvc;

   @Test
   @WithMockUser
   public void testMethod1() {
   ...
   }

   @Test
   @WithMockUser
   public void testMethod2() {
   ...
   }

   // more test methods
}

@SpringBootTest
@AutoConfigureMockMvc
public class TestClassB {
   @Autowired
   private MockMvc mockMvc;

   @Test
   @WithMockUser
   public void testMethod1() {
   ...
   }

   // more test methods

   @Test
   @WithMockUser
   public void testMethodX() {
      // requires that TestClassA.testMethod2()
      // must be run first
   }
}

测试类运行,每次测试一个特定的REST控制器,但是如何实现一个新的测试方法TestClassB.testMethodX()

我想在 JUnit 5 中创建一个测试套件并指定 运行 的测试方法,也是按顺序:

1. run TestClassA.testMethod2()

2. run TestClassB.testMethodX()

我知道两个注释: - @SelectPackages - @SelectClasses

但是无法选择特定的测试方法? 这可以用 JUnit 5 实现吗?

我不能同时回答你的两个问题,但至少我可以给你一个提示,告诉你如何选择一组测试方法,应该是运行。

根据我的理解 unit/integration 测试不应该依赖特定的顺序才能成功通过。真的有必要吗,或者您可以使用 @Before 注释之类的东西来实现任务的重要要求吗?

在我的设置中,我 运行 Spring Boot Gradle.

JUnit 标记和过滤

JUnit 5 允许使用 @Tag 注释向您的测试方法添加标签。使用此功能,可以在测试执行时过滤测试方法。看看 baeldung.com 的简短教程。

标记您的测试方法

用符合您目的的标签标记您的测试方法,就像这样。

   @Test
   @Tag("IntegrationTest")
   public void testMethod1() {
   ...
   }

   // more test methods

   @Test
   @Tag("UnitTest")
   public void testMethodX() {
   ...
   }

运行 标记方法

运行 使用 IntelliJ 标记的方法

如果您使用 IntelliJ IDE,运行 测试带有特定标签的方法会相当简单。参见 jetbrains.com docs or

  • Run -> Edit Configurations... -> +(添加新配置) -> JUnit
  • 作为Test kinds选择Tags
  • Tag expression
  • 处插入您想要的标签

运行 使用 Gradle

标记的方法

如果您想 运行 您的测试方法,例如在持续集成管道中,您可能 运行 使用 Gradle 或 Maven 进行测试。对于 Gradle,我还可以向您展示使用特定标签的 运行 方法的可能性。

打开build.gradle
对于依赖项,您可能已经集成了 JUnit 5 框架,类似于:

dependencies {
    // [...]
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    // [...]
}

您还应该有一个 test 任务。

test {
    useJUnitPlatform()
}

命令 $ gradlew test 现在将 运行 所有 定义测试方法。所以,为了 运行 只是一组特定的方法,我建议创建 custom tasks,像这样。

test {
    useJUnitPlatform()
}

task unitTests(type: Test) {
    useJUnitPlatform {
        includeTags 'UnitTest'
    }
}

task integrationTests(type: Test) {
    useJUnitPlatform {
        includeTags 'IntegrationTest'
    }
}

之后,您可以 运行 命令行界面上的任务,例如:$ gradlew unitTests 它只会 运行 您在自定义任务中定义的任务。