使用 Docker 测试 Rails 应用程序

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在我的上一篇文章中,我向您展示了 如何将 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 注册测试版。