此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 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、不同的活动配置文件、不同的上下文初始值设定项、不同的 测试属性源,或不同的父上下文,则相同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

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

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

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

当您需要调试使用 Spring TestContext Framework 执行的测试时,它可以是 有助于分析控制台输出(即,输出到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