Skip to main content

Simple pytest fixtures for Docker and docker-compose based tests

Project description

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

This package is tested with Python versions 3.6, 3.7, 3.8 and 3.9, and pytest version 4, 5 and 6. Python 2 is not supported.

pytest-docker was originally created by André Caron.

Installation

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.

The default behavior is not to install docker-compose with pytest-docker. If you want to, you install pytest-docker with the docker-compose-v1 extra. You can use the following command:

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

Docker Compose v2 compatiblity

pytest-docker will work with Docker Compose v2 out of the box if compose-switch is installed.

If you want to use the real Docker Compose v2, it has to be installed system wide (more information) and you have to modify the docker-compose-command fixture (this behavior might change in the future versions).

Usage

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

Available fixtures

All fixtures have session scope.

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 v1 (command is docker-compose). If you want to use Docker Compose v2, change this fixture to return docker compose.

docker_setup

Get the docker_compose command 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 docker_compose command 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.

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytest-docker-1.0.0.tar.gz (7.2 kB view details)

Uploaded Source

Built Distribution

pytest_docker-1.0.0-py3-none-any.whl (7.4 kB view details)

Uploaded Python 3

File details

Details for the file pytest-docker-1.0.0.tar.gz.

File metadata

  • Download URL: pytest-docker-1.0.0.tar.gz
  • Upload date:
  • Size: 7.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for pytest-docker-1.0.0.tar.gz
Algorithm Hash digest
SHA256 f2866121e06170a4fc5e441f5db0c11c5f1ea9726e39819e46c2fc1b935d5c33
MD5 ffe3cde0b42d5ffa4e7c2f19cd1e90b0
BLAKE2b-256 c57a288cb9a3a127108eb3fd50b603f36cbf69d74e94e5b7fb3406daa6f89c31

See more details on using hashes here.

File details

Details for the file pytest_docker-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pytest_docker-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bb32d58ebf9ccaf90c1f1853bc17a6cbe4ba65ce40385e33c067892a6d5628df
MD5 4d4eb04bce84c021ef457d502a31637c
BLAKE2b-256 6795fb6f79208a7fa4429b684d512eb5656ce7e4dd537482a4c1250501271fe4

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page