Spring JUnit 4 Testing Annotations

  • @IfProfileValue:基于配置的配置文件值启用或禁用测试。

  • @ProfileValueSourceConfiguration:指定用于检索配置文件值的配置文件值源类型。

  • @Timed:限制测试方法执行的持续时间,如果超过会使测试失败。

  • @Repeat:指定测试方法应重复执行的次数。

这些注释有助于控制和配置 Spring 和 JUnit 4 测试的执行行为,使其更灵活和健壮。

只有在与 SpringRunnerSpring’s JUnit 4 rulesSpring’s JUnit 4 support classes结合使用时,才支持以下注释:

@IfProfileValue

@IfProfileValue 表明带注解的测试类或测试方法已针对特定测试环境启用。如果配置的 ProfileValueSource 返回与提供的 name 匹配的 value,则测试处于启用状态。否则,测试将被禁用,并且实际上会被忽略。

你可以在类级别、方法级别或两者都应用 @IfProfileValue@IfProfileValue 的类级别用法优先于该类或其子类中任何方法的类级别用法。具体而言,如果测试在类级别和方法级别均处于启用状态,则该测试处于启用状态。不存在 @IfProfileValue 表示测试已隐式启用。这类似于 JUnit 4 的 @Ignore 注解的语义,除了 @Ignore 的存在始终禁用测试。

以下示例显示具有 @IfProfileValue 注解的测试:

Java
@IfProfileValue(name="java.vendor", value="Oracle Corporation") (1)
@Test
public void testProcessWhichRunsOnlyOnOracleJvm() {
	// some logic that should run only on Java VMs from Oracle Corporation
}
1 仅在 Java 供应商为“Oracle Corporation”时才运行此测试。
Kotlin
@IfProfileValue(name="java.vendor", value="Oracle Corporation") (1)
@Test
fun testProcessWhichRunsOnlyOnOracleJvm() {
	// some logic that should run only on Java VMs from Oracle Corporation
}
2 仅在 Java 供应商为“Oracle Corporation”时才运行此测试。

或者,你可以使用一个 values 列表配置 @IfProfileValue(带有 OR 语义)来实现对 JUnit 4 环境中测试组的 TestNG 类似的支持。考虑以下示例:

Java
@IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"}) (1)
@Test
public void testProcessWhichRunsForUnitOrIntegrationTestGroups() {
	// some logic that should run only for unit and integration test groups
}
1 对单元测试和集成测试运行此测试。
Kotlin
@IfProfileValue(name="test-groups", values=["unit-tests", "integration-tests"]) (1)
@Test
fun testProcessWhichRunsForUnitOrIntegrationTestGroups() {
	// some logic that should run only for unit and integration test groups
}
2 对单元测试和集成测试运行此测试。

@ProfileValueSourceConfiguration

@ProfileValueSourceConfiguration 是一个注解,可以应用于测试类,以指定在通过 @IfProfileValue 注解检索通过配置的配置文件值时要使用哪种类型的 ProfileValueSource。如果未为测试声明 @ProfileValueSourceConfiguration,则默认使用 SystemProfileValueSource。以下示例展示如何使用 @ProfileValueSourceConfiguration

Java
@ProfileValueSourceConfiguration(CustomProfileValueSource.class) (1)
public class CustomProfileValueSourceTests {
	// class body...
}
1 使用自定义轮廓值源。
Kotlin
@ProfileValueSourceConfiguration(CustomProfileValueSource::class) (1)
class CustomProfileValueSourceTests {
	// class body...
}
2 使用自定义轮廓值源。

@Timed

@Timed 表明带注解的测试方法必须在指定的时间段内完成执行(以毫秒为单位)。如果文本执行时间超过指定的时间段,则测试失败。

时间段包括运行测试方法本身,测试的任何重复(请参阅“@Repeat”),以及测试装置的任何设置或拆除。以下示例展示了如何使用它:

Java
@Timed(millis = 1000) (1)
public void testProcessWithOneSecondTimeout() {
	// some logic that should not take longer than 1 second to run
}
1 将测试时间段设置为 1 秒。
Kotlin
@Timed(millis = 1000) (1)
fun testProcessWithOneSecondTimeout() {
	// some logic that should not take longer than 1 second to run
}
2 将测试时间段设置为 1 秒。

Spring 的“@Timed”注释与 JUnit 4 中的“@Test(timeout=…​)”支持具有不同的语义。具体来说,由于 JUnit 4 处理测试执行超时的方式(即,在单独的“Thread”中执行测试方法),如果测试花费的时间太长,“@Test(timeout=…​)”会先发制人地使测试失败。另一方面,Spring 的“@Timed”不会先发制人地使测试失败,而是等到测试完成才使其失败。

@Repeat

“@Repeat”表示注释的测试方法必须反复运行。测试方法运行的次数在注释中指定。

要重复执行的范围包括执行测试方法本身以及对测试夹具进行任何设置或拆除。与 xref:testing/testcontext-framework/support-classes.adoc#testcontext-junit4-rules[SpringMethodRule 一起使用时,此范围还包括通过 TestExecutionListener 实现准备测试实例。以下示例显示了如何使用 @Repeat 注释:

Java
@Repeat(10) (1)
@Test
public void testProcessRepeatedly() {
	// ...
}
1 重复此测试 10 次。
Kotlin
@Repeat(10) (1)
@Test
fun testProcessRepeatedly() {
	// ...
}
2 重复此测试 10 次。