Skip to content

dbfixtures/pytest-elasticsearch

https://raw.githubusercontent.com/dbfixtures/pytest-elasticsearch/master/logo.png

pytest-elasticsearch

Latest PyPI version Wheel Status Supported Python Versions License

What is this?

This is a pytest plugin that enables you to test your code that relies on a running Elasticsearch search engine. It allows you to specify fixtures for Elasticsearch process and client fixtures.

Project Architecture Diagram

How to use

Warning

This plugin requires at least version 8.0 of elasticsearch to work.

Prerequisites

Install Elasticsearch 8.x or newer following the official documentation: https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html

Note

Elasticsearch enables security features by default. If your instance requires authentication or TLS, configure it accordingly (or disable security for local testing per Elasticsearch docs).

Quickstart: first test

  1. Install the plugin and your test dependencies (as you normally do for your project).
  2. Ensure Elasticsearch is available (local install or container).
  3. Create a test that uses the built-in fixture:
def test_can_connect(elasticsearch):
    assert elasticsearch.info()
  1. Run your tests:
pytest

The plugin contains three fixtures:

  • elasticsearch - a client fixture that has function-scope, and which cleans Elasticsearch at the end of each test.
  • elasticsearch_proc - a session-scoped fixture that starts an Elasticsearch instance at its first use and stops at the end of the tests.
  • elasticsearch_nooproc - a no-process fixture that holds connection data to an already running Elasticsearch instance

Simply include one of these fixtures in your test fixture list.

You can also create additional Elasticsearch client and process fixtures if you need to:

from pytest_elasticsearch import factories

elasticsearch_my_proc = factories.elasticsearch_proc(port=None)
elasticsearch_my = factories.elasticsearch('elasticsearch_my_proc')

Note

Each Elasticsearch process fixture can be configured in a different way than the others through the fixture factory arguments.

Note

Managed Elasticsearch processes use tmp_path_factory for their data paths and are cleaned up automatically. When using elasticsearch_nooproc, the running instance (and its data directories) are managed by you.

Connecting to already existing Elasticsearch service

Some projects use already running Elasticsearch servers (e.g., in Docker). To connect to them, use the elasticsearch_nooproc fixture.

es_external = factories.elasticsearch('elasticsearch_nooproc')

Configure the host/port to match your running Elasticsearch instance using the options below. If not provided, the noprocess fixture defaults to port 9200.

Configuration

You can define your settings in three ways: fixture factory arguments, command line options, and pytest.ini configuration options. You can pick which you prefer, but remember that these settings are handled in the following order:

  1. Fixture factory argument
  2. Command line option
  3. Configuration option in your pytest.ini file
Configuration options
Elasticsearch option Fixture factory argument Command line option pytest.ini option Noop process fixture Default
Elasticsearch executable executable --elasticsearch-executable elasticsearch_executable   /usr/share/elasticsearch/bin/elasticsearch
host host --elasticsearch-host elasticsearch_host host 127.0.0.1
port port --elasticsearch-port elasticsearch_port port (default 9200) random (free port)
Free port search count port_search_count --elasticsearch-port-search-count elasticsearch_port_search_count
5
Elasticsearch cluster name cluster_name --elasticsearch-cluster-name elasticsearch_cluster_name
elasticsearch_cluster_<port>
index storage type index_store_type --elasticsearch-index-store-type elasticsearch_index_store_type
mmapfs
network publish host network_publish_host --elasticsearch-network-publish-host elasticsearch_network_publish_host
127.0.0.1
Transport TCP port transport_tcp_port --elasticsearch-transport-tcp-port elasticsearch_transport_tcp_port
random

Example usage:

  • pass it as an argument to your own fixture

    elasticsearch_proc = factories.elasticsearch_proc(
        cluster_name='awsome_cluster')
  • specify your cluster name as elasticsearch_cluster_name in your pytest.ini file.

    To do so, put a line like the following under the [pytest] section of your pytest.ini:

    [pytest]
    elasticsearch_cluster_name = awsome_cluster

Known issues

It might happen that the process can't be started due to lack of permissions. The files that the user running tests must have access to are:

  • /etc/default/elasticsearch

Make sure you either run tests as a user who has access to these files, or grant the user proper permissions or add them to the proper groups.

In CI, we install Elasticsearch from tar/zip archives, which do not set up additional permission restrictions, so it's not a problem on the CI/CD.

Package resources

About

This is a pytest plugin that enables you to test your code that relies on a running Elasticsearch search engine. It allows you to specify fixtures for Elasticsearch process and client.

Topics

Resources

License

LGPL-3.0, GPL-3.0 licenses found

Licenses found

LGPL-3.0
COPYING.lesser
GPL-3.0
COPYING

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages