RSpecテストの数が数百、数千個になってくるとテストの待ち時間が問題になってきます。個々のテストに「毎回実行する」、「たまに実行する」や「すぐ終わる」、「時間かかる」などの分類ができると便利です。
その際に使用するのがRSpecのtag機能です。
※RSpecのバージョンはRspec3を想定しています。
tagはgroup(describe、context)にもexample(it)にも指定可能で、キー・バリュー形式で指定します。
バリューにはシンボル、文字列、booleanが指定可能です。一箇所に複数のtagを指定することも可能です。
以下の例で緑の部分がtagになります。
describe 'in describe' do let(:b){ true } let(:i){ 1 } let(:s){ 'hello' } context 'in context 1', speed: :slow do it "is true", priority: 'high' do expect(b).to eq(true) end it "is 1", simple: true do expect(i).to eq(1) end it "is hello", priority: 'low' do expect(s).to eq('hello') end end context 'in context 2', speed: :fast do it "is true", priority: 'low' do expect(b).to eq(true) end it "is 1", simple: true, priority: 'low',speed: :slow do expect(i).to eq(1) end it "is hello", priority: 'high' do expect(s).to eq('hello') end end end
特定のtagのみテストを実行する際にはrspecコマンドに–tag(もしくは-t)オプションを指定します。
tagキーは頭に@をつけて実行します。
speed: :slowのみをテスト
rspec spec --tag @speed:slow
priority: ‘high’のみをテスト
rspec spec --tag @priority:'high'
simple: trueのみをテスト
rspec spec --tag @simple
※booleanを指定した場合はキーのみで指定可能です。