Major test refactor.

- removed the git submodule, relying on the elasticsearch repo existing
  outside of this one
- modified the run_tests.py script to inspect currently running
  elasticsearch and try and checkout the exact SHA used to build the
  server
- removed the option of starting out own elasticsearch server
- fixed travis.yml to reflect the changed situation
- added a README file to the test suite explaining all the options
This commit is contained in:
Honza Král
2014-01-18 21:08:15 +01:00
parent 5aecde0586
commit dfb939d878
7 changed files with 123 additions and 87 deletions
+7 -6
View File
@@ -21,18 +21,19 @@ matrix:
env: TEST_ES_CONNECTION=ThriftConnection
install:
- wget -O - http://s3-us-west-2.amazonaws.com/build.elasticsearch.org/origin/master/nightly/JDK6/elasticsearch-latest-SNAPSHOT.tar.gz | tar xz -C /tmp
- /tmp/elasticsearch-1.0.0.RC1-SNAPSHOT/bin/plugin -install elasticsearch/elasticsearch-transport-memcached/1.6.0
- /tmp/elasticsearch-1.0.0.RC1-SNAPSHOT/bin/plugin -install elasticsearch/elasticsearch-transport-thrift/1.6.0
- git submodule init
- mkdir /tmp/elasticsearch
- wget -O - http://s3-us-west-2.amazonaws.com/build.elasticsearch.org/origin/master/nightly/JDK6/elasticsearch-latest-SNAPSHOT.tar.gz | tar xz --directory=/tmp/elasticsearch --strip-components=1
- /tmp/elasticsearch/bin/plugin -install elasticsearch/elasticsearch-transport-memcached/2.0.0.RC1
- /tmp/elasticsearch/bin/plugin -install elasticsearch/elasticsearch-transport-thrift/2.0.0.RC1
- git clone https://github.com/elasticsearch/elasticsearch.git ../elasticsearch
- pip install coveralls
- pip install .
before_script:
- /tmp/elasticsearch-1.0.0.RC1-SNAPSHOT/bin/elasticsearch -d -D es.path.data=/tmp -D es.gateway.type=none -D es.index.store.type=memory -D es.discovery.zen.ping.multicast.enabled=false
- /tmp/elasticsearch/bin/elasticsearch -d -D es.path.data=/tmp -D es.gateway.type=none -D es.index.store.type=memory -D es.discovery.zen.ping.multicast.enabled=false
script:
- TEST_ES_SERVER=localhost python setup.py test
- python setup.py test
after_success:
- coveralls
+2 -7
View File
@@ -20,16 +20,11 @@ The process for contributing to any of the Elasticsearch repositories is similar
2. Run the test suite to ensure your changes do not break existing code:
````
git submodules init
python setup.py test
````
If your changes require special configuration of the client you can create a
`test_elasticsearch/local.py` file containing a `get_client` with the same
signature as the client itself (`hosts, **kwargs` will do) and returns a client
instance. This function will be used for any tests running against ES and will
be passed all the parameters that would otherwise be used to construct the
client instance directly.
See the README file in `test_elasticsearch` dirctory for more information on
running the test suite.
3. Rebase your changes.
Update your local repository with the most recent code from the main
Submodule rest-api-spec deleted from 2e4b70d40f
+50
View File
@@ -0,0 +1,50 @@
elasticsearch-py test suite
===========================
Warning - by default the tests will try and connect to `localhost:9200` and
will destroy all contents of given cluster!
Running the tests
-----------------
To simply run the tests just execute the `run_tests.py` script or invoke
`python setup.py test`. The behavior is driven by environmental variables:
* `TEST_ES_SERVER` - can contain "hostname[:port]" of running es cluster
* `TEST_ES_CONNECTION` - name of the connection class to use from
`elasticsearch.connection` module. If you want to run completely with your
own see section on customizing tests.
* `TEST_ES_YAML_DIR` - path to the yaml test suite contained in the
elasticsearch repo. Defaults to `$TEST_ES_REPO/rest-api-spec/test`
* `TEST_ES_REPO` - path to the elasticsearch repo, by default it will look in
the same directory as `elasticsearch-py` is in. It will not be used if
`TEST_ES_YAML_DIR` is specified directly.
* `TEST_ES_NOFETCH` - controls if we should fetch new updates to elasticsearch
repo and reset it's version to the sha used to build the current es server.
Defaults to `False` which means we will fetch the elasticsearch repo and
`git checkout` the sha used to build the server.
Alternatively, if you wish to control what you are doing you have several additional options:
* `run_tests.py` will pass any parameters specified to `nosetests`
* you can just run your favorite runner in the `test_elasticsearch` directory
(verified to work with nose and py.test) and bypass the fetch logic entirely.
Customizing the tests
---------------------
You can create a `local.py` file in the `test_elasticsearch` directory which
should contain a `get_client` function:
def get_client(hosts, ** kwargs):
...
If this file exists the function will be used instead of the built in one to
construct the client used for any integration tests. You can use this to make
sure your plugins and extensions work with `elasticsearch-py`.
+51 -2
View File
@@ -1,11 +1,60 @@
#!/usr/bin/env python
from __future__ import print_function
import sys
from os import path
from os import environ
from os.path import dirname, join, pardir, abspath, exists
import subprocess
import nose
from test_elasticsearch.test_server import get_client
from test_elasticsearch.test_cases import SkipTest
def fetch_es_repo():
# user is manually setting YAML dir, don't tamper with it
if 'TEST_ES_YAML_DIR' in environ:
return
repo_path = environ.get(
'TEST_ES_REPO',
abspath(join(dirname(__file__), pardir, pardir, 'elasticsearch'))
)
# no repo
if not exists(repo_path) or not exists(join(repo_path, '.git')):
print('No elasticsearch repo found...')
# set YAML DIR to empty to skip yaml tests
environ['TEST_ES_YAML_DIR'] = ''
return
# set YAML test dir
environ['TEST_ES_YAML_DIR'] = join(repo_path, 'rest-api-spec', 'test')
# fetching of yaml tests disabled, we'll run with what's there
if environ.get('TEST_ES_NOFETCH', False):
return
# find out the sha of the running es
try:
es = get_client()
sha = es.info()['version']['build_hash']
except (SkipTest, KeyError):
print('No running elasticsearch >1.X server...')
return
# fetch new commits to be sure...
print('Fetching elasticsearch repo...')
subprocess.check_call('cd %s && git fetch https://github.com/elasticsearch/elasticsearch.git' % repo_path, shell=True)
# reset to the version fron info()
subprocess.check_call('cd %s && git checkout %s' % (repo_path, sha), shell=True)
def run_all(argv=None):
sys.exitfunc = lambda: sys.stderr.write('Shutting down....\n')
# fetch yaml tests
fetch_es_repo()
# always insert coverage when running tests
if argv is None:
argv = [
@@ -21,7 +70,7 @@ def run_all(argv=None):
nose.run_exit(
argv=argv,
defaultTest=path.abspath(path.dirname(__file__))
defaultTest=abspath(dirname(__file__))
)
if __name__ == '__main__':
+10 -68
View File
@@ -1,104 +1,46 @@
import time
import subprocess
import tempfile
import os
import requests
from elasticsearch import Elasticsearch
from elasticsearch.exceptions import ConnectionError, NotFoundError
from ..test_cases import TestCase, SkipTest
data_dir = None
client = None
CMD = """
elasticsearch \
-f \
-D es.cluster.name=%(cluster_name)s \
-D es.node.name=test_name \
-D es.http.port=%(port)s \
-D es.gateway.type=none \
-D es.index.store.type=memory \
-D es.discovery.zen.ping.multicast.enabled=false \
-D es.path.data=%(data_dir)s \
-D es.pidfile=%(pidfile)s \
>/dev/null 2>&1
"""
def get_client():
global client
if client is not None:
return client
server = None
pidfile = tempfile.mktemp()
def get_client(**kwargs):
# construct kwargs from the environment
kw = {}
if 'TEST_ES_CONNECTION' in os.environ:
from elasticsearch import connection
kw['connection_class'] = getattr(connection, os.environ['TEST_ES_CONNECTION'])
# update them with params
kw.update(kwargs)
# try and locate manual override in the local environment
try:
from test_elasticsearch.local import get_client as local_get_client
return local_get_client([os.environ['TEST_ES_SERVER']], **kw)
client = local_get_client([os.environ.get('TEST_ES_SERVER', {})], **kw)
except ImportError:
# fallback to using vanilla client
return Elasticsearch([os.environ['TEST_ES_SERVER']], **kw)
def setup():
global server
# if use running ES instance, don't attempt to start our own
if 'TEST_ES_SERVER' not in os.environ:
# check installed
if subprocess.call('which elasticsearch >/dev/null 2>&1', shell=True) != 0:
raise SkipTest("No Elasticsearch server, skipping integration tests.")
args = {
'cluster_name': 'es_client_test',
'port': 9900,
'data_dir': tempfile.tempdir,
'pidfile': pidfile
}
# check running
try:
requests.get('http://localhost:%(port)s' % args)
except requests.ConnectionError:
pass
else:
raise SkipTest('Elasticsearch already running!')
cmd = CMD % args
server = subprocess.Popen(cmd, shell=True)
os.environ['TEST_ES_SERVER'] = 'localhost:%(port)s' % args
client = get_client()
client = Elasticsearch([os.environ.get('TEST_ES_SERVER', {})], **kw)
# wait for yellow status
for _ in range(100):
time.sleep(.1)
try:
client.cluster.health(wait_for_status='yellow')
break
return client
except ConnectionError:
continue
else:
# timeout
raise SkipTest("Elasticsearch failed to start.")
def teardown():
if server is not None:
with open(pidfile) as pidf:
pid = pidf.read()
os.kill(int(pid), 15)
server.wait()
def setup():
get_client()
ES_VERSION = None
@@ -195,10 +195,10 @@ def construct_case(filename, name):
return type(name, (YamlTestCase, ), attrs)
YAML_DIR = environ.get(
'YAML_TEST_DIR',
'TEST_ES_YAML_DIR',
join(
dirname(__file__), pardir, pardir,
'rest-api-spec', 'rest-api-spec', 'test'
dirname(__file__), pardir, pardir, pardir,
'elasticsearch', 'rest-api-spec', 'test'
)
)