Simple pytest fixtures that help you write integration
tests with Docker and docker-compose.
Specify all necessary containers in a docker-compose.yml
file and and
pytest-docker
will spin them up for the duration of your tests.
This package is tested with Python versions 3.5
, 3.6
, 3.7
and 3.8
and
pytest
version 5. Python 2 is not supported.
pytest-docker
was originally created by André Caron.
Install pytest-docker
with pip
or add it to your test requirements. It is
recommended to install docker-compose
python package directly in your
environment to ensure that it is available during tests. This will prevent
potential dependency conflicts that can occur when the system wide
docker-compose
is used in tests.
Here is an example of a test that depends on a HTTP service.
With a docker-compose.yml
file like this (using the
httpbin service):
version: '2'
services:
httpbin:
image: "kennethreitz/httpbin"
ports:
- "8000:80"
You can write a test like this:
import pytest
import requests
from requests.exceptions import ConnectionError
def is_responsive(url):
try:
response = requests.get(url)
if response.status_code == 200:
return True
except ConnectionError:
return False
@pytest.fixture(scope="session")
def http_service(docker_ip, docker_services):
"""Ensure that HTTP service is up and responsive."""
# `port_for` takes a container port and returns the corresponding host port
port = docker_services.port_for("httpbin", 80)
url = "http://{}:{}".format(docker_ip, port)
docker_services.wait_until_responsive(
timeout=30.0, pause=0.1, check=lambda: is_responsive(url)
)
return url
def test_status_code(http_service):
status = 418
response = requests.get(http_service + "/status/{}".format(status))
assert response.status_code == status
By default this plugin will try to open docker-compose.yml
in your
tests
directory. If you need to use a custom location, override the
docker_compose_file
fixture inside your conftest.py
file:
import os
import pytest
@pytest.fixture(scope="session")
def docker_compose_file(pytestconfig):
return os.path.join(str(pytestconfig.rootdir), "mycustomdir", "docker-compose.yml")
All fixtures have session
scope.
Determine the IP address for TCP connections to Docker containers.
Get an absolute path to the docker-compose.yml
file. Override this fixture in
your tests if you need a custom location.
Generate a project name using the current process PID. Override this fixture in your tests if you need a particular project name.
Start all services from the docker compose file (docker-compose up
).
After test are finished, shutdown all services (docker-compose down
).
This pytest plug-in and its source code are made available to you under a MIT license. It is safe to use in commercial and closed-source applications. Read the license for details!
Found a bug? Think a new feature would make this plug-in more practical? We welcome issues and pull requests!
When creating a pull request, be sure to follow this projects conventions - use
black with default settings for formatting, run
tests with python setup.py test
and make sure that all checks are passing.