2015-12-07 13 views
6

Per prima cosa sto usando Scala e sbt per la mia applicazione.Come faccio a testare/scherzare ElasticSearch

Sto utilizzando ElasticClient della libreria elastic4s per connettersi alla mia istanza ES. Quindi in pratica ho solo bisogno di poterli testare nei miei test unitari. Ad esempio, semplicemente verificando che i miei dati lo abbiano effettivamente trasformato in ES e cose del genere.

Prenderebbe in giro ElasticSearch come il modo migliore per andare o c'è un modo più efficiente per farlo? E come andrei su uno di questi?

Ho trovato che è possibile impostare un client locale con ElasticClient.local ma non riesco a trovare molti esempi. Vorremmo andare con questa implementazione quindi se sapete come usarlo mi piacerebbe sentirlo, ma se ci sono modi migliori o più semplici per completare ciò che potrebbe funzionare.

+1

Lasciami essere purista, ma * verificare che i miei dati siano effettivamente passati a ES * non è un test di unità, è un test di * integrazione perché stai controllando quanto bene un componente (il tuo codice) gioca con un altro (ES) –

risposta

2

dal elastic search is java e il codice è troppo (o compatibile) l'approccio migliore sarebbe trovare un modo per avviare elasticsearch "embeddable" - solo iniziare il loro server nel vostro metodo di @Before e spegnerlo/chiaro in @After .

fortunatamente per voi, sembra che qualcuno ha già avuto la stessa idea - https://orrsella.com/2014/10/28/embedded-elasticsearch-server-for-scala-integration-tests/

+1

questo collegamento punta al test di integrazione. C'è qualche riferimento per i test unitari? Grazie – Bob

+0

@Bob Non sono sicuro che il test sia ancora un'unità se hai bisogno di un database incorporato. – mulya

1

Per le nostre prove abbiamo elasticsearch utilizzare un always-on istanza di elasticsearch sul nostro server Jenkins costruire che utilizza ogni test. Per i test locali, devi attivare il tuo ElasticSearch locale. Usiamo l'interfaccia rest, non la java api.

Per rendere parallelizzabili i test di unità, viene utilizzato un pool di nomi globale e sincronizzato (per i nomi di indice). Ogni test può configurare una definizione dell'indice json e, se è ok, può essere eseguita su un indice dirty (= già riempito). Una piccola superclasse di prova (scalatest) acquisterà un nome di indice dal pool. Se è richiesto un indice pulito, uno (forse) esistente viene eliminato e il nuovo creato. Se il test accetta un indice dirty, viene controllato se la definizione dell'indice è uguale a quella configurata. In caso contrario, l'indice viene anche ricreato.

A seconda dei casi di test, questo consente di andare con alcuni indici che verranno ricreati una volta ogni tanto, e di essere riutilizzati spesso dai test, accelerando l'esecuzione del test.

1

Nel mio codice, di recente ho scritto una piccola ricerca per test da elastico incorporabile. Memorizza le cose su disco e quindi può eliminare i file dopo l'uso. Lo uso per eseguire i miei vari test dell'unità elasticsearch.

Crea un cluster elasticsearch a nodo singolo. Questo nodo supporta l'intera API elasticsearch.

/** 
* 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_; 
} 

Per usarlo, basta chiamare getClient e quindi è possibile utilizzare l'API Java elasticsearch bene.

+2

Veramente questi sono test di integrazione. – Jon