Railsアプリケーションのテスト高速化 (Oracle編) の続編です。
Rails アプリケーションのテストを高速化する技法として parallel_tests を導入した複数プロセスによる並列実行を取り挙げます。
現代 Rails アプリケーション開発においては RDBMS と組み合わせて、目的に応じた様々なミドルウェアがもちいられることが多いと思います。ここでは全文検索エンジンの Apache Solr に対するテストの並列実行を取り挙げます。
Rails アプリケーションから Solr を操作するライブラリとしては Sunspot を取り扱います。
なお、前提となる「parallel_tests のインストール」については前述の Oracle 編をご参照ください。
接続先の Apache Solr を並列テスト実行できる準備をする
Solr には単一サーバーで複数の異なるインデックスを保持する領域を持つことができる multi core という機能を備えており、そちらを利用します。
Solr インストールディレクトリの solr.xml にある <core>
要素を並列実行するプロセス分用意します。
<?xml version="1.0" encoding="UTF-8" ?>
<solr persistent="false">
<cores ...>
<core name="default" instanceDir="." dataDir="default/data"/>
<core name="development" instanceDir="." dataDir="development/data"/>
<core name="test" instanceDir="." dataDir="test/data"/>
<core name="test0" instanceDir="." dataDir="test/data0"/>
<core name="test1" instanceDir="." dataDir="test/data1"/>
<core name="test2" instanceDir="." dataDir="test/data2"/>
<core name="test3" instanceDir="." dataDir="test/data3"/>
...
</cores>
</solr>
Solr を起動している場合、 rake sunspot:solr:restart
などで再起動をすることでテストの並列実行への対応が反映されます。
Solr に接続する Sunspot で並列でテストを実行するための設定を行う
次に config/sunspot.yml の path
の末尾に並列プロセスを割り振るための ENV['TEST_ENV_NUMBER']
を追加します。
test:
solr:
hostname: localhost
port: 8983
user: foobarbaz
pass: foobarbaz
path: /solr/test<%= ENV['TEST_ENV_NUMBER'].to_i %>
また、環境変数 ENV['SOLR_URL']
を用いて、spec/spec_helper.rb などで以下のような Solr のリセットを行っている場合は、その SOLR_URL に対しても ENV['TEST_ENV_NUMBER']
を追加します。
config.after do
ENV['SOLR_URL'] = "http://foobarbaz:foobarbaz@localhost:8983/solr/test#{ENV['TEST_ENV_NUMBER'].to_i}"
Sunspot::Rails.reset
Sunspot.session = Sunspot::Rails.build_session
Sunspot.remove_all!
end
このように Solr の Multi core 機能を利用することで、Solr を使ったテストの並列実行が出来るようになります。