Spring JUnit 4 测试注解
以下注解仅在结合 SpringRunner、Spring 的 JUnit 4 规则 或 Spring 的 JUnit 4 支持类 使用时才受支持:
@IfProfileValue
这是一个用于集成测试的注解,通常与 JUnit 4 一起使用。@IfProfileValue
注解允许你根据特定的配置值来决定是否执行某个测试方法或测试类。如果配置值与指定的值匹配,测试将被执行;否则,测试将被跳过。
例如:
@IfProfileValue(name = "test.environment", value = "ci")
public void testMethod() {
// 测试代码
}
在这个例子中,只有当 test.environment
的值为 "ci"
时,testMethod
才会被执行。
@IfProfileValue
表示被注解的测试类或测试方法在特定的测试环境中启用。如果配置的 ProfileValueSource
为提供的 name
返回匹配的 value
,则测试被启用。否则,测试会被禁用,实际上会被忽略。
你可以在类级别、方法级别或两者上应用 @IfProfileValue
。对于类或其子类中的任何方法,类级别的 @IfProfileValue
使用优先于方法级别的使用。具体来说,如果一个测试在类级别和方法级别同时启用,则该测试才会启用。如果缺少 @IfProfileValue
,则意味着测试是隐式启用的。这与 JUnit 4 的 @Ignore
注解的语义类似,不同之处在于 @Ignore
的存在总是会禁用测试。
以下示例展示了一个带有 @IfProfileValue
注解的测试:
- Java
- Kotlin
@IfProfileValue(name="java.vendor", value="Oracle Corporation") 1
@Test
public void testProcessWhichRunsOnlyOnOracleJvm() {
// 仅在 Oracle Corporation 的 Java 虚拟机上运行的逻辑
}
仅在 Java 供应商为 "Oracle Corporation" 时运行此测试。
@IfProfileValue(name="java.vendor", value="Oracle Corporation") 1
@Test
fun testProcessWhichRunsOnlyOnOracleJvm() {
// 仅在 Oracle Corporation 的 Java 虚拟机上运行的逻辑
}
仅在 Java 供应商为 "Oracle Corporation" 时运行此测试。
或者,你可以配置 @IfProfileValue
并提供一个 values
列表(具有 OR
语义),以在 JUnit 4 环境中实现类似 TestNG 的测试组支持。考虑以下示例:
- Java
- Kotlin
@IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"}) 1
@Test
public void testProcessWhichRunsForUnitOrIntegrationTestGroups() {
// 一些只应在单元测试和集成测试组中运行的逻辑
}
为单元测试和集成测试运行此测试。
@IfProfileValue(name="test-groups", values=["unit-tests", "integration-tests"]) 1
@Test
fun testProcessWhichRunsForUnitOrIntegrationTestGroups() {
// 一些只应在单元测试和集成测试组中运行的逻辑
}
为单元测试和集成测试运行此测试。
@ProfileValueSourceConfiguration
@ProfileValueSourceConfiguration
是一个可以应用于测试类的注解,用于指定在检索通过 @IfProfileValue
注解配置的配置文件值时使用哪种类型的 ProfileValueSource
。如果未为测试声明 @ProfileValueSourceConfiguration
,则默认使用 SystemProfileValueSource
。以下示例展示了如何使用 @ProfileValueSourceConfiguration
:
- Java
- Kotlin
@ProfileValueSourceConfiguration(CustomProfileValueSource.class) 1
public class CustomProfileValueSourceTests {
// class body...
}
使用自定义的 profile 值源。
@ProfileValueSourceConfiguration(CustomProfileValueSource::class) 1
class CustomProfileValueSourceTests {
// class body...
}
使用自定义的 profile 值源。
@Timed
@Timed
是一个用于 JUnit 4 测试的注解,用于指定测试方法的执行时间限制。通过使用这个注解,可以确保测试方法在规定的时间内完成,否则测试将被标记为失败。
用法
import org.junit.Test;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
import org.junit.runners.model.TestTimedOutException;
@RunWith(Theories.class)
public class TimedTest {
@Test
@Timed(millis = 1000)
public void testMethod() {
// 测试代码
}
}
在上面的例子中,testMethod
必须在 1000 毫秒(1 秒)内完成,否则测试将失败并抛出 TestTimedOutException
异常。
参数
millis
: 指定测试方法的执行时间上限,单位为毫秒。
注意事项
- 如果测试方法在规定时间内未完成,测试将被中断并标记为失败。
- 该注解适用于需要严格控制执行时间的测试场景,例如性能测试或超时测试。
通过使用 @Timed
注解,可以有效地管理测试的执行时间,确保测试的可靠性和稳定性。
@Timed
表示被注解的测试方法必须在指定的时间周期内(以毫秒为单位)完成执行。如果测试执行时间超过了指定的时间周期,则测试失败。
时间周期包括运行测试方法本身、任何测试的重复(参见 @Repeat
),以及测试装置的设置或拆卸。以下示例展示了如何使用它:
- Java
- Kotlin
@Timed(millis = 1000) 1
public void testProcessWithOneSecondTimeout() {
// 一些逻辑,运行时间不应超过 1 秒
}
将测试的时间周期设置为 1 秒。
@Timed(millis = 1000) 1
fun testProcessWithOneSecondTimeout() {
// 一些逻辑,运行时间不应超过 1 秒
}
将测试的时间周期设置为 1 秒。
Spring 的 @Timed
注解与 JUnit 4 的 @Test(timeout=…)
支持具有不同的语义。具体来说,由于 JUnit 4 处理测试执行超时的方式(即通过在单独的 Thread
中执行测试方法),如果测试耗时过长,@Test(timeout=…)
会提前使测试失败。而 Spring 的 @Timed
则不会提前使测试失败,而是等待测试完成后才使其失败。
@Repeat
@Repeat
表示被注解的测试方法必须重复运行。测试方法运行的次数在注解中指定。
要重复执行的范围包括测试方法本身的执行以及测试夹具的任何设置或拆除。当与 SpringMethodRule 一起使用时,范围还包括由 TestExecutionListener
实现准备的测试实例。以下示例展示了如何使用 @Repeat
注解:
- Java
- Kotlin
@Repeat(10) 1
@Test
public void testProcessRepeatedly() {
// ...
}
重复此测试十次。
@Repeat(10) 1
@Test
fun testProcessRepeatedly() {
// ...
}
重复此测试十次。