メインコンテンツまでスキップ

--only-failures オプションの使用方法

--only-failures オプションは、前回実行時に失敗した例だけを実行するようにフィルタリングします。このオプションを使用するには、まず config.example_status_persistence_file_path を設定する必要があります。RSpecは、前回実行時の各例のステータスを保存するためにこの設定を使用します。

また、--next-failure オプションもあります。これは --only-failures --fail-fast --order defined の省略形です。これにより、現在失敗している例のうち1つに集中し、次の失敗に移行するなど、繰り返し実行することができます。

これらのオプションは、他のディレクトリやファイル名と組み合わせることもできます。RSpecは、ロードされた例のセットから失敗した例のみを実行します。

背景

以下の内容で "spec/spec_helper.rb" という名前のファイルがあるとします。

RSpec.configure do |c|
c.example_status_persistence_file_path = "examples.txt"
end

また、以下の内容で ".rspec" という名前のファイルがあるとします。

--require spec_helper
--order random
--format documentation

さらに、以下の内容で "spec/array_spec.rb" という名前のファイルがあるとします。

RSpec.describe 'Array' do
it "checks for inclusion of 1" do
expect([1, 2]).to include(1)
end

it "checks for inclusion of 2" do
expect([1, 2]).to include(2)
end

it "checks for inclusion of 3" do
expect([1, 2]).to include(3) # failure
end
end

そして、以下の内容で "spec/string_spec.rb" という名前のファイルがあるとします。

RSpec.describe 'String' do
it "checks for inclusion of 'foo'" do
expect("food").to include('foo')
end

it "checks for inclusion of 'bar'" do
expect("food").to include('bar') # failure
end

it "checks for inclusion of 'baz'" do
expect("bazzy").to include('baz')
end

it "checks for inclusion of 'foobar'" do
expect("food").to include('foobar') # failure
end
end

さらに、以下の内容で "spec/passing_spec.rb" という名前のファイルがあるとします。

puts "Loading passing_spec.rb"

RSpec.describe "A passing spec" do
it "passes" do
expect(1).to eq(1)
end
end

そして、一度 rspec を実行した結果が "8 examples, 3 failures" であるとします。

rspec --only-failures を実行すると、失敗した例のみをロードして実行します

rspec --only-failures を実行すると

rspec --only-failures の出力に "3 examples, 3 failures" が含まれるはずです

また、rspec --only-failures の出力に "Loading passing_spec.rb" が含まれていないはずです。

--only-failures オプションをファイル名と組み合わせる

rspec spec/array_spec.rb --only-failures を実行すると

出力に "1 example, 1 failure" が含まれるはずです。

rspec spec/string_spec.rb --only-failures を実行すると

出力に "2 examples, 2 failures" が含まれるはずです。

--next-failure オプションを使用して単一の失敗を繰り返し実行する

rspec --next-failure を実行すると

出力に "1 example, 1 failure" が含まれるはずです。

そして、出力には「3の含まれていることをチェックする」というテキストが含まれている必要があります。

もし「spec/array_spec.rb」を修正して、「to include(3)」を「not_to include(3)」に置き換えると、

そしてrspec --next-failureを実行すると、

すると、出力には「2つの例、1つの失敗」というテキストが含まれている必要があります。

そして、出力には「3の含まれていることをチェックする」というテキストが含まれている必要があります。

そして、出力には「'bar'の含まれていることをチェックする」というテキストが含まれている必要があります。

もし「spec/string_spec.rb」を修正して、「to include('bar')」を「not_to include('bar')」に置き換えると、

そしてrspec --next-failureを実行すると、

すると、出力には「2つの例、1つの失敗」というテキストが含まれている必要があります。

そして、出力には「'bar'の含まれていることをチェックする」というテキストが含まれている必要があります。

そして、出力には「'foobar'の含まれていることをチェックする」というテキストが含まれている必要があります。

もし「spec/string_spec.rb」を修正して、「to include('foobar')」を「not_to include('foobar')」に置き換えると、

そしてrspec --next-failureを実行すると、

すると、出力には「1つの例、0つの失敗」というテキストが含まれている必要があります。

そして、出力には「'foobar'の含まれていることをチェックする」というテキストが含まれている必要があります。

もしrspec --next-failureを実行すると、

すると、出力には「すべての例がフィルタリングされました」というテキストが含まれている必要があります。

rspec --only-failuresを実行してもパスするspecファイルは実行されません

もしrspec spec/passing_spec.rb --only-failuresを実行すると、

すると、出力には「0つの例、0つの失敗」というテキストが含まれている必要があります。

example_status_persistence_file_pathを設定せずに--only-failuresを使用すると明確なエラーが表示されます

もしexample_status_persistence_file_pathを設定していない場合、

そしてrspec --only-failuresを実行すると、

すると、出力には「--only-failuresを使用するには、まずconfig.example_status_persistence_file_pathを設定する必要があります。」というテキストが含まれている必要があります。