0

我有一个项目,它由几个模块组成,每个模块都包含它的区域和存储库类。

问题在于每个模块gfe:cache在它自己的 spring 上下文中都有自己的 Gemfire。

所以我的问题是,当我运行我的mvn test每个模块时,它都会启动它自己的 Gemfire,并在测试后关闭它,这使得我的测试需要将近 10 分钟,而 Gemfire 的每个实例都需要 40 秒才能启动。

所以我想知道避免这种情况的最佳方法是什么?

我正在考虑让父模块(包含所有存储库和区域)持有和创建区域,然后在子模块上使用查找来使用它们。但如果我只想运行其中一个模块测试,我还需要单独的模块由它们运行。

有没有办法使用查找,如果它失败创建具有相同区域查找的缓存?或者让缓存创建一次(第一次测试)并在其他上下文启动而不是关闭时将区域添加到其中?

谢谢

4

1 回答 1

3

在某些情况下,您无法避免它,特别是如果您弄脏 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)的目的。

希望这能给您一些想法,以减轻测试设置和运行时的痛苦。

干杯!

于 2015-06-15T17:25:50.920 回答