Testing¶
Snakebite provides integration and unit tests for its functionalities.
To be able to truly test integration with HDFS, we provide wrapper
around snakebite.minicluster
, and base class for integration
tests MiniClusterTestBase
- on setup for such test class minicluster is
started, when tests are done minicluster is destroyed. There’s some
performance overhead - but it’s not a problem (yet).
Snakebite by default uses nose
and tox for testing. Tests
are integrated with setup.py, so to start tests one can simply:
$ python setup.py test
Because we require minicluster to fully test snakebite, java needs to be present on the system.
Note
It’s possible to run snakebite tests inside snakebite Docker test image - to learn more see section Fig below. Note that it’s not default testing method as it requires Docker to be present.
Tox¶
Tox allow us to create automated
isolated python test environments. It’s also a place where we can prepare environment
for testing - like download hadoop distributions, set environment variables etc.
Tox configuration is available in tox.ini
file in root directory.
- There are 4 test environments:
- python 2.6 + CDH
- python 2.7 + CDH
- python 2.6 + HDP
- python 2.7 + HDP
We bootstrap environment with pip install -r requirements-dev.txt
(deps section)
And then we setup environment via /scripts/ci/setup_env.sh
script.
setup_env.sh
script downloads hadoop distribution tar, and extracts it.
Help for setup_env.sh
::
Setup environment for snakebite tests
- options:
-h, --help show brief help -o, --only-download just download hadoop tar(s) -e, --only-extract just extract hadoop tar(s) -d, --distro select distro (hdp|cdh)b
When environment is ready we actually run tests via: /scripts/ci/run_tests.sh
One can run tests manually via /scripts/ci/run_tests.sh
but make sure
that HADOOP_HOME
environment variable exists so that it knows where to find
minicluster jar file. This way it’s possible to test snakebite against custom
Hadoop distributions. run_tests.sh
script uses nose
for testing, so that
if you wish to pass anything to nose, just add parameters to run_tests.sh
.
One can pass parameters to tox/nose through setup.py via --tox-args
flag:
$ python setup.py test --tox-args="--recreate -e py26-hdp '--quiet'"
Will test py26-hdp tox environment, make sure it will be recreated,
and also through run_tests.sh
script instruct nose to be quite.
$ python setup.py test --tox-args="-e py26-hdp test/test_test.py
Will use py26-hdp tox environment and also instruct nose to run only tests from test/test_test.py.
Fig¶
Note
Fig is experimental testing method, it’s very promissing though.
Fig is “fast, isolated development environments using Docker”. It abstracts away whole test environment, create completely fresh and isolated test environments using Docker.
Currently we use base testing image ravwojdyla/snakebite_test:base
,
it was created using /scripts/build-base-test-docker.sh
and
/scripts/Dockerfile
. Base test image is a Ubuntu Trusty with:
* oracle java 7
* python 2.6
* python 2.7
* pip
* CDH distribution
* HDP distribution
Base docker image doesn’t change, to create new test image with
current working tree, based on ravwojdyla/snakebite_test:base
:
$ fig build
Fig will create new image based on ravwojdyla/snakebite_test:base
,
with current working tree, that can be used for tests.
Fig currently specifies 4 tests:
* testPy26cdh
: python 2.6 + CDH
* testPy26hdp
: python 2.6 + HDP
* testPy27cdh
: python 2.7 + CDH
* testPy27hdp
: python 2.7 + HDP
To run specific test (eg. testPy26cdh):
$ fig run testPy26cdh
The biggest value in Fig is that tests are completely isolated, all the snakebite dependencies are present on test image. Unfortunately Fig depends on Docker - which is quite a big dependency to have, and that’s why it’s default method of testing for snakebite. It’s worth to mention that Fig still uses Tox inside test container.