我有一个需要使用随机整数的测试用例,所以我有:
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用于在测试用例中随机化其测试用例的种子?
答案 0 :(得分:5)
问题是调用
时只能手动设置选项ExUnit.configuration
所以我在我的test_helpers.exs
:
ExUnit.configure seed: elem(:os.timestamp, 2)
如果我没有手动指定,ExUnit会以相同的方式设置种子: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)