2011-07-27 29 views
5

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

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个文档的大小。

的问题,这是我们接下来需要保持我们的本地数据库架构同步的生产模式。生产模式经常变化,这是一个问题。我们希望有一个足够灵活的测试基础架构来处理这个问题 - 到目前为止,这种方法只是重建数据库,而且每次都很慢并且会让其他人感到厌烦!

+0

你正在使用什么数据库......我的猜测是它的MySQL,它在慢速备份和恢复方面声名狼借。因此,我们切换到Postgresql。 SQLServer也具有快速的备份/恢复功能。 –

+0

甲骨文,它是相当优化 – nflacco

+0

我们今天谈论这一点,有一种可能性似乎只对数据库执行SELECT *并将其加载到散列中,以便在本地从来没有模式问题。列几乎永远不会被删除,并且如果列缺失/未指定(用于创建文档),单元测试应该可以正常工作。 – nflacco

回答

5

如果你正在使用Solr,我甚至不会打扰嘲笑或模拟(即不改变它的配置)。

而是编写一个集成测试来设置您的solr索引。设置只是为了像通常那样对数据进行索引。您可能会希望开发人员运行自己的solr。

我不会担心速度问题,因为solr索引的速度令人难以置信(对于我们的环境,小于30秒内100,000个文档......实际上瓶颈是从数据库中提取数据)。

所以真的是你的模拟指数应该只是生产数据的一小部分,你将索引Solr的(你可以用@BeforeClass每个TestCase类做一次)。

EDIT(根据您的编辑):

我会告诉你我们是怎么做的(我怎么看到别人做):

我们有一个发展模式/ db和生产模式/数据库。当开发人员正在处理这些内容时,他们只需制作“构建机器”开发数据库的副本并在本地进行恢复。这个数据库比生产数据库小得多,是测试的理想选择。您的生产数据库不应该与您的开发数据库模式明显不同(如果是这种情况,请进行较小的更改并更频繁地发布)。)

+0

像我们平常那样对数据进行索引需要2个小时,因为我们有数百万条记录!我们的索引器有很多处理逻辑,所以我们不想运行它。我们不需要生产数据;只是数据来测试各种功能和性能。此外,我们想要控制这个数据集,类似于原始问题中的'示例'链接。这个例子使用了'LiaTestCase'来加载已经预先填充的本地索引。从本地数据库建立索引是否可行? – nflacco