在我的上一篇文章中,我向您展示了 如何将 Rails 开发环境迁移到 Docker(和 Docker Compose) 。这一次,我想对此进行扩展并讨论有关测试 Rails 应用程序的一些改进。
运行基本测试套件非常容易。使用 我上一篇文章 中的配置,您可以简单地运行以下命令来启动环境、创建和播种数据库,以及运行您的测试套件。
docker-compose up
docker-compose run -e "RAILS_ENV=test" app rake db:create db:migrate
docker-compose run -e "RAILS_ENV=test" app rake test
这基本上与您在本地运行测试的方式相同,虽然它可能会稍微加快测试时间(取决于运行 Docker 的硬件),但这并不是一个巨大的改进。
但是您可以同时在多个容器中运行测试。
运行单个测试
与在本地运行的应用程序一样,您可以通过在 运行 命令中指定文件名来运行单独的测试套件。
docker-compose up
docker-compose run -e "RAILS_ENV=test" app rake db:create db:migrate
docker-compose run -e "RAILS_ENV=test" app rake test
在并行容器中运行测试
如果您的 Docker 主机足够强大,您还可以使用多个容器并行运行测试。有可用的工具,例如 parallel_tests ,它允许您在一台机器上并行运行测试;您可能也想重用它们。
浏览器测试
如果您想通过 Capybara 或类似工具运行测试,您只需扩展 Dockerfile 以包含必要的浏览器以及提供虚拟显示服务器的 xfvb 包。
docker-compose up
docker-compose run -e "RAILS_ENV=test" app rake db:create db:migrate
docker-compose run -e "RAILS_ENV=test" app rake test
在你的 Gemfile 中包含 webdriver,你就可以开始了。我还建议看一下 headless gem ,它提供了一个易于使用的 xvfb 包装器,并允许您捕获图像或视频。
或者你可以切换到使用 PhantomJS ,它提供了一个无头版本的 WebKit 并且不需要任何额外的包。通过将以下命令添加到 Dockerfile 来安装它。
docker-compose up
docker-compose run -e "RAILS_ENV=test" app rake db:create db:migrate
docker-compose run -e "RAILS_ENV=test" app rake test
注意:我们使用的是 PhantomJS 的 1.9.8 版本,因为版本 2 的 Linux 二进制文件尚不可用。如果你想使用版本 2,你需要自己编译它,但你可以使用上面的命令下载并安装它。
运行仅开发/测试依赖项
如果您需要依赖项,它应该只在您的测试开发或环境中运行,您可以很容易地在 docker-compose.yml 中添加一个新的容器定义并相应地调整您的配置。
例如, Discourse 在开发过程中使用了 Mailcatcher 。在传统设置中,您需要在开发计算机上安装软件。但是,使用容器化设置变得更加容易。
如下所述调整您的应用程序定义( development.rb 配置已经包含通过 Mailcatcher 定义的端口发送邮件的配置,因此您根本不需要更改它)。
docker-compose up
docker-compose run -e "RAILS_ENV=test" app rake db:create db:migrate
docker-compose run -e "RAILS_ENV=test" app rake test
重新启动环境后,您可以在 Docker 主机的 IP 上打开 Mailcatcher Web 界面,并查看通过您的应用程序发送的任何邮件。
Codeship 上的 Docker
正如我在 上一篇文章 中提到的,Codeship 目前也在准备基于 Docker 的 CI 基础设施。我们将使用 Docker Compose(带有一些扩展)来定义您的测试环境,然后使用一个单独的基于 YAML 的配置来配置要运行的步骤。
该平台仍在开发中,因此可用选项并非一成不变,但以下配置将在 Discourse 存储库的多个容器上运行各种测试。
docker-compose up
docker-compose run -e "RAILS_ENV=test" app rake db:create db:migrate
docker-compose run -e "RAILS_ENV=test" app rake test
结合以下步骤定义,我们将在三个 Docker 容器中并行运行您的测试。
docker-compose up
docker-compose run -e "RAILS_ENV=test" app rake db:create db:migrate
docker-compose run -e "RAILS_ENV=test" app rake test
前往 Codeship Docker Beta 注册测试版。