使用docker启动测试期间所需的服务容器
项目描述
使用docker启动测试期间所需的服务容器
安装
此项目可在pypi上找到,因此您可以使用pip安装它
pip install docker-services
或者将其作为setup.py
或requirements.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_USERNAME
、POSTGRES_PASSWORD
和 POSTGRES_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-services 为 py.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会话的上下文中可用,这适用于静态和动态变量!