※現在、ブログ記事を移行中のため一部表示が崩れる場合がございます。
順次修正対応にあたっておりますので何卒ご了承いただけますよう、お願い致します。

RSpecで特定のテストケースのみを実行する方法


2013年 03月 13日

RSpecでテストを書いていると、特定のSpecの、特定のテストケースのみを実行したい場合があります。

プロジェクト初期のうちはSpecも少なく、全てのテストケースを実行していても気にならないかもしれません。
しかし、プロジェクトが進むに連れて、Specファイルがどんどん膨れ上がっていきます。
そんなSpecに新しいテストケースを追加して実行なんてしようものなら、まあテストに時間がかかって、イライラします。
全体テストなんてJenkinsにやらせればいいんです。私は今追加したテストケースだけをテストしたいんです。

RSpecには、特定のテストケースのみを実行する機能が備わっています。

例えば、次のようなspec(ファイル名:spec/test.spec)があるとします。

describe "#ほにゃらら" do
  it "ケースAの場合はxxxとなること" do
    ...
  end

  it "ケースBの場合はxxxとなること" do
      ...
  end
end

RSpecは、以下のように行数を指定して実行をすることができます。

rspec spec/test.spec:7

上記コマンドで、test.specファイルの7行目にあるテストケースを実行することができます。
つまり、「ケースBの場合はxxxとなること」だけを実行できるわけです。

「今時わざわざコンソールからrspecなんて入力してテスト実行しないよ、Guard + Sporkで自動テストを走らせてるよ!」

そんな方は、RSpecのfilter_runを利用すると幸せになります。

filter runを利用するためには、あらかじめ spec/spec_helper.rb に、下記のような設定を加えて置く必要があります。

  RSpec.configure do |config|
    config.filter_run :focus => true
    config.run_all_when_everything_filtered = true
  end

spec側に :focus => true と記述すると、特定のspecのみ実行できます。

  describe "#ほにゃらら" do
    it "ケースAの場合はxxxとなること" do
      ...
    end

    it "ケースBの場合はxxxとなること", :focus => true do
      ...
    end
  end

上記のように設定すると、guardでも「ケースBの場合はxxxとなること」だけが走るようになります。
focus => trueは、describe, context, it に利用することができます。例えば、次のようにdescribeにも設定可能です。

  describe "既存のテストケース" do
    it "xxx"
    it "xxx"
  end

  describe "新しく追加するテストケース", :focus => true do
    it "xxxとなること" do
    end
  end

これで余計なテストが走らなくなり、今書いているテストだけを何回も実行できますね。

テストを書き終わったら、:focus => trueを外すのを忘れずに!私はよく忘れます。