Ruby
Rails
RSpec
wercker

Werckerで高速にRSpecを実行する方法

More than 1 year has passed since last update.

Rails appを制作していて、CIはwerckerで回しているんですが、
テストが多くなってきて実行が遅くなったので高速にspecをwercker上で動かしたいと思い、使える方法を模索してみたのでメモ。

まずはじめにwercker railsなどでggりテキトウに設定でもテキトウに読んでwerckerを設定

次にtest-queueをGemfileに追加
test-queueはparalell_testsのようにdatabaseの数を指定しないです。自動でCPUにあったら設定に調節してくれます。

gem "test-queue"

$ bundle install

次にdatabaseの設定

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password:

test:
  <<: *default
  database: nuko_test

続いてtest-queueの実行コマンドを作成。
私は以下のように設定しています。

bin/test-queueというファイル名で以下をコピペ

#!/usr/bin/env ruby

ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../../config/environment", __FILE__)

require "test_queue"
require "test_queue/runner/rspec"

class MyAppTestRunner < TestQueue::Runner::RSpec
  def after_fork(num)
    ENV.update("TEST_ENV_NUMBER" => num > 1 ? num.to_s : "")
    ActiveRecord::Base.configurations["test"]["database"] << ENV["TEST_ENV_NUMBER"]
    ActiveRecord::Tasks::DatabaseTasks.create_current
    ActiveRecord::Base.establish_connection(:test)
  end
end

MyAppTestRunner.new.execute

続いてwerckerの設定ファイルを編集

set up dbのところを全て以下に置き換え

wercker.yml
        - script:
            name: Set up db
            code: |
                RAILS_ENV='test'                   bundle exec rake db:create
                RAILS_ENV='test'                   bundle exec rake db:schema:load

僕はschema:loadでdb作っているのでschema.rbの整合性が不完全なprojectの場合はrake db:migrateに書き換えてください。
Run RSpecを以下のように編集

wercker.yml
- script:
    name: Run RSpec
    code: bin/test-queue spec

これでall done。