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

时间:2016-04-13 12:22:59

标签: random elixir

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

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

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

Randomized with seed 197796
...
Randomized with seed 124069

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

复制它
mix test --seed 124069

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

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

2 个答案:

答案 0 :(得分:5)

问题是调用

时只能手动设置选项
ExUnit.configuration

所以我在我的test_helpers.exs

中手动设置种子
ExUnit.configure seed: elem(:os.timestamp, 2)

如果我没有手动指定,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)

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

mix test --seed <seed>

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

答案 1 :(得分:0)

截至本文回答之时,您可以通过调用以下命令在测试内部使用随机种子:

ExUnit.configuration()[:seed]

对于具有随机数但需要可重复进行调试的动态测试而言,这非常好,这是问题的目标。例如,如果您想要一个介于0到9之间的数字,则可以使用:

  seedable_random_number_under_10 = rem(ExUnit.configuration()[:seed], 10)