2011-07-27 10 views
5

我々は、生産solrインデックスのデータを制御する必要があり、新しい開発との互換性が必要です。理想的には、ローカルマシン上でインデックスを嘲笑し、それを使ってクエリを実行し、単体テストを作成してより迅速な繰り返しを求めるクエリを作成したいと考えています。モッキングとユニットテストSolrとLuceneインデックス

RamDirectory is used in another question同様のことをするには2年前から質問があります。このexampleは、(RamDirectoryの代わりにFSDirectoryを使用して)これを行うように見えます。これらはこの問題の正しいアプローチですか?これを行うより良い方法はありますか?

私たちのようなテストを書きたいのですが:

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

EDIT:その他の詳細:私たちの考えは、我々は、インデックスを構築するだろうだった

を、インデクサを必要とせずに文書を追加する簡単な方法を持っているし、システムの残りの部分、おそらくバージョン管理で保持できるローカルデータベースを除きます。以前はインデックスを作成していましたが、非互換性が発生したときに再生成しました。

インデックスを再作成するとオーバーヘッドが増え、インデクサーを嘲笑しても、インデクサーには検索可能なフィールドにデータを追加するなど、多くのデータ処理ロジックが含まれているため、 dbから)。私たちのインデクサーは外部のデータベースに接続するので、それもサポートする必要があります。オーバーヘッドがほとんどない上記のようなローカルテストデータベースを持つことができます。

テスト用のデータベースを取得したら、インデックスを作成してからsecond link aboveを削除する必要があります。問題は、テストのためにインデックスを実際にすばやく作成する方法、たとえば1000個のドキュメントのサイズになります。

これで問題は、ローカルのdbスキーマを本番スキーマと同期させておく必要があることです。プロダクションスキーマが頻繁に変更され、これが問題になります。私たちは、これを処理するのに十分な柔軟性を備えたテストインフラストラクチャを用意したいと考えています。今のようなアプローチは、遅くて他人を怒らせるたびにデータベースを再構築することです!

+0

あなたはどのデータベースを使用していますか?私の推測は、遅いバックアップとリストアで有名なMySQLです。私たちはそのためにPostgresqlに切り替えました。 SQLServerには、高速バックアップ/リストア機能もあります。 –

+0

Oracle、それはきわめて最適化されています – nflacco

+0

私たちはこれについて少し話していましたが、1つの可能性はデータベース上でSELECT *を実行し、ハッシュにロードしてローカルにスキーマの問題がないように思えます。カラムがほとんど削除されることはありません。ユニットテストは、カラムが見つからない/指定されていない(ドキュメントを作成する)場合にうまく機能します。 – nflacco

答えて

5

Solrを使用している場合、私は嘲笑したりエミュレートしても構いません(つまり、設定を変更しないでください)。

solrインデックスを設定する統合テストを作成してください。設定は通常のようにデータのインデックスを作成することです。あなたはおそらくあなたの開発者が自分自身のsolrを動かすことを望むでしょう。

solrが(私たちの環境では30秒未満で10万の文書を、...ボトルネックがデータベースからデータを引っ張っている)信じられないほど速く索引付けするので、私はそれほどスピードについて心配しません。

本当にあなたのモックインデックスは、solrにインデックスを付けるプロダクションデータの小さなサブセットでなければなりません(これは、@BeforeClassを使って各TestCaseクラスに対して一度だけ行うことができます)。 (編集内容に基づいて)

EDIT:

私は(私は他の人がそれを行う見ているかと)私たちはそれを行う方法を教えてくれます:

我々は、開発スキーマ/デシベルを持っており、プロダクションスキーマ/ db。開発者が作業をしているときは、単に「ビルドマシン」開発データベースのコピーを作成し、ローカルに復元します。このデータベースは本番データベースよりもはるかに小さく、テストに理想的です。あなたのプロダクションDBは、あなたの開発dbスキーマとはそれほど異なるものであってはなりません(小さな変更を行い、そうであればより頻繁にリリースします)。)

+0

通常はデータをインデックス化するのに2時間以上かかります何百万という記録があります!私たちのインデクサーには多くの処理ロジックがありますので、実行したくないです。生産データは必要ありません。さまざまな機能とパフォーマンスをテストするためのデータだけです。さらに、元の質問の「例」リンクと同様に、このデータセットを制御したいと考えています。この例では、事前に設定されているローカルインデックスをロードする 'LiaTestCase'が使用されています。ローカルDBからインデックスを構築することは有効ですか? – nflacco

関連する問題