RSpecで特定のディレクトリのテストのみを実行する方法
はじめに
Rakeタスクは、Rubyのプログラムで構成されるビルドツールであるRake (Ruby Make) の一部です。
今回はRakeタスクとRSpecを使用して特定のディレクトリのテストのみを実行、自動化する方法を紹介します。
Rakeタスクのカスタマイズ
Rakeタスクを使用して、特定のディレクトリのテストのみを実行する方法をカスタマイズすることができます。
以下は、その一例です。
namespace :custom_test do desc '各職種ごとの動作を確認するためのテストを実行する' task :positions do POSITIONS = [ :position_manager, :position_employee, ] POSITIONS.each do |position_name| begin ENV['CURRENT_POSITION'] = position_name.to_s ENV['RAKE_TASK_EXECUTION'] = 'true' puts "#{position_name}のテストを実行開始..." # /spec/positions ディレクトリ配下のspecファイルのみを読み込むように指定 Rake::Task["spec"].clear # 既存のタスクの定義をクリア RSpec::Core::RakeTask.new(:spec) do |t| t.pattern = './spec/positions/**/*_spec.rb' end Rake::Task["spec"].execute rescue => e puts "エラー: #{position_name}のテスト中に問題が発生しました。エラー詳細: #{e.message}" end end ENV['CURRENT_POSITION'] = nil ENV['RAKE_TASK_EXECUTION'] = nil end end
Rakeタスクのカスタマイズにおける詳細解説
Rake::Task["spec"].clear
Rakeモジュールに含まれるTaskクラスのクラスメソッド [] を使用しています。
このメソッドは、タスク名を引数として受け取り、その名前に対応するタスクオブジェクトを返します。
"spec"というタスクオブジェクトのclearメソッドで、現在の定義をクリアします。
Rakeタスクは一度定義されると、その後の実行で再定義することができません。
しかし、clearメソッドを使用することで、既存のタスクの定義を削除し、新しい定義を追加することができます。
RSpec::Core::RakeTask.new(:spec)
RSpecのコアモジュールに含まれるRakeTaskクラスを使用して、新しいRSpecのテストを実行するためのRakeタスクのインスタンスを生成しています。
:specは、新しく定義するRakeタスクの名前を示しています。
RSpec::Core::RakeTaskクラスを使用することで、RakeのタスクとしてRSpecのテストを簡単に実行することができます。
do |t|
この部分は、新しく定義するRakeタスクの設定を行うためのブロックを開始しています。|t|は、新しく定義するRakeタスクのインスタンスを参照するための変数です。
t.pattern = './spec/positions/*/_spec.rb’
この行は、Rakeタスクが実行する際に読み込むテストファイルのパターンを指定しています。
./spec/positions/ディレクトリ以下のすべての*_spec.rbという名前のファイルを対象としています。
*/は任意のサブディレクトリを示し、_spec.rbは_spec.rbで終わる任意のファイルを示しています。
Rake::Task["spec"].execute
上で新しく定義した"spec"という名前のRakeタスクを実行します。
このタスクは、上で指定したパターンに一致するテストファイルを対象としてRSpecのテストを実行します。
RSpecのテスト実行時の読み込み内容
通常のRSpecのテスト実行時には、デフォルトの設定やspec_helper.rb、rails_helper.rbなどの設定に基づいて、/specディレクトリ配下のすべての*_spec.rbファイルが読み込まれます。
したがって、特定のRakeタスク内でRSpecのタスクを再定義して特定のディレクトリやファイルのみを読み込むように指定した場合、そのRakeタスクを実行したときだけその指定が適用されます。
公式ドキュメントの参照
RSpecやRakeタスクの詳細な使い方やオプションについては、公式ドキュメントを参照してください。
おしまい
コメント
本記事の内容は以上になります!
プログラミングスクールのご紹介 (卒業生より)
お世話になったプログラミングスクールであるRUNTEQです♪
こちらのリンクを経由すると1万円引きになります。
RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。
もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。