跳转到主要内容

基于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 许可证下向您提供。它可以在商业和封闭源代码应用程序中使用。请阅读许可证以获取详细信息!

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

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

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

pytest-docker-3.1.1.tar.gz (12.9 kB 查看哈希值)

上传时间

构建分发

pytest_docker-3.1.1-py3-none-any.whl (8.2 kB 查看哈希值)

上传时间 Python 3

支持者

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