此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

上下文缓存

一旦 TestContext 框架加载了ApplicationContext(或WebApplicationContext) 对于测试,该上下文将被缓存并重用于声明 同一测试套件中的相同唯一上下文配置。要了解缓存如何 有效,了解“唯一”和“测试套件”的含义很重要。spring-doc.cadn.net.cn

ApplicationContext可以通过配置组合进行唯一标识 参数。因此,独特的配置组合 parameters 用于生成缓存上下文的键。测试上下文 框架使用以下配置参数来构建上下文缓存键:spring-doc.cadn.net.cn

例如,如果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-doc.cadn.net.cn

测试套件和分叉进程

Spring TestContext 框架将应用程序上下文存储在静态缓存中。这 意味着上下文实际上存储在static变量。换句话说,如果 测试在单独的进程中运行,则在每个测试之间清除静态缓存 执行,这有效地禁用了缓存机制。spring-doc.cadn.net.cn

若要从缓存机制中受益,所有测试都必须在同一进程或测试中运行 套房。这可以通过在 IDE 中作为一个组执行所有测试来实现。同样地 当使用 Ant、Maven 或 Gradle 等构建框架执行测试时,它是 确保生成框架不会在测试之间分叉非常重要。例如 如果forkMode对于 Maven Surefire 插件设置为alwayspertest、TestContext 框架 无法在测试类之间缓存应用程序上下文,并且构建过程运行 结果明显更慢。spring-doc.cadn.net.cn

上下文缓存的大小以默认最大大小 32 为限。每当 达到最大大小时,使用最近最少使用的 (LRU) 逐出策略来逐出和 关闭过时的上下文。您可以从命令行或构建中配置最大大小 脚本,通过设置名为spring.test.context.cache.maxSize.作为 或者,您可以通过SpringProperties机制。spring-doc.cadn.net.cn

从 Spring Framework 7.0 开始,存储在上下文缓存中的应用程序上下文将在不再主动使用时暂停,并在下次自动重新启动 从缓存中检索上下文。具体来说,后者将重新启动所有 自动启动 bean,有效地恢复生命周期状态。 这可确保上下文中的后台进程在 测试不使用上下文。例如,JMS 侦听器容器、计划任务、 以及上下文中实现的任何其他组件LifecycleSmartLifecycle将处于“已停止”状态,直到测试再次使用上下文。但是请注意, 那SmartLifecycle组件可以通过返回falseSmartLifecycle#isPauseable().spring-doc.cadn.net.cn

由于在给定的测试套件中加载了大量应用程序上下文可以 导致套件运行时间过长,这通常是有益的 确切地知道已经加载和缓存了多少上下文。要查看 底层上下文缓存,您可以为org.springframework.test.context.cache日志记录类别设置为DEBUG.spring-doc.cadn.net.cn

在测试损坏应用程序上下文并需要重新加载(例如,通过修改 bean 定义或应用程序对象的状态)的情况下,您可以使用@DirtiesContext(参见@DirtiesContextSpring 测试注释中)。这指示 Spring 从缓存中删除上下文并重建应用程序context,然后再运行需要相同应用程序上下文的下一个测试。 注意 对@DirtiesContext注释由DirtiesContextBeforeModesTestExecutionListenerDirtiesContextTestExecutionListener,默认启用。spring-doc.cadn.net.cn

ApplicationContext 生命周期和控制台日志记录

当您需要调试使用 Spring TestContext 框架执行的测试时,它可以分析控制台输出(即,输出到SYSOUTSYSERR流)。一些构建工具和 IDE 能够将控制台输出与给定的 测试; 但是,某些控制台输出无法轻松与给定测试相关联。spring-doc.cadn.net.cn

关于由 Spring Framework 本身或组件触发的控制台日志记录在ApplicationContext,了解ApplicationContext由 Spring TestContext Framework 加载到测试套件中。spring-doc.cadn.net.cn

ApplicationContext对于测试,通常在测试实例时加载 类正在准备中——例如,执行依赖注入@Autowired字段。这意味着在 初始化ApplicationContext通常不能与 个体测试方法。但是,如果上下文紧接在 根据@DirtiesContext语义,上下文的新实例将在执行 测试方法。在后一种情况下,IDE 或生成工具可能会关联 使用单个测试方法进行控制台日志记录。spring-doc.cadn.net.cn

ApplicationContext对于可以通过以下方案之一关闭测试。spring-doc.cadn.net.cn

如果上下文根据@DirtiesContext特定测试后的语义 方法,IDE 或构建工具可能会将控制台日志记录与 个体测试方法。如果上下文根据@DirtiesContext语义学 在测试类之后,在关闭ApplicationContext不能与单个测试方法相关联。同样,任何 在关闭阶段通过 JVM 关闭钩子触发的控制台日志记录不能 与单个测试方法相关联。spring-doc.cadn.net.cn

当弹簧ApplicationContext通过 JVM 关闭钩子关闭,回调执行 在关闭阶段期间,在名为SpringContextShutdownHook.所以 如果您希望禁用在ApplicationContext已关闭通过 JVM 关闭钩子,您可以向日志记录框架注册自定义过滤器,该框架允许您忽略该线程启动的任何日志记录。spring-doc.cadn.net.cn