私のユニット/統合テストには、検索機能のテストが含まれています。
私の考えは、各テストの前に空の検索インデックスを用意することです。だから、私はsetup
メソッドのインデックスのすべての要素を削除しようとしています(それはGroovyコードです):
Client client = searchConnection.client
SearchResponse response = client.prepareSearch("item")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(termQuery('name', 'test')) //tried also matchAllQuery()
.setFrom(0).setSize(100).setExplain(false).execute().actionGet()
List<String> ids = response.hits.hits.collect {
return it.id
}
client.close()
client = searchConnection.client
ids.each {
DeleteResponse delete = client.prepareDelete("item", "item", it)
.setOperationThreaded(false)
.execute().actionGet()
}
client.close()
すべての削除を非同期で処理しているようですので、その後に追加Thread.sleep(5000)
しました。ご覧のとおり、接続を数回開閉しようとしていますが、役に立ちません。
時間がかかる場合や、削除に5秒以上かかる場合、追加したデータ(前回のテストから)が見つからない場合などの問題。統合テストが不安定になるのは最も厄介です。Thread.sleep()
可能な限りどこにでも置くことは、あまり良い解決策ではないように見えます。
最後の変更をコミットする方法、またはすべてのデータが書き込まれるまでロックする方法はありますか?