用于多模块项目测试的 Gemfire Junit 花费的时间太长

Gemfire Junit for multi module project tests are taking too long

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

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

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

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

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

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

谢谢

在某些情况下,您无法避免它,特别是如果您弄脏了 Spring 上下文或您的 GemFire 实例,以至于在您的测试中 运行 后续测试时会导致冲突套房。

即在您编写的每个新测试 class and/or 测试用例中尝试管理 isolation/separation 可能需要更多工作,必须跟踪哪些测试接触了什么(例如区域),而不是也许只是每个测试 class (或者在更坏的情况下,每个测试用例)重新启动 GemFire 实例。例如,考虑 OQL 查询由于先前测试的操作或类似性质的原因而产生意外结果。

Spring Data GemFire 测试套件非常相似,因为它启动 GemFire 实例并停止它们,每个测试用例,或者在大多数情况下,每个测试 class。带有测试(900 多个测试)的整个构建平均在 ~15 分钟内运行。 GemFire 自己的测试套件(单元 + integration/distributed 测试等)运行大约 8-12 小时,具体取决于您 "parallelize" 测试的效率,o.O

我坚信 10 分钟构建,但 GemFire 是一个复杂的野兽,编写测试,尤其是分布式测试,需要仔细规划。

Spring Data GemFire 中的大部分测试都是对等缓存应用程序(即测试 JVM 嵌入了 GemFire 实例,例如...RegionDataPolicyShortcutsIntegrationTest and it's associated Spring context configuration file)。

我发现,如果您设置一些 GemFire 属性(例如将日志级别设置为 "warning",特别是将 mcast-port 设置为 0),您可以大大减少运行时间,for example .将 mcast-port 设置为 0 会设置一个 "loner" GemFire 节点并显着缩短启动时间。

还有其他 Spring Data GemFire 测试,它们是 "ClientCaches",它们甚至会生成一个带有 GemFire 服务器进程的单独 JVM 来测试 client/server 交互。您可以想象那些花费更长的时间才能达到 start/stop,事实上他们确实如此。例如,ClientCacheFunctionExecutionWithPdxIntegrationTest and the associated Spring context configuration files... (server) and of course the (client)。请注意,在本例中测试的是 GemFire ClientCache VM。

现在,您或许可以找到在某些测试中使用模拟的方法。许多 Spring Data GemFire 测试使用 org.springframework.data.gemfire.test 包中提供的模拟来模拟 SDG 和 GemFire 之间的交互。

SDG 中使用模拟的测试 classes 声明了一种特殊的 Spring ApplicationContextInitializer,就像在 GemfireTemplateTest, which uses the SDG GemfireTestApplicationContextInitializer. The real magic is in the GemfireTestBeanPostProcessor 中一样。如果你跟踪代码,你就会明白。

我希望及时将这些模拟形式化一些,并使用这些模拟创建一个单独的项目,GemfireTestApplicatonContextInitializer 和相关的 GemfireTestBeanPostProcessor 用于涉及 Spring 和 GemFire(以及 Apache Geode)的开发人员测试目的。

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

干杯!