【问题标题】:Mocking and Unit Testing Solr and Lucene Index模拟和单元测试 Solr 和 Lucene 索引
【发布时间】:2011-07-27 19:43:26
【问题描述】:

我们需要控制生产 solr 索引中的数据,并且我们需要它与新开发兼容。理想情况下,我们希望在本地机器上模拟索引,使用它进行查询 solr 并编写单元测试来查询它以加快迭代速度。

RamDirectory is used in another question 做类似的事情,但问题是从 2 年前开始的。这个example 似乎就是这样做的(使用 FSDirectory 而不是 RamDirectory)。这些是解决这个问题的正确方法吗?有没有更好的方法来做到这一点?

我们想编写如下测试:

setup mock index;
query mock index;
assert(stuff that should be true);
teardown mock index;

编辑:其他详细信息:

我们的想法是我们会建立一个索引,有一种简单的方法来添加文档,而不需要索引器和系统的其余部分,除了我们可以保留在版本控制中的本地数据库。过去我们生成一个索引,当出现不兼容时,我们重新生成它。

如果我们重新索引,我们会增加很多开销,并且模拟索引器似乎不是一个好的选择,因为我们的索引器包含大量数据处理逻辑(比如将数据添加到来自一个分贝)。我们的索引器连接到外部数据库,因此我们也需要支持它。我们可以有一个如上所述的本地测试数据库,它几乎没有开销。

一旦我们有一个测试数据库,我们需要建立一个索引,然后我们可以离开second link above。问题变成了我们如何真正快速地构建索引以进行测试,比如 1000 个文档。

问题是我们需要保持本地数据库架构与生产架构同步。生产模式经常变化,这是一个问题。我们希望有一个足够灵活的测试基础架构来处理这个问题——目前的方法是每次都重建数据库,这很慢而且会惹恼其他人!

【问题讨论】:

  • 您使用的是什么数据库...我猜是它的 MySQL,它因备份和恢复速度慢而臭名昭著。因此,我们切换到 Postgresql。 SQLServer 还具有快速备份/恢复功能。
  • 甲骨文,它已经很优化了
  • 我们今天讨论了这个问题,一种可能性似乎只是在数据库上执行 SELECT * 并将其加载到哈希中,这样本地就不会出现架构问题。列几乎永远不会被删除,如果列丢失/未指定(用于创建文档),单元测试应该可以正常工作。
  • 是我还是 oracle 恢复也需要很长时间?
  • 哈哈,幸运的是,我并没有以任何方式与 db 端有任何关系,无论好坏,它都保持预言机(并且出于我无法控制的原因)

标签: unit-testing testing lucene solr ramdirectory


【解决方案1】:

如果您使用的是 Solr,我什至不会为模拟或模拟而烦恼(即不要更改其配置)。

改为编写一个集成测试来设置您的 solr 索引。设置将只是像往常一样索引数据。您可能希望您的开发人员运行他们自己的 solr。

我不会太担心速度,因为 solr 索引速度非常快(对于我们的环境来说,不到 30 秒就可以在 30 秒内找到 100,000 个文档……事实上,瓶颈正在从数据库中提取数据)。

所以实际上,您的模拟索引应该只是您将索引到 solr 中的生产数据的一小部分(您可以使用 @BeforeClass 为每个 TestCase 类执行一次)。

编辑(基于您的编辑):

我会告诉你我们是如何做到的(以及我看到其他人是如何做到的):

我们有一个开发模式/db 和生产模式/db。当开发人员在工作时,他们只需复制“构建机器”开发数据库并在本地恢复它。该数据库比生产数据库小得多,非常适合测试。您的生产数据库不应与您的开发数据库架构有太大不同(如果是这种情况,请进行较小的更改并更频繁地发布。)

【讨论】:

  • 像往常一样为数据编制索引需要 2 多个小时,因为我们有数百万条记录!我们的索引器有很多处理逻辑,所以我们不想运行它。我们不需要生产数据;只是测试各种功能和性能的数据。此外,我们想控制这个数据集,类似于原始问题中的“示例”链接。此示例使用“LiaTestCase”加载已预先填充的本地索引。从本地数据库构建索引是否可行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多