上下文缓存

一旦 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 测试注释中)。这指示 Spring 从缓存中删除上下文并重建应用程序上下文,然后再运行需要相同应用程序的下一个测试 上下文。 请注意,对@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通常不能与individual 测试方法相关联。但是,如果上下文在根据@DirtiesContext语义,上下文的新实例将在执行之前加载test 方法。在后一种情况下,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