Integration Tests
This document describes the conventional setup for per-component integration tests in wazo projects.
Requirements
The integration tests rely directly on docker
and
docker compose
Additional python dependencies (including test runners, frameworks and any tool and library used by
the tests) are made available in a pip integration_tests/test-requirements.txt
file, to be be
installed into a virtual environment.
Structure
- All files related to integration tests should be present under an
integration_tests
directory directly below a project root directory. integration_tests/assets
should contain docker compose yaml files as well as configuration and static assets required for tests at runtime (usually mounted as volumes configured in the compose files).integration_tests/docker
should contain custom dockerfiles and other files required to build images for the test setup (referenced in compose files).integration_tests/suite
should contain the actual python tests definitions, including any custom helpers and utilities.integration_tests/test-requirements.txt
should contain all python requirements required for the test environment, such as the test runner, and other tools and libraries used by the tests.integration_tests/Makefile
should exist and define an interface to interact with the test setup using themake
utility.
As a general guide on conventional project structure, see also Wazo daemon file structure
Running Tests
A tox interface should be available, enabling integration tests to be executed from the project root directory through
tox -e integration
tox
takes care of creating the virtual environment containing the dependencies for the tests.
The integration_tests/Makefile
should define a target test-setup
to prepare the test environment
(e.g. build docker images), and a test
target to run the tests. Those targets can be used
directly, and should be used by the tox integration
environment. To run the tests without tox from
the integration_tests
directory:
# make test dependencies available in a virtual environment
python3 -m venv .venv && pip install -r test-requirements.txt
source .venv/bin/activate
make test-setup
make test
pytest
The tests suites usually use pytest
as a test runner and framework,
which should be made available through the test python requirements file.
For example, to run a single test file and all tests contained:
pytest suite/test_confgen.py
To run all tests:
pytest suite/
and to run only tests matching a specified name pattern:
pytest -k 'pjsip_conf' suite/
Docker
The tests rely on a containerized deployment of the codebase under test. The container image for the
codebase can be built using the dockerfile available in the integration_tests/docker
directory.
Current conventions prescribe the pattern Dockerfile-<service>
for the name of the dockerfiles,
where <service>
might be a short name descriptive of the purpose of the image (e.g.
Dockerfile-confgend
for a image for the confgend codebase).
make
targets should be defined in the integration_tests/Makefile
to encapsulate the recipe for
building each image required for the tests. Those targets should be referenced as pre-requirements
in the test-setup
target.
To build the images directly, a docker invocation similar to the following can be run from the
integration_tests
directory:
docker build -f docker/Dockerfile-<service> -t wazoplatform/<project-name>:local ..
The tag given with -t
must match the image name expected by the corresponding service descriptions
in the docker compose files.
To test that the image is functional:
docker run --rm -it -v $(readlink -f ..):/usr/local/src/<project-name> wazoplatform/<project-name>:local
Note: This will mount the project root directory as a volume to provide in-development source code for testing.
This should start a container from the built image, which should run the component entrypoint (usually a daemon implemented by the codebase).
Once the image is made available locally, the docker compose configurations should be able to use it and pull any other required images from the docker hub registry.
Docker Compose
The wazo test framework used by the test code takes care of controlling docker compose
to bring up
the services required by the tests. The docker compose
command can be used directly to debug and
manually interact with the test setup.
The docker compose stack (all services and resources managed by docker compose) is defined through
multiple compose files. A base docker-compose.yml
file is combined with override files which can
offer different configuration profiles for the test environment. At a minimum, a
docker-compose.base.override.yml
would define the settings for a default "baseline" test
environment.
To deploy the docker compose stack for the base environment,
docker compose -f assets/docker-compose.yml -f assets/docker-compose.base.override.yml up
Then to stop the services and cleanup active resources managed by docker compose:
docker compose -f assets/docker-compose.yml -f assets/docker-compose.base.override.yml down
To run a specific service and its dependencies:
docker compose -f assets/docker-compose.yml -f assets/docker-compose.base.override.yml run <service>
To execute a command inside the container environment of a specific service already deployed:
docker compose -f assets/docker-compose.yml -f assets/docker-compose.base.override.yml exec <service> <command>
denv
denv is a utility to simplify the usage patterns of docker compose for integration tests.