基于Docker和Docker Compose的简单pytest fixture测试
项目描述
基于Docker的集成测试
描述
简单的pytest fixture,可以帮助您使用Docker和Docker Compose编写集成测试。在docker-compose.yml
文件中指定所有必要的容器,并pytest-docker
将在测试期间启动它们。
pytest-docker
最初由André Caron创建。
安装
使用pip
安装pytest-docker
或将它添加到您的测试需求中。
默认情况下,它使用docker compose
命令,因此它依赖于Docker的Compose插件(也称为Docker Compose V2)。
Docker Compose V1兼容性
如果您想使用旧的docker-compose
命令(自2023年7月起已弃用,自2021年起不再接收更新),则可以使用docker-compose-command
fixture来实现。
@pytest.fixture(scope="session")
def docker_compose_command() -> str:
return "docker-compose"
如果您想使用docker-compose
命令的pip分布式版本,可以使用以下命令进行安装:
pip install pytest-docker[docker-compose-v1]
另一种选择可能是使用 compose-switch
。
使用方法
以下是一个依赖于HTTP服务的测试示例。
使用如下 docker-compose.yml
文件(使用 httpbin 服务)
version: '2'
services:
httpbin:
image: "kennethreitz/httpbin"
ports:
- "8000:80"
你可以编写如下测试
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
默认情况下,此插件将尝试在你的 tests
目录中打开 docker-compose.yml
。如果你需要使用自定义位置,请在你的 conftest.py
文件中覆盖 docker_compose_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")
可用固件
默认情况下,固件的范围为 session
,但可以使用 pytest
命令行选项 --container-scope <scope>
进行更改
pytest --container-scope <scope> <test_directory>
有关可用范围和描述,请参阅 https://pytest.cn/en/6.2.x/fixture.html#fixture-scopes
docker_ip
确定TCP连接到Docker容器的IP地址。
docker_compose_file
获取到 docker-compose.yml
文件的绝对路径。如果你需要自定义位置,请在测试中覆盖此固件。
docker_compose_project_name
使用当前进程PID生成项目名称。如果你需要特定的项目名称,请在测试中覆盖此固件。
docker_services
从docker compose文件启动所有服务(docker-compose up
)。测试完成后,关闭所有服务(docker-compose down
)。
docker_compose_command
用于执行Docker的Docker Compose命令。默认使用Docker Compose V2(命令是docker compose
)。如果你想使用Docker Compose V1,将此固件更改为返回docker-compose
。
docker_setup
获取测试启动动作要执行的docker_compose命令列表。如果你需要更改启动动作,请在测试中覆盖此固件。返回任何评估为False的值将跳过此命令。
docker_cleanup
获取测试清理动作要执行的docker_compose命令列表。如果你需要更改清理动作,请在测试中覆盖此固件。返回任何评估为False的值将跳过此命令。
开发
建议使用虚拟环境。有关更多信息,请参阅 venv 包。
首先,安装 pytest-docker
及其测试依赖项
pip install -e ".[tests]"
运行测试
pytest -c setup.cfg
以确保使用正确的配置。这也是在CI中运行测试的方式。
使用默认设置的 black 进行格式化。您还可以使用 pylint
和 setup.cfg
作为配置文件,以及 mypy
进行类型检查。
贡献
此 pytest
插件及其源代码在 MIT 许可证下向您提供。它可以在商业和封闭源代码应用程序中使用。请阅读许可证以获取详细信息!
发现了一个错误?认为一个新功能会使此插件更实用?我们欢迎问题和拉取请求!
创建拉取请求时,请确保遵循此项目的约定(见上文)。