2011-07-27 34 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