IMAGE: https://cdn-ak.f.st-hatena.com/images/fotolife/i/ikmbear/20220209/20220209071635.png
きっかけ
先日開発したGemはActiveRecordへの対応を仕様として盛り込んでいるため、Appraisalを使って、複数verのActiveRecordでテストができるようにしています。
それはそれでいいんですが、この状態でいつものようにRubyMine上からテストを実行しようとすると、Appraisalで指定しているはずのGem(ActiveRecord)がないためにテストが落ちるようになってしまいました(ActiveRecordからAppraisal経由でテストをすれば問題なくとおる)。
というわけで今回はAppraisalを経由しても、RubyMine上でテストを実行できるようにしていきます。
TL:DR;
- Apppraisalを導入する場合、各種コマンドは
bundle exec appraisal
の形式で呼び出す必要がある。 - RubyMine標準のRSpec実行は
bundle exec rspec ….
であるため、Appraisalが導入されていて、そこでインストールされたGemに依存する実装・テストを書いている場合、RubyMine経由でRSpecが実行できなくなる。 - AppraisalのCLIを経由するscriptを作成し、RubyMineに設定することで、RubyMine経由でもRSpecを個別に実行できるようになる。
前提のおさらい
Appraisal
Appraisalはthoutbot社が管理している、複数のバージョンでのテストを同時に行うためのGemです。
公式READMEからの拝借になりますが、以下のように指定することで、Railsの3と4の双方の環境でテストを実行することができます。通常のGemfileでは1つのGemに対して、1つのバージョンしか指定できないため、複数環境に対応したい場合に重宝します。
Appraisalを使用する場合、各種コマンドは次のように実行することになります。
RubyMineでのRSpec実行
RubyMineではテスティングGUIに関係なく、GUI上でテストの実行ができます。
一括実行と個別実行の双方を行うことができます。
内部的には、各テスティング$1のexampleやname指定のオプションなどを付与しながら、bundle exec rspec
を実行しているだけです。
問題点
上記の通り、Apppraisalはbundle exec appraisal
の形式で各コマンドを呼び出すことで、指定した環境のGemfileでコマンドを実行することができます。
逆にいえばAppraisalを経由しないと、Appraisalで指定したGemfileは認識されません。冒頭に述べた通り、Appraisalは複数のバージョンでのテストを可能にするためのGemなので、Appraisalを経由しない = テストが実行できない ということです。
RubyMineでのテスト実行はAppraisalを経由しない形式になっているので、結果としてAppraisalを利用すると、テストが実行できないということになります。
対応策
以下の2ステップで対応します。
- Appraisal経由でテストを実行するscriptを作成する
- 1のscriptをRubyMineに認識させる。
scriptを作成する
AppraisalのIssueを確認していると、同じような問題が起票されていました。
AppraisalにCLIがあるので、それを間接的に呼び出すようです。このコードでは特定のAppraisal環境をしていするようになっていますが、とりあえずすべてのAppraisal環境で実行するように少し修正しました。
RubyMineにscriptを認識させる
RubyMineのGUI実行は、それぞれ実行の構成を指定することができます。
複数の構成に対して、まとめて設定を行うためには「Edit configuration templates…」を選択します。
左側のサイドバーからRSpecを選択し、「Use cutom RSpec runner script」に、1で作成したscriptを設定します。scriptはどこにおいてもいいですが、Appraisalはプロジェクト固有のものだと思うので、私はプロジェクトのbinフォルダにおいています。
これにより、RubyMineがRSpecを実行するときは、このコマンドを実行するようになります。
実行結果
これらの設定でRSpec実行時にAppraisalのCLIが走るようになり、Gemfileを指定した状態でテストが実行できるようになりました。
感想
Appraisalで作成した環境に対してCLI実行する分にはこのCLIでいいんですが、「ある特定のテストを特定の環境でのみ実行したい」というケースは対応できないので、対応できるようにしておきたいです(CLIの引数処理→Appraisal CLIの引数処理の部分だけクリアできれば、ちゃちゃっとできると思うので)。