7.3 测试 Deis

Deis 是一个有许多活动件( moving parts)的分布式系统,这使得彻底的测试每一个变化是至关重要的。

DEIS 也是一套对应于目录中的源代码库的组件。大部分的组件是 Docker 容器,两个是命令行客户端,一个包含文档。组件有源码级别的单元测试和黑盒类型的功能测试。集成测试校验组件组合在一起作为一个系统的行为。

Deis 的 GitHub pull requests 是通过在 http://ci.deis.io 的一个 Jenkins 持续集成(CI) 系统自动测试的。贡献者在提任何变更到 Deis 代码库之前,应该运行相同的本地测试。

设置环境变量

为了运行所有测试,你将需要:

  • Vagrant 1.6.5 或更新版
  • VirtualBox 4.3 或更新版
  • Docker 1.3.0
  • PostgreSQL server

该测试假设在你的 $GOPATH 中有 Deis 源码:

  1. $ go get -u -v github.com/deis/deis
  2. $ cd $GOPATH/src/github.com/deis/deis

启动一个 Docker Registry

Deis 的功能测试构建 Docker 镜像和在本地测试它们。镜像是被 pushed 到一个 Docker registry 的,以至于集成测试可以以二进制购件测试它们 - 就像真实世界 Deis 从 Docker Hub 拉取镜像。

如果你还没有为你的测试和持续部署提供一个可访问的 Docker registry,在本地启动一个:

  1. $ make dev-registry
  2. registry
  3. To use local boot2docker registry for Deis development:
  4. export DEV_REGISTRY=192.168.59.103:5000

运行测试

每个组件的单元和功能测试在它们各自的目录。集成测试,脚本,和支持的 go 包在项目根的 tests/ 目录。

脚本在 tests/bin 目录,是最佳的启动位置。这些测试 Deis 的各个部分。然后启动一个 Vagrant 集群并以一个系统测试它们。它们调用 tests/bin/test-setup.sh 脚本来测试重要的环境变量,如果丢失了环境变量,将退出并输出有帮助的信息。

test-setup.sh 脚本也准备测试环境。而且会在测试完成后恢复过来。如果有一个测试失败,脚本会收集详细的组件日志,压缩它们,并放置在 $HOME。如果 s3cmd 在测试服务器上安装并且配置,脚本将上传日志到 Amazon S3。这是 Jenkins CI 基础设施如何被配置,因此贡献者可以访问日志来看他们的 PR 怎样失败的。

test-integration.sh

  • 运行文档测试
  • 构建 Docker 镜像并使用 $BUILD_TAG 打 tag
  • 运行单元和功能测试
  • 创建 3 个节点的 Vagrant CoreOS 集群
  • 推送 Docker 镜像到 registry
  • 使用 registry 镜像为 Deis 提供集群
  • 运行所有的集成测试
  • 大概需要一小时
  1. $ ./tests/bin/test-integration.sh
  2. >>> Preparing test environment <<<
  3. DEIS_ROOT=/Users/matt/Projects/src/github.com/deis/deis
  4. DEIS_TEST_APP=example-go
  5. ...
  6. >>> Running integration suite <<<
  7. make -C tests/ test-full
  8. ...
  9. >>> Test run complete <<<

test-smoke.sh

  • 运行文档测试
  • 构建 Docker 镜像并使用 $BUILD_TAG 打 tag
  • 运行单元和功能测试
  • 创建 3 个节点的 Vagrant CoreOS 集群
  • 推送 Docker 镜像到 registry
  • 使用 registry 镜像为 Deis 提供集群
  • 运行一个“冒烟测试”,推送和扩展一个 app
  • 大概需要 45 分钟

test-latest.sh

  • 安装最新的 deis 和 deisctl 发行版
  • 创建 3 个节点的 Vagrant CoreOS 集群
  • 使用最新的发行镜像为 Deis 提供集群
  • 大概需要 30 分钟

运行特定的测试

以这种方式为单个组件运行测试:

  1. $ make -C logger test # unit + functional
  2. $ make -C controller test-unit
  3. $ make -C router test-functional

定制化测试运行

文件 tests/bin/test-setup.sh 是对环境变量可影响测试行为的最佳参考。这里有一些重要的:

  • HOST_IPADDR - 可与功能测试通信的 Docker 容器地址,可能是主机 IP 或 一个被分配给了 boot2docker
  • DEIS_TEST_APP - Deis 示例 app 使用的名字, 它使从 GitHub (default: example-go)克隆的。
  • DEIS_TEST_AUTH_KEY - 用于注册 Deis controller 的 SSH 秘钥 (default: ~/.ssh/deis)
  • DEIS_TEST_SSH_KEY - 用于登陆到 controller 机器的 SSH 秘钥 (default: ~/.vagrant.d/insecure_private_key)
  • DEIS_TEST_DOMAIN - 用于测试的域名(default: local3.deisapp.com)