提问者:小点点

用于多模块项目测试的Gemfire Junit耗时太长


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

这样做的问题是每个模块在它自己的Spring上下文上都有自己的Gemfiregfe: cache

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

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

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

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

谢啦


共1个答案

匿名用户

在某些情况下,您无法避免它,尤其是如果您弄脏了Spring上下文或GemFire实例,从而导致在测试套件中运行后续测试时发生冲突。

也就是说,在你编写的每个新的测试类和/或测试用例中尝试管理隔离/分离可能会有更多的工作,必须跟踪什么测试触及什么(例如区域),而不是仅仅重启每个测试类(或者在更糟糕的情况下,每个测试用例)的GemFire实例。例如,考虑一个OQL查询,由于以前的测试操作或类似性质的东西而引入意想不到的结果。

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

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

Spring Data GemFire中的大多数测试都是对等缓存应用程序(即测试JVM嵌入了GemFire实例,例如…

我发现,如果您设置一些GemFire属性(例如将日志级别设置为“警告”,特别是将mcast-port设置为0),您可以大大减少运行时间。将mcast-port设置为0会设置一个“孤独”的GemFire节点并大大缩短启动时间。

还有其他的Spring Data GemFire测试,它们是"ClientCache",甚至会生成一个单独的JVM,用一个GemFire Server进程来测试客户端/服务器的交互。你可以想象那些需要更长时间才能启动/停止的测试,事实上它们确实需要。例如,ClientCacheFunctionExecutionWellPdxIntegrationTest和相关的Spring上下文配置文件…(服务器),当然还有(客户端)。注意,在这种情况下,测试是GemFire ClientCacheVM。

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

SDG中使用模拟的测试类声明了一种特殊的Spring ApplicationContextFirst alizer,就像在Gemfire TemplateTest中一样,它使用SDG Gemfire TestApplicationContextFirst alizer。不过,真正的魔力在于Gemfire TestBeanPostProcator。如果你通过跟踪代码,你会得到这个想法。

随着时间的推移,我希望对这些模拟进行一些形式化,并使用这些模拟创建一个单独的项目,为开发人员测试涉及Spring和GemFire(以及Apache Geode)的目的,创建一个与这些模拟相关的Gemfire TestApplicatonContextFirst alizer和相关的Gemfire TestBeanPostProcator。

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

干杯!