2015-12-07 2 views
6

Прежде всего, я использую Scala и sbt для своего приложения.Как выполнить модульный тест/mock ElasticSearch

Я использую ElasticClient библиотеки flexible4s для подключения к моему экземпляру ES. Поэтому в основном я просто должен быть в состоянии проверить их в своих модульных тестах. Например, просто проверка того, что мои данные фактически превратили его в ES и тому подобное.

Будет ли насмехаться над ElasticSearch лучшим способом для этого или есть более эффективный способ сделать это? И как мне обойтись?

Я обнаружил, что вы можете настроить локальный клиент с ElasticClient.local, но я не могу найти много примеров. Мы хотели бы пойти с этой реализацией, поэтому, если вы знаете, как использовать это, я бы хотел услышать об этом, но если есть лучшие или более простые способы завершить это, что сработает.

+1

Позвольте мне быть пуристом, но * проверка того, что мои данные фактически были внесены в ES *, не является модульным тестом, это * интеграция * test, потому что вы проверяете, насколько хорошо один компонент (ваш код) играет с другим (ES) –

ответ

2

так elastic search is java и ваш код слишком (или совместимый) наилучший подход был бы выяснить способ загрузки упругую поиска «встраиваемый» - только начинают свой сервер в вашем методе @Before и закрыть его/очистить его в @After ,

к счастью для вас, похоже, кто-то уже имел ту же самую идею - https://orrsella.com/2014/10/28/embedded-elasticsearch-server-for-scala-integration-tests/

+1

Эта ссылка указывает на интеграционный тест. Есть ли ссылки на модульные тесты? Спасибо – Bob

+0

@Bob Я не уверен, что тест все еще является единицей, если вам нужна встроенная база данных. – mulya

1

Для наших тестов ElasticSearch мы используем всегда на экземпляре ElasticSearch на нашем Дженкинс сервере сборки, что каждый тест использует. Для местных тестов вам необходимо запустить локальный ElasticSearch. Мы используем интерфейс rest, а не java api.

Чтобы сделать модульные тесты параллельными, мы используем глобальный, синхронизированный пул имен (для имен индексов). Каждый тест может настроить определение индекса json, и если он нормально работает на грязном (= уже заполненном) индексе. Небольшой тестовый суперкласс (scalatest) будет получать имя индекса из пула. Если требуется чистый индекс, (возможно) существующий будет удален, а новый будет создан. Если тест принимает грязный индекс, проверяется, совпадает ли определение индекса с настроенным. Если нет, индекс также будет заново создан.

В зависимости от ваших тестовых примеров, это позволяет вам перейти с несколькими индексами, которые будут воссоздаваться раз в то время, и часто используются повторно с помощью тестов, ускоряя выполнение теста.

1

В моем собственном коде я недавно написал небольшой вставной эластичный поиск для тестирования. Он хранит вещи на диске, а затем может удалять файлы после использования. Я использую это, чтобы запустить мой различный тестовый тест elasticsearch.

Он создает кластер для поиска уникальных узлов. Этот узел поддерживает полный 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_; 
} 

Чтобы использовать его, просто вызовите getClient, а затем вы можете просто использовать API Java Elasticsearch.

+2

Действительно, это тесты для интеграции. – Jon

Смежные вопросы