Run, manage and stop Docker Compose project from Docker API
pip install pytest-dockerc==1.0.6
pytest-dockerc is a plugin for pytest that provides support
for running test from Docker Compose project.
The docker-compose up -d
command is executed at the beginning of the
test session and the docker-compose down
command at the end. The main fixture dockerc
returns a compose.project.Project
to deal with the python docker API in your tests. Another fixture dockerc_logs
is provided to enable
the logs on stdout during your tests execution.
This plugin provides a way to use as far as possible the same environment for development, test, integration and production phases. You test and deploy the same artifact in order to avoid side effects in production.
pip install pytest-dockerc
Below a basic example, you can also refer to a full example with an http server.
├── docker-compose.yml
└── tests
├── conftest.py
└── test_example.py
version: "3.6"
services:
python:
image: python:3-alpine
def test_example(dockerc):
assert len(dockerc.containers()) == 1
container = dockerc.containers()[0]
assert container.is_running is True
assert container.labels["com.docker.compose.service"] == "python"
Some options are available to update the default behavior of the plugin.
dockerc:
--dockerc-norun disable the run and stop commands of docker-compose
--dockerc-attach-network
attach the pytest container to the docker-compose
network,only if pytest is started inside a container
--dockerc-filepath=DOCKERC_FILEPATH
set the Compose file path
--dockerc-projectdir=DOCKERC_PROJECTDIR
set the working directory of the Compose project
--dockerc-projectname=DOCKERC_PROJECTNAME
set project name of the Compose project
--dockerc-build build images before starting containers
--dockerc-services=DOCKERC_SERVICES
select services to run
Running the full docker-compose project can take time, if you loads several services. It is useful to run the test on a running instance. That method is recommended when you write a new test.
First start your docker compose like usual:
docker-compose up
Then run your tests with the --dockerc-norun
, that will skip the up
and down
command:
pytest --dockerc-norun
Below the docker-compose output after 2 runs of the test tests/test_fixtures::test_basic_workflow
,
which performs a GET request.
Creating network "pytest-dockerc_default" with the default driver
Creating pytest-dockerc_http_1 ... done
Attaching to pytest-dockerc_http_1
http_1 | 192.168.32.1 - - [24/Dec/2018:08:48:21 +0000] "GET / HTTP/1.1" 200 612 "-" "python-requests/2.20.0" "-"
http_1 | 192.168.32.1 - - [24/Dec/2018:08:48:22 +0000] "GET / HTTP/1.1" 200 612 "-" "python-requests/2.20.0" "-"