在某些情况下,您无法避免它,特别是如果您弄脏 Spring 上下文或 GemFire 实例,以致在测试套件中运行后续测试时会导致冲突。
即,在您编写的每个新测试类和/或测试用例中尝试管理隔离/分离可能需要做更多的工作,必须跟踪哪些测试触及了什么(例如区域),而不是可能只是重新启动每个测试类的 GemFire 实例(或者在更坏的情况下,每个测试用例)。例如,考虑一个 OQL 查询由于之前的测试操作或类似性质的东西而导致意外的结果。
Spring Data GemFire 测试套件非常相似,它启动 GemFire 实例并停止它们,无论是每个测试用例,还是在大多数情况下,每个测试类。带有测试的整个构建(900 多个测试)平均在约 15 分钟内运行。GemFire 自己的测试套件(单元 + 集成/分布式测试等)在大约 8-12 小时内运行,具体取决于您“并行化”测试的效率,oO
我坚信 10 分钟构建,但 GemFire 是一头复杂的野兽,编写测试,尤其是分布式测试,需要仔细规划。
Spring Data GemFire 中的大多数测试都是对等缓存应用程序(即测试 JVM 嵌入了 GemFire 实例,例如... RegionDataPolicyShortcutsIntegrationTest及其关联的Spring 上下文配置文件)。
我发现如果您设置一些 GemFire 属性(例如将日志级别设置为“警告”,特别是将 mcast-port 设置为 0),您可以大大减少运行时间,例如. 将 mcast-port 设置为 0 会设置一个“孤独的”GemFire 节点并大大缩短启动时间。
还有其他 Spring Data GemFire 测试,它们是“ClientCaches”,它们甚至生成一个带有 GemFire 服务器进程的单独 JVM 来测试客户端/服务器交互。您可以想象那些需要更长的时间来启动/停止,事实上他们确实如此。例如,ClientCacheFunctionExecutionWithPdxIntegrationTest和相关的 Spring 上下文配置文件......(服务器)当然还有(客户端)。注意,本例中的测试是 GemFire ClientCache VM。
现在,您也许可以在某些测试中找到使用模拟的方法。许多 Spring Data GemFire 测试使用org.springframework.data.gemfire.test包中提供的模拟来模拟 SDG 和 GemFire 之间的交互。
SDG 中使用 mock 的测试类声明了一种特殊的 Spring ApplicationContextInitializer,就像在GemfireTemplateTest中一样,它使用 SDG GemfireTestApplicationContextInitializer。不过,真正的魔力在于GemfireTestBeanPostProcessor。如果你跟踪代码,你就会明白。
随着时间的推移,我希望将这些模拟正式化,并使用这些模拟创建一个单独的项目,GemfireTestApplicatonContextInitializer 和相关的 GemfireTestBeanPostProcessor 用于开发人员测试涉及 Spring 和 GemFire(以及 Apache Geode)的目的。
希望这能给您一些想法,以减轻测试设置和运行时的痛苦。
干杯!