Skip to main content

Docker-based integration tests

PyPI version Build Status Python versions Code style

Description

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 pytest-docker will spin them up for the duration of your tests.

pytest-docker was originally created by André Caron.

Installation

Install pytest-docker with pip or add it to your test requirements.

By default, it uses the docker compose command, so it relies on the Compose plugin for Docker (also called Docker Compose V2).

Docker Compose V1 compatibility

If you want to use the old docker-compose command (deprecated since July 2023, not receiving updates since 2021) then you can do it using the docker-compose-command fixture:

@pytest.fixture(scope="session")
def docker_compose_command() -> str:
    return "docker-compose"

If you want to use the pip-distributed version of docker-compose command, you can install it using

pip install pytest-docker[docker-compose-v1]

Another option could be usage of compose-switch.

Usage

Here is an example of a test that depends on an 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

The default docker_setup command includes --wait, which respects either the image HEALTHCHECK or the compose healthcheck. Generally, if those are configured properly, wait_until_responsive should not be required.

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")

To use multiple compose files, return a list of paths from the docker_compose_file fixture:

import os
import pytest


@pytest.fixture(scope="session")
def docker_compose_file(pytestconfig):
    return [
        os.path.join(str(pytestconfig.rootdir), "tests", "compose.yml"),
        os.path.join(str(pytestconfig.rootdir), "tests", "compose.override.yml"),
    ]

If you want to debug the test suite in your IDE (Pycharm, VsCode, etc.) and need to stop the test, the stack will be left running. To avoid creating multiple stacks, you can pin the project name and always teardown before starting a new stack:

import pytest

# Pin the project name to avoid creating multiple stacks
@pytest.fixture(scope="session")
def docker_compose_project_name() -> str:
    return "my-compose-project"

# Stop the stack before starting a new one
@pytest.fixture(scope="session")
def docker_setup():
    return ["down -v", "up --build --wait"]

Available fixtures

By default, the scope of the fixtures are session but can be changed with pytest command line option --container-scope <scope>:

pytest --container-scope <scope> <test_directory>

For available scopes and descriptions see https://docs.pytest.org/en/6.2.x/fixture.html#fixture-scopes

docker_ip

Determine the IP address for TCP connections to Docker containers.

docker_compose_file

Get an absolute path to the docker-compose.yml file. Override this fixture in your tests if you need a custom location.

docker_compose_project_name

Generate a project name using the current process PID. Override this fixture in your tests if you need a particular project name.

docker_services

Start all services from the docker compose file (docker-compose up). After test are finished, shutdown all services (docker-compose down).

docker_compose_command

Docker Compose command to use to execute Dockers. Default is to use Docker Compose V2 (command is docker compose). If you want to use Docker Compose V1, change this fixture to return docker-compose.

docker_setup

Get the list of docker_compose commands to be executed for test spawn actions. Override this fixture in your tests if you need to change spawn actions. Returning anything that would evaluate to False will skip this command.

docker_cleanup

Get the list of docker_compose commands to be executed for test clean-up actions. Override this fixture in your tests if you need to change clean-up actions. Returning anything that would evaluate to False will skip this command.

Development

Use of a virtual environment is recommended. See the venv package for more information.

First, install pytest-docker and its test dependencies:

pip install -e ".[tests]"

Run tests with

pytest -c setup.cfg

to make sure that the correct configuration is used. This is also how tests are run in CI.

Use black with default settings for formatting. You can also use pylint with setup.cfg as the configuration file as well as mypy for type checking.

Contributing

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 (see above).

Metadata

Release files for pytest-docker 3.2.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pytest-docker 3.2.6
File Size Uploaded
pytest_docker-3.2.6.tar.gz 13.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pytest-docker 3.2.6
File Interpreter ABI Platform
pytest_docker-3.2.6-py3-none-any.whl Python 3 none any Details

Total release size: 22.6 kB

Release files / pytest_docker-3.2.6.tar.gz

Download URL pytest_docker-3.2.6.tar.gz
Size 13.8 kB
Tags Source
SHA-256 checksum
How to use checksums
0b86f48e7f728e5171f0278fbf0ea358090ea76fbec2c5f9b25c7ba931fc3097
BLAKE2b-256 checksum
How to use checksums
22985c5eb1de2919ebbc02bd6c9311326c40148607935ed314608145752d316f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.10.22

Release files / pytest_docker-3.2.6-py3-none-any.whl

Download URL pytest_docker-3.2.6-py3-none-any.whl
Size 8.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
aeabb385eeb4898bbab46fe13b7762df31da6a5cf446d0a6746cb00b69cea0b2
BLAKE2b-256 checksum
How to use checksums
6b74c0514e67030241670ef3b61a18281c1b442c6f4918e62541b6c674ce6470
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.10.22

Release history Release notifications | RSS feed

This release

3.2.6 This release

2 release files

3.2.5

2 release files

3.2.4

2 release files

3.2.3

2 release files

3.2.2

2 release files

3.2.1

2 release files

3.2.0

2 release files

3.1.2

2 release files

3.1.1

2 release files

3.1.0

2 release files

3.0.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.13.0

2 release files

0.11.0

2 release files

0.10.3

2 release files

0.10.2

2 release files

0.10.1

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.0

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.6.1

3 release files

0.6.0

3 release files

0.5.0

3 release files

0.4.0

3 release files

0.3.0

3 release files

0.2.0

3 release files

0.1.0

3 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page