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

时间:2015-05-07 16:01:45

标签: 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
}

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

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:5)

您还可以使用可枚举包装测试定义。 Dave Thomas's Blog提供了一个扩展示例。

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

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