テストの実行ごとに再現可能なランダム化
Rubyでは、ランダム性はsrand
を呼び出して使用したいシードを渡すことで初期化されます。これにより、rand
、shuffle
、sample
などの後続の呼び出しは、同じシードが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