在ExUnit测试用例中获取种子并使用随机数

tko*_*wal 6 random elixir

我有一个需要使用随机整数的测试用例,所以我有:

test "test with random integer" do      
  IO.inspect :random.uniform(10)
  assert true
end
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它总是打印4,即使我可以在控制台输出中看到不同的种子:

Randomized with seed 197796
...
Randomized with seed 124069
Run Code Online (Sandbox Code Playgroud)

我知道我应该使用:random.seed/1:random.seed/3.我想使用与测试输出结束时打印的种子相同的种子.这样,如果我的测试失败,我可以复制它

mix test --seed 124069
Run Code Online (Sandbox Code Playgroud)

如果我使用的话,我不能这样做:random.seed(:erlang.now).

如何获取ExUnit用于在测试用例中随机化其测试用例的种子?

tko*_*wal 5

问题是调用时只能手动设置选项

ExUnit.configuration
Run Code Online (Sandbox Code Playgroud)

所以我在我的手动设置种子test_helpers.exs:

ExUnit.configure seed: elem(:os.timestamp, 2)
Run Code Online (Sandbox Code Playgroud)

如果我没有手动指定,ExU​​nit会以相同的方式设置种子:https://github.com/elixir-lang/elixir/blob/master/lib/ex_unit/lib/ex_unit/runner.ex#L54

现在在我的测试中,我可以做到:

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

我每次运行测试时都会得到很好的随机值,但是如果我使用的话

mix test --seed <seed>
Run Code Online (Sandbox Code Playgroud)

我每次都会获得相同的价值.