跳转到主要内容

基于Docker和Docker Compose的简单pytest fixture测试

项目描述

基于Docker的集成测试

PyPI version Build Status Python versions Code style

描述

简单的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 进行格式化。您还可以使用 pylintsetup.cfg 作为配置文件,以及 mypy 进行类型检查。

贡献

pytest 插件及其源代码在 MIT 许可证下向您提供。它可以在商业和封闭源代码应用程序中使用。请阅读许可证以获取详细信息!

发现了一个错误?认为一个新功能会使此插件更实用?我们欢迎问题和拉取请求!

创建拉取请求时,请确保遵循此项目的约定(见上文)。

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页