跳转到主要内容

使用docker启动测试期间所需的服务容器

项目描述

使用docker启动测试期间所需的服务容器

Build Status

安装

此项目可在pypi上找到,因此您可以使用pip安装它

pip install docker-services

或者将其作为setup.pyrequirements.txt文件中的依赖项,您选择哪种方式都可以。

使用它

1. 配置您的项目服务

您需要开始列出所有项目依赖的服务,并利用docker-services在测试运行期间维护这些服务的生命周期。

这必须通过在任何pytest .cfg/.ini文件或.services.yaml文件中使用docker_services配置选项来完成,该选项的值需要一个yaml结构,其中顶级成员是服务名称,其值可以是空值、镜像名称或对象。

由于ini文件的限制,.cfg/.ini文件不支持yaml的完整支持,如果需要复杂配置,则建议使用.services.yaml文件。

这是对一个依赖于postgres服务的项目的示例

[pytest]
docker_services=postgres:

这是相同的

[pytest]
docker_services=
    postgres:

还有这个

[pytest]
docker_services=
    postgres: postgres

还有这个(在.services.yaml中)

postgres:
    image: postgres

猜猜看?...还有这个!

database:
    name: postgres
    image: postgres

如果项目依赖于不同的服务,请列出所有这些服务

[pytest]
docker_services=
    postgres:
    redis:

当未指定镜像名称时(我敢打赌您已经注意到了这一点),它将回退到使用服务名称作为镜像名称,但是可以指定要使用的镜像名称和版本

[pytest]
docker_services=
    postgres: postgres:10

也可以这样

postgres:
    image: postgres:10

当前服务名为 postgres,镜像名为 postgres:10

另一种选择是为服务使用不同的名称,例如

[pytest]
docker_services=
    db: postgres:10
db:
    image: postgres:10

现在服务名为 db,镜像名为 postgres:10

如果您不想(或需要)设置特定的镜像版本,只需忽略版本部分,如下所示

[pytest]
docker_services=
    db: postgres

您还可以使用来自私有仓库的镜像

[pytest]
docker_services=
    db: my.registry.com/custom/postgres

1.1. 为您的服务配置环境变量

您可能想通过设置环境变量来自定义服务的行为,也可以通过添加到配置文件中实现(仅当使用 .services.yaml 文件时有效)。

db:
    image: postgres:10
    environment:
        POSTGRES_USERNAME: myuser
        POSTGRES_PASSWORD: $3cr3t
        POSTGRES_DB: mydb

使用上面的配置,db 服务现在已通过 POSTGRES_USERNAMEPOSTGRES_PASSWORDPOSTGRES_DB 环境变量初始化。

这些变量也暴露给实际会话,因此您也可以在您的应用或测试中消费这些值。

1.2. 同样配置动态变量

您是否计划基于服务的端口号配置一个 DATABASE_URL 环境变量?...那么不要等待,配置一个变量模板;)

关于postgres的DATABASE_URL,人们通常期望的是 postgres://user:password@host:port/dbname,这可以通过以下方式实现

postgres:
    image: postgres:10
    environment:
        POSTGRES_USERNAME: myuser
        POSTGRES_PASSWORD: $3cr3t
        POSTGRES_DB: mydb
        _templates:
            POSTGRES_PORT: "{env[POSTGRES_PORT_5432_TCP_PORT]}"
            DATABASE_URL: "postgres://myuser:$s3cr3t@localhost:{env[POSTGRES_PORT_5432_TCP_PORT]}/mydb"

您还可以使用为服务定义的环境变量,这样您就不需要重复相同的

DATABASE_URL: "postgres://{env[POSTGRES_USERNAME]}:{env[POSTGRES_PASSWORD]}@localhost:{env[POSTGRES_PORT_5432_TCP_PORT]}/{env[POSTGRES_DB]}"

模板中的参数使用python的.format()方法进行替换,目前只传递了env参数,它实际上引用的是os.environ的内容,因此所有环境变量都是可用的。

2. 在启用docker-services的情况下运行测试

docker-servicespy.test 添加了 --use-docker-services 命令行选项,当设置此选项时,它通过docker启用服务的启动,运行方式如下

py.test --docker-services

3. 与服务通信

我们启动服务是因为我们需要在测试会话中与它们进行通信,无论是从它们那里消耗数据还是向它们发布数据。为此,docker_services 依赖于服务暴露的端口为每个端口和协议创建唯一的环境变量。

变量名称遵循与从链接创建的环境变量相同的约定,但到目前为止,我们只创建了*_PORT环境变量,假设docker在本地机器上运行,并且暴露给localhost的端口。

因此,如果我们有一个postgres服务,我们期望使用端口5432进行通信,现在查看Dockerfile,我们可以确认它暴露了端口5432

请注意,docker_services只为暴露的端口创建环境变量,如果服务的镜像没有暴露任何端口,则不会创建任何*_PORT变量。

对于postgres服务用例,端口5432的变量名称将是:POSTGRES_PORT_5432_TCP_PORT,这个变量名称是通过以下模板构建的:{service_name}_PORT_{port}_{protocol}_PORT

请记住,为服务配置的环境变量也在pytest会话的上下文中可用,这适用于静态和动态变量!

项目详情


下载文件

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

源分布

docker-services-0.4.0.tar.gz (7.9 kB 查看散列)

上传于

由以下支持