Rakeタスクで異なる条件下でのRSpecを実行する手法
はじめに
Rakeタスクは、Rubyのプログラムで構成されるビルドツールであるRake (Ruby Make) の一部です。
プロジェクトにおいて、異なるあるデータごとに結合テストを実行したいケースがある場合の、Rakeタスクを使用して自動化する方法を紹介します。
今回の手法が役に立つケース
同じテストコードを異なる条件下で繰り返し実行する必要があり、Rakeタスクを用いた上記の方法が効率的にテストを行うための有用な手段となります。
異なるユーザーロールのテスト
異なるユーザーロールごとにアクセス権限や表示内容が変わる機能のテスト。
マルチテナント環境のテスト
複数のテナントが存在し、テナントごとに異なる設定やデータを持つシステムのテスト。
異なるデバイスやブラウザのテスト
サイトやアプリケーションが異なるデバイスやブラウザで正しく動作するかのテスト。
異なる設定オプションのテスト
ソフトウェアが複数の設定オプションを持ち、それぞれの組み合わせで正しく動作するかのテスト。
時間帯や日付に依存するテスト
システムが異なる時間帯や日付に対応している場合のテスト。
Rakeタスクの作成
以下の例では、異なる商品カテゴリごとにテストを実行します。
namespace :product_test do desc '各商品カテゴリの動作を確認するためのテストを実行する' task :categories do CATEGORIES = [ :category_electronics, :category_books, :category_clothing, # 他のカテゴリ ] CATEGORIES.each do |category_name| ENV['CURRENT_CATEGORY'] = category_name.to_s puts "#{category_name}のテストを実行開始..." Rake::Task["spec"].execute end ENV['CURRENT_CATEGORY'] = nil end end
エラーハンドリング
タスクの実行中にエラーが発生した場合の処理を追加することが重要です。
begin # テストの実行 rescue => e puts "エラーが発生しました: #{e.message}" # その他のエラー処理 end
環境変数の使用
テストの中で現在のカテゴリを知るために、環境変数を使用します。
Rakeタスク内で環境変数に値をセットし、テスト内でその値を取得することで、テストの処理に引数として渡すことができます。
Rakeタスクで環境変数に値をセット
Rakeタスク内で、category_name
を環境変数にセットします。
ENV['CURRENT_CATEGORY'] = category_name.to_s
テスト内で環境変数から値を取得
テストファイル内で、環境変数から値を取得し、テストの処理に使用します。
RSpec.describe 'Category Test' do let(:current_category) { ENV['CURRENT_CATEGORY'] } it 'does something with the category' do # current_category を使用したテストの処理 end end
上記のように環境変数を利用することでRakeタスクで設定したカテゴリ名をテストの処理で使用することができています。
環境変数を使用することで、テストの実行時に動的に値を渡すことが可能になり、柔軟なテストの実装が可能になります。
コマンドの実行
上記のRakeタスクを実行するためには、コマンドラインから以下のコマンドを実行します。
rake product_test:categories
CATEGORIES
配列に定義された各カテゴリに対してテストが順番に実行されます。
各カテゴリのテストが開始する際に、そのカテゴリ名がコンソールに出力され、テストの進行状況を確認することができます。
おしまい
コメント
本記事の内容は以上になります!
プログラミングスクールのご紹介 (卒業生より)
お世話になったプログラミングスクールであるRUNTEQです♪
こちらのリンクを経由すると1万円引きになります。
RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。
もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。