上下文缓存
一旦 TestContext 框架为测试加载了 ApplicationContext(或 WebApplicationContext),该上下文将被缓存并重新用于所有在同一测试套件中声明相同唯一上下文配置的后续测试。要了解缓存的工作原理,重要的是要理解 “唯一” 和 “测试套件” 的含义。
ApplicationContext 可以通过用于加载它的配置参数组合来唯一标识。因此,配置参数的唯一组合用于生成缓存上下文的键。TestContext 框架使用以下配置参数来构建上下文缓存键:
-
locations(来自@ContextConfiguration) -
classes(来自@ContextConfiguration) -
contextInitializerClasses(来自@ContextConfiguration) -
contextCustomizers(来自ContextCustomizerFactory)——这包括@DynamicPropertySource方法以及来自 Infra App 测试支持的各种功能,如@MockBean和@SpyBean。 -
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。这意味着加载应用程序上下文的设置成本仅产生一次(每个测试套件),随后的测试执行速度要快得多。
|
测试套件和分叉进程
Infra TestContext 框架将应用程序上下文存储在静态缓存中。这意味着上下文实际上存储在 为了从缓存机制中受益,所有测试必须在同一进程或测试套件中运行。这可以通过在 IDE 中将所有测试作为一个组执行来实现。同样,当使用 Ant、Maven 或 Gradle 等构建框架执行测试时,确保构建框架不在测试之间分叉非常重要。例如,如果 Maven Surefire 插件的 |
上下文缓存的大小是有限的,默认最大大小为 32。每当达到最大大小时,将使用最近最少使用(LRU)驱逐策略来驱逐并关闭陈旧的上下文。你可以通过设置名为 infra.test.context.cache.maxSize 的 JVM 系统属性,从命令行或构建脚本配置最大大小。作为替代方案,你可以通过 InfraProperties 机制设置相同的属性。
由于在给定的测试套件中加载大量应用程序上下文可能会导致套件运行时间不必要地长,因此确切知道已加载和缓存了多少上下文通常是有益的。要查看底层上下文缓存的统计信息,可以将 infra.test.context.cache 日志类别的日志级别设置为 DEBUG。
在极少数情况下,如果测试破坏了应用程序上下文并需要重新加载(例如,通过修改 bean 定义或应用程序对象的状态),你可以使用 @DirtiesContext 标注你的测试类或测试方法(请参阅 Infra 测试注解 中关于 @DirtiesContext 的讨论)。这指示 Infra 从缓存中移除上下文,并在运行下一个需要相同应用程序上下文的测试之前重建应用程序上下文。请注意,@DirtiesContext 注解的支持由 DirtiesContextBeforeModesTestExecutionListener 和 DirtiesContextTestExecutionListener 提供,它们默认是启用的。
|
ApplicationContext 生命周期和控制台日志记录
当你需要调试使用 Infra TestContext 框架执行的测试时,分析控制台输出(即输出到 关于由 TODAY Framework 本身或在 测试的 测试的
如果根据 当 Infra |