Yanonoblog!

こつこつと

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です♪

https://runteq.jp/r/ohtFwbjW

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

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

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

https://twitter.com/outputky