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
它只会 运行 您在自定义任务中定义的任务。
正在对 类 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
它只会 运行 您在自定义任务中定义的任务。