2016-04-16 5 views
1

私はelasticsearchを使用するノードプロジェクトで作業しています。私のテストチェーンは、ギャルプ、モカ、チャイ、サイロンです。私は一貫して動作するように私の統合テストを受けることに苦労しています。私はデータベースにサンプルデータをロードし、その上でいくつかのテストを実行したいと思います。読み込み中のドキュメントは、それらを使用するテストが実行されるまでにインデックスが作成されないため、問題が発生していると思います。mochaとの統合テストを行うときにelasticsearchのインデックスタイミングを処理するには

私は、次の手順を実行して、この周りに働いてきた:

before(function (done) { 
     testData.simpleLoadData(100, 2000); 
     setTimeout(function() { 
      done(); 
     }, 5000); 
    }); 

これはローカルで正常に動作し、それはトラヴィスに時折動作します。タイマーを10000にアップすると、一般に両方の場所で機能します。

テストコードのsetTimeoutsに頼らずにこの方法がありますか?手動でタイミングを処理すると、私は少し不気味です。

タイムアウトを手作業で処理していますが、私には最良の選択肢がありますか、それとも良い方法がありますか?

注:これらは統合テストであり、明示的に外部依存関係を使用したいと考えています。私はすでにデータベースに依存していない単体テストを持っています。

答えて

1

ここでは、シャード割り当てとリフレッシュサイクルの2つのことが考えられます。

新しいインデックスを作成すると、最初の問題が発生する可能性があります。 Create Index APIは、マスタがリクエストを確認して作成プロセスを開始するとすぐに200 OKを返します。しかし、実際のシャード割り当ては、バックグラウンドで非同期的に発生します。また、インデックスが完全に稼動している間に統合テストが実行されることがあります。これにより、ドキュメントのインデックスを作成しようとするとエラーが発生します。

これを堅牢にする最も簡単な方法は、インデックスを作成してwait_for_status=green(または、複製を使用するかどうかによっては黄色)でHealth APIを呼び出すことです。この呼び出しは、インデックスが完全に割り当てられるまでブロックされます。

次の問題は、検索のほぼリアルタイムの側面に関連しています。デフォルトでは、Elasticsearchは1秒ごとに検索インデックスを更新します。これは統合テストには時間がかかり過ぎる可能性があり、ドキュメントの索引作成は可能ですが、テストの実行時には検索できません。

これを修正するには、すべてのドキュメントにインデックスを作成し、ターゲットインデックスのRefresh APIを呼び出します。この呼び出しが返ってくると、ドキュメントは「ライブ」で検索可能になります。

+0

したがって、リフレッシュは完了するまでブロックされますか?私は実際に私のストレージオブジェクトにリフレッシュメソッドを追加しました。ありがとう、私は今夜それを混乱させ、報告する。 – skarface

+1

@skarfaceうん、それはブロックされます! :) – Zach

+0

関連コードはこちら:http://pastebin.com/9GVWptpN refreshIndicesの終了後にデータが利用できないようです。まだノードにかなり新しい、私が何か基本的なものが欠けている場合はお詫び – skarface

関連する問題