2015-12-07 527 views
6

首先我使用Scala和sbt作爲我的應用程序。我如何單元測試/模擬ElasticSearch

我正在使用elastic4s庫的ElasticClient連接到我的ES實例。所以基本上我只需要能夠在我的單元測試中測試這些。比如只是驗證我的數據實際上是把它變成了ES和類似的東西。

會嘲笑ElasticSearch是最好的方式去或有一個更有效的方式來做到這一點?我將如何去解決這兩個問題?

我發現你可以用ElasticClient.local設置本地客戶端,但我似乎無法找到很多例子。我們希望與這個實現一起去,所以如果你知道如何使用它,我想知道它,但是如果有更好或更簡單的方法來完成這個工作。因爲elastic search is java

+1

讓我成爲純粹主義者,但*驗證我的數據實際上已經將它變成ES *不是單元測試,而是* integration *測試,因爲您正在檢查一個組件(代碼)與另一個組件(ES) –

回答

2

,你的代碼太(或兼容的)最好的辦法是找出一種方法來啓動彈性搜索「嵌入」 - 剛開始他們的服務器在你@Before方法和@After其關閉/清除它。

幸運的是,它好像已經有人有相同的想法 - https://orrsella.com/2014/10/28/embedded-elasticsearch-server-for-scala-integration-tests/

+1

此鏈接指向集成測試。有沒有單元測試的參考?謝謝 – Bob

+0

@Bob如果你需要嵌入式數據庫,我不確定測試是否仍然是單元。 – mulya

1

對於我們ElasticSearch測試中,我們使用一個永遠在線ElasticSearch的情況下我們的詹金斯生成服務器上,每個測試使用。對於本地測試,您必須啓動本地ElasticSearch。我們使用其餘的接口,而不是java api。

爲了使單元測試可並行化,我們使用全局同步名稱池(用於索引名稱)。每個測試都可以配置一個索引定義json,並且如果可以在髒(=已填充)索引上運行。一個小的測試超類(scalatest)將獲得池中的索引名稱。如果需要乾淨的索引,則刪除一個(可能)現有的索引並創建新的索引。如果測試接受髒索引,則檢查索引定義是否與配置的相同。否則,索引也會重新創建。

根據您的測試案例,這使您可以使用一些有時會重新創建的索引,並經常通過測試重用,從而加快測試執行速度。

1

在我自己的代碼中,我最近寫了一個小的Embeddable彈性搜索測試。它將內容存儲在磁盤上,然後可以在使用後刪除文件。我用它來運行我的各種elasticsearch單元測試。

它構成一個單節點elasticsearch集羣。該節點支持完整的elasticsearch API。

/** 
* A simple embeddable Elasticsearch server. This is great for integration testing and also 
* stand alone tests. 
* 
* Starts up a single ElasticSearch node and client. 
*/ 
public class EmbeddedElasticsearchServer 
{ 
    public EmbeddedElasticsearchServer(String storagePath) { 

    storagePath_ = storagePath; 
    ImmutableSettings.Builder elasticsearchSettings = ImmutableSettings.settingsBuilder() 
     .put("http.enabled", "false") 
     .put("path.data", storagePath_); 

    node_ = new NodeBuilder() 
     .local(true) 
     .settings(elasticsearchSettings.build()) 
     .node(); 

    client_ = node_.client(); 
    } 



    public Client getClient() { 
    return client_; 
    } 


    public void shutdown() 
    { 
    node_.close(); 
    } 

    public void deleteStorage() throws IOException 
    { 
    File storage = new File(storagePath_); 

    if(storage.exists()) 
    { 
     FileUtils.deleteDirectory(storage); 
    } 

    } 

    private Client client_; 
    private Node node_; 
    private String storagePath_; 
} 

要使用它,只需調用getClient,然後你可以使用Elasticsearch的Java API就好了。

+2

真的這些都是綜合測試。 – Jon