此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
上下文缓存
一旦 TestContext 框架加载了ApplicationContext
(或WebApplicationContext
)
对于测试,该上下文将被缓存并重用于声明
同一测试套件中的相同唯一上下文配置。要了解缓存如何
有效,了解“唯一”和“测试套件”的含义很重要。
一ApplicationContext
可以通过配置组合进行唯一标识
参数。因此,独特的配置组合
parameters 用于生成缓存上下文的键。测试上下文
框架使用以下配置参数来构建上下文缓存键:
-
locations
(从@ContextConfiguration
) -
classes
(从@ContextConfiguration
) -
contextInitializerClasses
(从@ContextConfiguration
) -
contextCustomizers
(从ContextCustomizerFactory
) – 这包括@DynamicPropertySource
方法、bean 覆盖(例如@TestBean
,@MockitoBean
,@MockitoSpyBean
等),以及 Spring Boot 测试支持的各种功能。 -
contextLoader
(从@ContextConfiguration
) -
parent
(从@ContextHierarchy
) -
activeProfiles
(从@ActiveProfiles
) -
propertySourceDescriptors
(从@TestPropertySource
) -
propertySourceProperties
(从@TestPropertySource
) -
resourceBasePath
(从@WebAppConfiguration
)
例如,如果TestClassA
指定{"app-config.xml", "test-config.xml"}
对于locations
(或value
) 属性的@ContextConfiguration
、TestContext 框架
加载相应的ApplicationContext
并将其存储在static
上下文缓存
在仅基于这些位置的密钥下。所以,如果TestClassB
还定义了{"app-config.xml", "test-config.xml"}
对于其位置(显式或
通过继承隐式地),但没有定义@WebAppConfiguration
,不同的ContextLoader
、不同的活动配置文件、不同的上下文初始值设定项、不同的
上下文定制器、不同的测试或动态属性源或不同的父级
context,则相同ApplicationContext
由两个测试类共享。这意味着
加载应用程序上下文的设置成本仅产生一次(每个测试
套件),后续测试执行速度要快得多。
测试套件和分叉进程
Spring TestContext 框架将应用程序上下文存储在静态缓存中。这
意味着上下文实际上存储在 若要从缓存机制中受益,所有测试都必须在同一进程或测试中运行
套房。这可以通过在 IDE 中作为一个组执行所有测试来实现。同样地
当使用 Ant、Maven 或 Gradle 等构建框架执行测试时,它是
确保生成框架不会在测试之间分叉非常重要。例如
如果 |
上下文缓存的大小以默认最大大小 32 为限。每当
达到最大大小时,使用最近最少使用的 (LRU) 逐出策略来逐出和
关闭过时的上下文。您可以从命令行或构建中配置最大大小
脚本,通过设置名为spring.test.context.cache.maxSize
.作为
或者,您可以通过SpringProperties
机制。
从 Spring Framework 7.0 开始,存储在上下文缓存中的应用程序上下文将在不再主动使用时暂停,并在下次自动重新启动
从缓存中检索上下文。具体来说,后者将重新启动所有
自动启动 bean,有效地恢复生命周期状态。
这可确保上下文中的后台进程在
测试不使用上下文。例如,JMS 侦听器容器、计划任务、
以及上下文中实现的任何其他组件Lifecycle
或SmartLifecycle
将处于“已停止”状态,直到测试再次使用上下文。但是请注意,
那SmartLifecycle
组件可以通过返回false
从SmartLifecycle#isPauseable()
.
由于在给定的测试套件中加载了大量应用程序上下文可以
导致套件运行时间过长,这通常是有益的
确切地知道已经加载和缓存了多少上下文。要查看
底层上下文缓存,您可以为org.springframework.test.context.cache
日志记录类别设置为DEBUG
.
在测试损坏应用程序上下文并需要重新加载(例如,通过修改 bean 定义或应用程序对象的状态)的情况下,您可以使用@DirtiesContext
(参见@DirtiesContext
在 Spring 测试注释中)。这指示 Spring 从缓存中删除上下文并重建应用程序context,然后再运行需要相同应用程序上下文的下一个测试。 注意 对@DirtiesContext
注释由DirtiesContextBeforeModesTestExecutionListener
和DirtiesContextTestExecutionListener
,默认启用。
ApplicationContext 生命周期和控制台日志记录
当您需要调试使用 Spring TestContext 框架执行的测试时,它可以分析控制台输出(即,输出到 关于由 Spring Framework 本身或组件触发的控制台日志记录在 这 这
如果上下文根据 当弹簧 |