Подтвердить что ты не робот

Как написать тест для пользовательского плагина Elasticsearch?

Я создаю пользовательский Elasticsearch. Теперь я хочу написать тест для этого плагина. Мои ожидания состояли в том, что я мог запустить встроенный экземпляр Elasticsearch, правильно настроить его и затем провести некоторое тестирование (индексировать некоторые документы, затем запросить его)

Проблема в том, что я не мог правильно настроить свой плагин

Пользовательский код плагина анализирует запрос JSON и настраивает некоторые объекты для последующего использования:

public class CustomQueryParserPlugin extends AbstractPlugin {
    public static final String PLUGIN_NAME = "custom_query";
    private final Settings settings;

    @Inject
    public CustomQueryParserPlugin (Settings settings) {
        this.settings = settings;
    }

    @Override
    public String name() {
        return PLUGIN_NAME;
    }

    @Override
    public String description() {
        return "custom plugin";
    }

    public void onModule(IndicesQueriesModule module) {
        module.addQuery(new CustomQueryParser(settings));
    }
}

Тестовый код:

public class CustomParserPluginTest extends ElasticsearchSingleNodeTest {

    private static Node newNode() {
        final Settings settings = ImmutableSettings.builder()
                .put(ClusterName.SETTING, nodeName())
                .put("node.name", nodeName())
                .put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1)
                .put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
                .put(EsExecutors.PROCESSORS, 1) // limit the number of threads created
                .put("http.enabled", false)
                .put("plugin.types", CustomParserPlugin.class.getName())
                .put("path.plugins", pathToPlugin)
                .put("index.store.type", "ram")
                .put("config.ignore_system_properties", true) // make sure we get what we set :)
                .put("gateway.type", "none").build();
        Node build = NodeBuilder.nodeBuilder().local(true).data(true).settings(
                settings).build();
        build.start();
        assertThat(DiscoveryNode.localNode(build.settings()), is(true));
        return build;
    }


    @Test
    public void jsonParsing() throws URISyntaxException {
        final Client client = newNode().client();
        final SearchResponse test = client.prepareSearch("test-index").setSource(addQuery()).execute().actionGet();
    }

    private String addQuery() {
         return "{"match_all":{"boost":1.2}}"
    }

Я попробовал несколько значений для pathToPlugin, но ничего не работает хорошо, потому что запрос JSON всегда дает мне исключение:

QueryParsingException[[test-index] No query registered for [custom_query]];

Вся документация, которую я мог найти, заключалась в установке плагинов и тестировании их на некоторых локальных установках Elasticsearch.

Что я здесь делаю неправильно? Есть ли какая-либо документация или примеры таких тестов?

UPD. Вот репо с извлеченным кодом CustomQueryParserPlugin - https://github.com/MysterionRise/es-custom-parser

Может быть, в разделе инициализации в тесте мне нужно создать в индексе памяти?

4b9b3361

Ответ 1

Чтобы написать тесты для вашего плагина, вы можете использовать Elasticearch Cluster Runner. Для справки проверьте, как MinHash Plugin написал тест.

UPDATE:

Я изменил класс CustomParserPluginTest для использования Runner Cluster Runner:

import static org.codelibs.elasticsearch.runner.ElasticsearchClusterRunner.newConfigs;
import java.util.Map;
import junit.framework.TestCase;
import org.codelibs.elasticsearch.runner.ElasticsearchClusterRunner;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.ImmutableSettings.Builder;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.get.GetField;
import org.junit.Assert;
import org.elasticsearch.action.search.SearchResponse;
import static org.hamcrest.core.Is.is;

public class CustomParserPluginTest extends TestCase {

    private ElasticsearchClusterRunner runner;

    @Override
    protected void setUp() throws Exception {
        // create runner instance
        runner = new ElasticsearchClusterRunner();
        // create ES nodes
        runner.onBuild(new ElasticsearchClusterRunner.Builder() {
            @Override
            public void build(final int number, final Builder settingsBuilder) {
            }
        }).build(newConfigs().ramIndexStore().numOfNode(1));

        // wait for yellow status
        runner.ensureYellow();
    }

    @Override
    protected void tearDown() throws Exception {
        // close runner
        runner.close();
        // delete all files
        runner.clean();
    }

    public void test_jsonParsing() throws Exception {
        final String index = "test_index";

        runner.createIndex(index, ImmutableSettings.builder().build());
        runner.ensureYellow(index);

        final SearchResponse test = runner.client().prepareSearch(index).setSource(addQuery()).execute().actionGet();
    }

    private String addQuery() {
        return "{\"match_all\":{\"boost\":1.2}}";
    }
}

Я создал файл es-plugin.properties (pluginrootdirectory\src\main\resources) со следующим содержимым, которое заставит экземпляр elasticsearch загрузить плагин:

plugin=CustomQueryParserPlugin

Когда вы запустите этот тест, вы увидите на выходе, что только что созданное вложение elasticsearch загрузило плагин.

[2015-04-29 19: 22: 10,783] [INFO] [org.elasticsearch.node] [ Node 1] версия [1.5.0], pid [34360], сборка [5448160/2015-03-23T14: 30: 58Z] [2015-04-29 19: 22: 10,784] [INFO] [org.elasticsearch.node] [Node 1] initializin g... [2015-04-29 19: 22: 10,795] [INFO ] [org.elasticsearch.plugins] [Node 1] загружен [ custom_query], сайты [] [2015-04-29 19: 22: 13,342] [INFO] [org.elasticsearch.node] [ Node 1] инициализируется

[2015-04-29 19: 22: 13,342] [INFO] [org.elasticsearch.node] [ Node 1] начало...

Надеюсь, что это поможет.