2016-04-13 7 views
5

ho un banco di prova che ha bisogno di utilizzare un intero casuale, quindi non ho:Come seme e utilizzando numeri casuali nei casi di test ExUnit

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

Questo stampa sempre 4 quando l'eseguo, anche se posso vedere diversi semi in uscita della console:

Randomized with seed 197796 
... 
Randomized with seed 124069 

so che dovrei usare :random.seed/1 o :random.seed/3. Voglio usare lo stesso seme che viene stampato alla fine dell'output di test. In questo modo se il mio test fallisce posso replicare con

mix test --seed 124069 

io non posso farlo, se sto usando :random.seed(:erlang.now) per esempio.

Come posso ottenere il seme che ExUnit utilizza per randomizzare i suoi casi di test all'interno del test case?

risposta

5

Il problema è che sono disponibili solo le opzioni impostare manualmente al momento della chiamata

ExUnit.configuration 

Quindi io pongo il seme manualmente nel mio test_helpers.exs:

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

Il seme è impostato allo stesso modo da ExUnit se non lo specifichi manualmente: https://github.com/elixir-lang/elixir/blob/master/lib/ex_unit/lib/ex_unit/runner.ex#L54

Ora nel mio test posso fare:

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

Ogni volta che esegue il test ottengo bel valore casuale, ma se uso

mix test --seed <seed> 

mi metterò lo stesso valore ogni volta.