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

时间:2015-06-15 11:34:55

标签: gemfire spring-data-gemfire

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

问题在于每个模块都有自己的Gemfire gfe:cache自己的春天语境。

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

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

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

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

由于

1 个答案:

答案 0 :(得分:3)

在某些情况下,你无法避免它,特别是如果你在测试套件中运行后续测试时,会破坏Spring上下文或GemFire实例会导致冲突。

即。尝试在每个新的测试类和/或你编写的测试用例中管理隔离/分离可能需要做更多的工作,不得不跟踪测试触及的是什么(例如Region),而不是每个测试类重新启动GemFire实例(或者在更坏的情况下,每个测试用例)。例如,考虑一个OQL查询由于先前测试的操作或某种性质而引入意外结果。

Spring Data GemFire测试套件非常相似,它启动GemFire实例并根据每个测试用例或大多数情况下每个测试类停止它们。整个构建测试(900多个测试)在约15分钟内平均运行。 GemFire自己的测试套件(单元+集成/分布式测试等)在大约8-12小时内运行,具体取决于您可以“并行化”测试的效率,o.O

我坚信10分钟的构建,但GemFire是一个复杂的野兽,编写测试,特别是分布式测试,有效地进行了仔细的规划。

Spring Data GemFire中的大多数测试都是对等缓存应用程序(即测试JVM嵌入了GemFire实例,例如...... RegionDataPolicyShortcutsIntegrationTest并且它与Spring context configuration file相关联。)

我发现如果你设置了几个GemFire属性(例如将log-level设置为“warning”,特别是mcast-port设置为0),你可以大大减少运行时for example。将mcast-port设置为0会设置一个“孤独的”GemFire节点,并大大缩短启动时间。

还有其他Spring Data GemFire测试,它们是“ClientCaches”,它甚至产生一个带有GemFire Server进程的独立JVM来测试客户端/服务器交互。你可以想象那些需要更长时间才能开始/停止的人,事实上他们确实这样做了。例如,ClientCacheFunctionExecutionWithPdxIntegrationTest和关联的Spring上下文配置文件......(server),当然还有(client)。注意,在这种情况下,测试是GemFire ClientCache VM。

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

SDG中使用mocks的测试类在GemfireTemplateTest中使用SDG GemfireTestApplicationContextInitializer声明了一种特殊类型的Spring ApplicationContextInitializer。真正的魔力虽然在GemfireTestBeanPostProcessor。如果你跟踪代码,你就会明白这一点。

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

希望这能为您提供一些缓解测试设置和运行时痛苦的想法。

干杯!