|
此版本仍在开发中,尚未稳定。如需最新的稳定版本,请使用 Spring Framework 7.0.6! |
上下文缓存
一旦TestContext框架为测试加载了ApplicationContext(或WebApplicationContext)的上下文,该上下文将被缓存并重用于在同一测试套件中声明相同唯一上下文配置的所有后续测试。要了解缓存如何工作,理解“唯一”和“测试套件”的含义是很重要的。
一个 ApplicationContext 可以通过用于加载它的配置参数组合唯一标识。因此,唯一的配置参数组合用于生成上下文缓存的键。TestContext 框架使用以下配置参数来构建上下文缓存键:
-
locations(来自@ContextConfiguration) -
classes(来自@ContextConfiguration) -
contextInitializerClasses(来自@ContextConfiguration) -
contextCustomizers(来自ContextCustomizerFactory)– 这包括@DynamicPropertySource个方法,bean 覆盖(如@TestBean、@MockitoBean、@MockitoSpyBean等),以及来自 Spring Boot 测试支持的各种特性。 -
contextLoader(来自@ContextConfiguration) -
parent(来自@ContextHierarchy) -
activeProfiles(来自@ActiveProfiles) -
propertySourceDescriptors(来自@TestPropertySource) -
propertySourceProperties(来自@TestPropertySource) -
resourceBasePath(来自@WebAppConfiguration)
例如,如果TestClassA为@ContextConfiguration的locations(或value)属性指定了{"app-config.xml", "test-config.xml"},TestContext框架将加载相应的ApplicationContext并将其存储在基于这些位置的键的static上下文缓存中。因此,如果TestClassB也为它的位置(无论是显式还是通过继承隐式)定义了{"app-config.xml", "test-config.xml"},但没有定义@WebAppConfiguration,不同的ContextLoader,不同的活动配置文件,不同的上下文初始化器,不同的上下文定制器,不同的测试或动态属性源,或不同的父上下文,则两个测试类共享同一个ApplicationContext。这意味着加载应用程序上下文的设置成本只需承担一次(每个测试套件),后续的测试执行会快得多。
|
测试套件和分离进程
Spring TestContext框架将应用程序上下文存储在静态缓存中。这意味着上下文实际上是存储在一个 要从缓存机制中受益,所有测试必须在同一进程或测试套件中运行。这可以通过在IDE中将所有测试作为一个组执行来实现。同样,在使用构建框架(如Ant、Maven或Gradle)执行测试时,确保构建框架在测试之间不进行fork非常重要。例如,如果Maven Surefire插件的
|
上下文缓存的大小是有限制的,默认的最大大小为32。每当达到最大大小时,将使用最近最少使用(LRU)策略来驱逐和关闭过期的上下文。您可以通过设置名为spring.test.context.cache.maxSize的JVM系统属性从命令行或构建脚本中配置最大大小。作为替代方案,您也可以通过SpringProperties机制设置相同的属性。
由于在一个给定的测试套件中加载大量的应用程序上下文可能会导致套件运行时间过长,因此通常有益于知道已加载和缓存了多少个上下文。要查看底层上下文缓存的统计信息,可以将org.springframework.test.context.cache日志类别设置为DEBUG。
在测试破坏应用程序上下文并需要重新加载的情况下(例如,通过修改 bean 定义或应用程序对象的状态),您可以使用 @DirtiesContext 注解您的测试类或测试方法(参见 Spring 测试注解 中对 @DirtiesContext 的讨论)。这会指示 Spring 从缓存中删除上下文,并在运行下一个需要相同应用程序上下文的测试之前重新构建应用程序上下文。请注意,@DirtiesContext 注解的支持由 DirtiesContextBeforeModesTestExecutionListener 和 DirtiesContextTestExecutionListener 提供,默认情况下这些功能已启用。
|
ApplicationContext生命周期和控制台日志记录
当您需要调试使用 Spring TestContext Framework 执行的测试时,分析控制台输出(即输出到 关于由Spring框架本身或在
可以通过以下任一情况关闭测试的
如果在特定测试方法之后根据 当通过JVM关闭钩子关闭Spring |