使用代理

时间:2016-01-28 13:20:31

标签: unit-testing elixir

我知道,默认情况下,ExUnit.Case是同步的(根据文档http://elixir-lang.org/docs/stable/ex_unit/ExUnit.Case.html)。 我也读过这个问题(https://github.com/elixir-lang/elixir/issues/3580),看来Case中的测试函数是串行运行的。

当我运行一个没有全局状态的简单测试用例时,确实是连续运行的。

但是当我在Agent中使用全局状态时,执行顺序取决于运气。对于同样的呼叫

mix test --trace

执行顺序改变。这是我的测试套件:

defmodule SerialTest do
  use ExUnit.Case

  test "1" do
    Agent.update(:card_id, fn nil -> 1 end)
    assert true
  end

  test "2" do
    res = Agent.get(:card_id, fn res -> res end)
    assert res == 1
  end

  test "3" do
    Agent.update(:card_id, fn id -> 3 end)
    assert true
  end

  test "4" do
    res = Agent.get(:card_id, fn res -> res end)
    assert res == 3
  end
end

有时有时不过去。 如何使我的函数的执行顺序符合使用代理的全局状态定义它们的文件中的声明顺序?

2 个答案:

答案 0 :(得分:3)

测试按顺序进行,但它们以随机顺序运行。您的测试失败,因为它们依赖于顺序,因为它们会改变某些全局状态。

当您运行套件时,您会在底部看到:

Randomized with seed 596046

您可以通过将ExUnit.configure seed: 0添加到test_helper.exs来禁用它,但我建议您将测试设置为与订单无关。

答案 1 :(得分:0)

我能够使测试用例按照使用seed标志定义的顺序运行。

--seed 0 --trace