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