使用Elixir/ExUnit实现数据驱动测试的首选方法是什么?

Mac*_*eUs 5 testing elixir data-driven-tests

我想为几个手工组合的输入数据和预期结果重用相同的测试用例代码,但不需要对每个集合的代码进行复制.其他语言的框架以不同的方式支持它,例如在Groovy/Spock中:

def "maximum of two numbers"(int a, int b, int c) {
        expect:
        Math.max(a, b) == c

        where:
        a | b | c
        1 | 3 | 3
        7 | 4 | 4
        0 | 0 | 0
}
Run Code Online (Sandbox Code Playgroud)

在ExUnit中执行此操作的首选方法是什么?也许ExUnit不是最好的框架吗?

wha*_*ide 7

我想你可以做一些非常简单的事情:

test "Math.max/2" do
  data = [
    {1, 3, 3},
    {7, 4, 4},
  ]

  for {a, b, c} <- data do
    assert Math.max(b, c) == a
  end
end
Run Code Online (Sandbox Code Playgroud)

在我看来,模式匹配可以让你在做这些事情时非常明确.你可以在ExUnit中保持变量和断言的简单性.


Fre*_*Dog 6

您还可以使用可枚举包装测试定义.戴夫托马斯的博客提供了一个扩展的例子.

data = [
  {1, 3, 3},
  {7, 4, 4},
]

for {a,b,c} <- data do
  @a a
  @b b
  @c c
  test "func "<>@a<>", "<>@b<>" equals"<>@c do  
    assert fun(@a,@b) == @c 
  end
end
Run Code Online (Sandbox Code Playgroud)

对于这样的相对简单的测试,我不确定这种方法是否更好,但是对于更复杂的测试,这可以提供更好的报告,并且您可以通过使用博客条目中的函数在测试时动态创建测试.