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を外すのを忘れずに!私はよく忘れます。