对于最新稳定版本,请使用Spring Framework 7.0.1spring-doc.cadn.net.cn

上下文缓存

一旦TestContext框架加载了应用上下文(或WebApplicationContext) 对于测试,该上下文会被缓存并用于所有后续声明 在同一测试套件中,使用相同的独特上下文配置。理解缓存的原理 理解“独特”和“测试套件”的含义非常重要。spring-doc.cadn.net.cn

应用上下文可以通过配置组合唯一识别 这些参数用于加载它。因此,配置的独特组合 参数用于生成缓存上下文的键。测试上下文 Framework 使用以下配置参数构建上下文缓存键:spring-doc.cadn.net.cn

例如,如果测试A组指定{“app-config.xml”,“test-config.xml”}对于地点(或) 属性@ContextConfiguration测试上下文框架 负载对应的应用上下文并将其存储在静态的上下文缓存 在一个仅基于这些位置的密钥下。所以,如果测试B类也定义了{“app-config.xml”,“test-config.xml”}对于其位置(要么显式的,要么是 隐含通过继承)但不定义@WebAppConfiguration,不同的上下文加载器不同的活跃配置文件,不同的上下文初始化器,不同的 测试属性源,或者不同的父上下文,然后相同应用上下文两个测试类共享。这意味着加载应用程序的设置成本 上下文每套测试套件只产生一次,后续测试执行量很大 更快。spring-doc.cadn.net.cn

测试套件与分支进程

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

为了利用缓存机制,所有测试必须在同一进程或测试中运行 套房。这可以通过在 IDE 内将所有测试作为一组执行来实现。同样地 当使用Ant、Maven或Gradle等构建框架执行测试时,则是 确保构建框架不会在测试之间分叉非常重要。例如 如果forkMode对于Maven Surefire插件,设置为总是佩尔泰斯特测试上下文框架 无法在测试类之间缓存应用上下文,构建过程会运行 因此速度明显变慢。spring-doc.cadn.net.cn

上下文缓存的大小有限制,默认最大大小为32。每当 达到最大规模时,采用最近最少使用(LRU)驱逐政策进行驱逐,且 关闭陈旧的语境。你可以从命令行或构建中配置最大大小 通过设置一个名为spring.test.context.cache.maxSize.作为 另外,你也可以通过春季房产机制。spring-doc.cadn.net.cn

因为在给定的测试套件中加载大量应用上下文 如果导致套间运行时间过长,通常有益于 准确知道有多少上下文被加载和缓存。查看 的统计数据 底层上下文缓存,你可以设置日志级别org.springframework.test.context.cache日志分类 变为调试.spring-doc.cadn.net.cn

在极不可能的情况下,测试损坏了应用上下文并需要重新加载 (例如,通过修改 Bean 定义或应用对象的状态),你 可以为你的测试类或测试方法注释@DirtiesContext(参见讨论@DirtiesContext春季测试注释中)。这会指示 Spring 从缓存中移除上下文并重建 在运行下一个需要相同应用的测试之前,先进行应用上下文 上下文。注意,对@DirtiesContext注释由DirtiesContextBeforeModesTestExecutionListener以及DirtiesContextTestExecutionListener,这些选项默认被启用。spring-doc.cadn.net.cn

ApplicationContext 生命周期与控制台日志

当你需要调试使用 Spring TestContext 框架执行的测试时,它可以是 分析控制台输出(即输出给系统输出SYSERR流)。一些构建工具和IDE能够将控制台输出与给定的输出关联起来 测试;然而,有些控制台输出无法轻易与某个测试关联起来。spring-doc.cadn.net.cn

关于由 Spring Framework 本身或组件触发的控制台日志 注册在应用上下文了解 的生命周期非常重要应用上下文该 Gmail 由 Spring TestContext 框架加载于 测试室。spring-doc.cadn.net.cn

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

应用上下文对于测试来说,可以通过以下情景之一闭合。spring-doc.cadn.net.cn

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

Spring之时应用上下文通过JVM关闭钩子关闭,回调执行 在关机阶段,执行于一个名为春季上下文关闭挂钩.所以 如果你想在应用上下文是闭合的 通过JVM的关机钩子,你可能能在日志中注册一个自定义过滤器 允许你忽略该线程发起的任何日志的框架。spring-doc.cadn.net.cn