Bisect(二分探索)
RSpecの--order random
と--seed
オプションは、他の1つ以上の例が最初に実行された場合にのみ失敗する揺れる例を浮かび上がらせるのに役立ちます。失敗を引き起こす正確な例の組み合わせを特定するのは非常に困難 です。--bisect
フラグは、この問題を解決するのに役立ちます。
--seed
と他のオプションに加えて--bisect
オプションを渡すと、RSpecは繰り返しスイートのサブセットを実行して、同じ失敗を再現する最小の例のセットを特定します。
二分探索の実行中にいつでもctrl-cを押すと、それまでに発見された最小の再現コマンドが表示されます。
詳細な出力を取得するには(特にbisectのバグを報告する場合に便利です)、--bisect=verbose
を使用します。
背景
次の内容で「lib/calculator.rb」という名前のファイルがあるとします:
class Calculator
def self.add(x, y)
x + y
end
end
次の内容で「spec/calculator_1_spec.rb」という名前のファイルがあるとします:
require 'calculator'
RSpec.describe "Calculator" do
it 'adds numbers' do
expect(Calculator.add(1, 2)).to eq(3)
end
end
「spec/calculator_2_spec.rb」から「spec/calculator_9_spec.rb」までのファイルには、それぞれ関係のないパスするスペックが含まれています。
次の内容で「spec/calculator_10_spec.rb」という名前のファイルがあるとします:
require 'calculator'
RSpec.describe "Monkey patched Calculator" do
it 'does screwy math' do
# monkey patching `Calculator` affects examples that are
# executed after this one!
def Calculator.add(x, y)
x - y
end
expect(Calculator.add(5, 10)).to eq(-5)
end
end
--bisect
フラグを使用して順序依存性の最小再現ケースを作成する
次のコマンドを実行すると:
rspec --seed 1234
出力には「10 examples, 1 failure」という文言が含まれるはずです。
次のコマンドを実行すると:
rspec --seed 1234 --bisect
bisectは、次のような出力で成功するはずです:
Bisect started using options: "--seed 1234"
Running suite to find failures... (0.16755 seconds)
Starting bisect with 1 failing example and 9 non-failing examples.
Checking that failure(s) are order-dependent... failure appears to be order-dependent
Round 1: bisecting over non-failing examples 1-9 .. ignoring examples 6-9 (0.30166 seconds)
Round 2: bisecting over non-failing examples 1-5 .. ignoring examples 4-5 (0.30306 seconds)
Round 3: bisecting over non-failing examples 1-3 .. ignoring example 3 (0.33292 seconds)
Round 4: bisecting over non-failing examples 1-2 . ignoring example 1 (0.16476 seconds)
Bisect complete! Reduced necessary non-failing examples from 9 to 1 in 1.26 seconds.
The minimal reproduction command is:
rspec ./spec/calculator_10_spec.rb[1:1] ./spec/calculator_1_spec.rb[1:1] --seed 1234
次のコマンドを実行すると:
rspec ./spec/calculator_10_spec.rb[1:1] ./spec/calculator_1_spec.rb[1:1] --seed 1234
出力には「2 examples, 1 failure」という文言が含まれるはずです。