2016-04-13 9 views
5

Mam przypadek testowy, który musi korzystać z losową liczbę całkowitą, więc mam:Pierwsze ziarno i używanie liczb losowych w przypadków testowych ExUnit

test "test with random integer" do  
    IO.inspect :random.uniform(10) 
    assert true 
end 

To zawsze drukuje 4 podczas uruchamiania go, choć widzę różne nasiona w wyjścia konsoli:

Randomized with seed 197796 
... 
Randomized with seed 124069 

wiem, że powinienem użyć :random.seed/1 lub :random.seed/3. Chcę użyć tego samego materiału siewnego, który jest wydrukowany na końcu wyjścia testowego. W ten sposób, jeśli mój test się nie powiedzie można replikować go

mix test --seed 124069 

nie mogę zrobić, jeśli używam :random.seed(:erlang.now) na przykład.

W jaki sposób mogę uzyskać materiał siewny, z którego korzysta program ExUnit do randomizowania jego przypadków testowych w walizce testowej?

Odpowiedz

5

Problemem jest to, że dostępne są tylko ręcznie ustawić opcje podczas wywoływania

ExUnit.configuration 

Więc ja ustawiania nasienie ręcznie w moim test_helpers.exs:

ExUnit.configure seed: elem(:os.timestamp, 2) 

Nasienie jest ustawiony w taki sam sposób przez ExUnit, jeśli nie określam ręcznie: https://github.com/elixir-lang/elixir/blob/master/lib/ex_unit/lib/ex_unit/runner.ex#L54

Teraz w moim teście mogę wykonać:

s = ExUnit.configuration |> Keyword.get(:seed) 
:random.seed(s, s, s) #random enough for me 
IO.inspect :random.uniform(5) 

Za każdym razem uruchomić testy uzyskać piękny losową wartość, ale jeśli mogę użyć

mix test --seed <seed> 

dostanę taką samą wartość za każdym razem.

Powiązane problemy