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

テストの実行ごとに再現可能なランダム化

Rubyでは、ランダム性はsrandを呼び出して使用したいシードを渡すことで初期化されます。これにより、randshufflesampleなどの後続の呼び出しは、同じシードがsrandに渡された場合には常に同じようにランダム化されます。

RSpecは、ランダム性を伴うアクション(例:テスト順のランダム化)を実行する際に、直接ランダム化を初期化しないように注意しています。

RSpecはsrandを実行しないため、ランダム化のシードをどのように初期化するかは自由に選択できます。

以下に、RSpecのシードを使用する方法の例があります。

もしRSpecの助けを借りずにランダム化のシードを管理したい場合は、以下のことに注意してください:

  • シードはハードコードされていてはなりません。

    最初の例は、RSpecが使用するシードとは異なるシードでランダム化を初期化することを示すためにのみ使用されています。

  • 選択されたシードを報告してください。

    テストの実行時に使用されたランダム化を再現するためには、どのシードが使用されたかを誰かが知っている必要があります。

  • テストにシードを渡すメカニズムを提供してください。

    これがない場合、特定のテストのランダム性を再現するためには、srandの呼び出しをハードコードする必要があります。

背景

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

--require spec_helper

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

RSpec.describe 'randomized example' do
it 'prints random numbers' do
puts 5.times.map { rand(99) }.join("-")
end
end

srandを使用してシードを指定すると予測可能なランダム化が得られます

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

srand 123

rspecを実行すると、

出力に"66-92-98-17-83"が含まれているはずです。

RSpecのシードをsrandに渡すと予測可能なランダム化が得られます

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

srand RSpec.configuration.seed

rspec --seed 123を実行すると、

出力に"66-92-98-17-83"が含まれているはずです。