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

上下文缓存

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

ApplicationContext可以通过配置的组合来唯一标识 参数。因此,配置的独特组合 parameters 用于生成缓存上下文的 key。The TestContext 框架使用以下配置参数来构建上下文缓存键: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、不同的活动配置文件、不同的上下文初始化器、不同的 test 属性源,或者不同的父上下文,则相同的ApplicationContext由两个测试类共享。这意味着加载应用程序的设置成本 context 仅发生一次(每个测试套件),并且后续测试执行很多 更快。spring-doc.cadn.net.cn

测试套件和分叉流程

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

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

上下文缓存的大小以默认最大大小 32 为界。每当 达到最大大小,则使用最近最少使用 (LRU) 的驱逐策略进行驱逐,并且 关闭过时的上下文。您可以从命令行或内部版本配置最大大小 script 中,通过设置名为spring.test.context.cache.maxSize.作为 或者,您可以通过SpringProperties机制。spring-doc.cadn.net.cn

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

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

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

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

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

ApplicationContextfor a test 通常在测试的实例 类 — 例如,在@Autowired字段。这意味着在 初始化ApplicationContext通常不能与 单个测试方法。但是,如果上下文在 根据 执行测试方法@DirtiesContextsemantics,上下文的新实例将在执行 测试方法。在后一种情况下,IDE 或构建工具可能会关联 使用单个测试方法进行控制台日志记录。spring-doc.cadn.net.cn

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

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

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