admin_gateway 是用于我们所有后台统一认证和授权的组件,而我们后台程序运行在多个 Ruby 版本上,主要是 Ruby 1.9.3 和 2.0,Ruby 2.1 也已经发布了,很快也需要提供 Ruby 2.1 的支持,另外 Rails 版本有 3.0,3.2 和 4.0 三大主要版本,因此一个完整的测试方案是需要包括这 3 * 3 = 9 种组合才行。
首先是多个 Ruby 版本测试。这个问题比较简单,我们现在的 Ruby 环境通常是由 RVM 管理的,RVM 可以很容易的以多个 Ruby 版本重复执行 Ruby 程序,比如下面的例子:
rvm ruby-1.9.3,ruby-2.0.0,ruby-2.1.0 exec ruby -e "puts RUBY_VERSION"
如果运行的机器安装了这3个版本的 Ruby 的话,就会依次执行打出各自的 Ruby 版本号。
所以下面的命令就可以依次运行3个Ruby版本的测试了:
rvm ruby-1.9.3,ruby-2.0.0,ruby-2.1.0 exec bundle install
rvm ruby-1.9.3,ruby-2.0.0,ruby-2.1.0 exec bundle exec rake test
解决多 Ruby 版本测试的问题,然后就是多 Rails 版本测试的问题。admin_gateway 这个 gem 是一个 Rails Engine,因此需要依赖 Rails。多 Rails 版本测试意味着 test 的 gem 环境是不同的,而现在 gem 环境是由 bundle 管理的,运行 bundle 命令时可以手动指定 Gemfile 文件,因此 建立多个 Gemfile 文件,重复上面的命令就可以了,例如可以建立 rails_4_0.gemfile 这个 Gemfile,然后通过命令
bundle install --gemfile rails_4_0.gemfile
执行 gem 环境安装,
然后通过命令:
BUNDLE_GEMFILE=rails_4_0.gemfile bundle exec rake test
执行测试。
组合上面的方法,可以形成一个完整的多 Ruby 版本和 Rails 版本的解决方案:
1. 首先根据需要安装多个 Ruby 版本,如 ruby 1.9.3, 2.0.0 和 2.1.0,根据需要生成多个 gemfile,如 rails_3_0.gemfile, rails_3_2.gemfile 和 rails_4_0.gemfile
2. 然后使用下面的 shell 安装 gem 环境和运行测试。
rvm ruby-1.9.3,ruby-2.0.0,ruby-2.1.0 exec bundle install --gemfile=rails_3_0.gemfile
BUNDLE_GEMFILE=rails_3_0.gemfile rvm ruby-1.9.3,ruby-2.0.0,ruby-2.1.0 exec bundle exec rake test
3.2 和 4.0的类似,就不重复了。
解决 gem 多版本的方法有一点不干净,因为 gemfile 有很多重复内容,shell命令也比较重复,因此有一个 gem 叫 appraise (https://github.com/cfedermann/Appraise)就是用于解决这个问题,它只需要配置一个 Appraisals 文件,在 Appraisals 声明不同的 gem 依赖就可以了,比如 admin_gateway 的 Appraisals 内容如下:
1 2 3 4 5 6 7 8 9 10 11 |
|
然后就可以通过 rake appraisal 完成多个 rails 版本测试,它的原理和上面提到的完全一样。
总之,多 Ruby 版本和多 gem 版本的测试并不难,利用 rvm 和 bundle 一些特性可以快速做到,利用 appraisal 可以让其更简化。