Simple pytest fixtures for Docker and Docker Compose based tests
Project description
Docker-based integration tests
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.
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 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 V2 (command is docker compose
). If you want to use
Docker Compose V1, 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file pytest-docker-2.0.0.tar.gz
.
File metadata
- Download URL: pytest-docker-2.0.0.tar.gz
- Upload date:
- Size: 9.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.17
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3cc03a5b0f080807a49504197c16763811ba45863f26ae52c4411e499d4a2a86 |
|
MD5 | 04f8dae7cc8e0bbf94e253813281c90c |
|
BLAKE2b-256 | 48dea502566c1a0364d1acbbecc48cd3bfe8eed113c87382dc41c55ee9a80a8b |
File details
Details for the file pytest_docker-2.0.0-py3-none-any.whl
.
File metadata
- Download URL: pytest_docker-2.0.0-py3-none-any.whl
- Upload date:
- Size: 7.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.17
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 12c42c17de7cb26f166a578f5a415399e6f2b8bcb5c5321f054a5d4551a7ecc7 |
|
MD5 | d9e71064781a5a89e92dc0bc57b370f2 |
|
BLAKE2b-256 | 2cc79dbe585b85529d743bdbc908345723b7c23e59dd4254051c1dd36d8a4be3 |