Yanonoblog!

こつこつと

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.rbrails_helper.rbなどの設定に基づいて、/specディレクトリ配下のすべての*_spec.rbファイルが読み込まれます。

したがって、特定のRakeタスク内でRSpecのタスクを再定義して特定のディレクトリやファイルのみを読み込むように指定した場合、そのRakeタスクを実行したときだけその指定が適用されます。

公式ドキュメントの参照

RSpecやRakeタスクの詳細な使い方やオプションについては、公式ドキュメントを参照してください。

おしまい

コメント

本記事の内容は以上になります!


プログラミングスクールのご紹介 (卒業生より)

お世話になったプログラミングスクールであるRUNTEQです♪

https://runteq.jp/r/ohtFwbjW

こちらのリンクを経由すると1万円引きになります。

RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。

もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。

https://twitter.com/outputky