【问题标题】:What's the preferred way to implement Data Driven Testing using Elixir/ExUnit?使用 Elixir/ExUnit 实施数据驱动测试的首选方法是什么?
【发布时间】:2015-05-08 02:16:42
【问题描述】:

我想为输入数据和预期结果的几个手工组合重用测试用例的相同代码,但不复制粘贴每组的代码。其他语言的框架以不同的方式支持它,例如 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 不是最好的框架?

【问题讨论】:

    标签: testing elixir data-driven-tests


    【解决方案1】:

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

    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 中保持变量和断言的简单性。

    【讨论】:

    • 我看到这种方法的问题是,如果任何示例失败,整个测试都会失败。
    • @MachinesAreUs 是真的,但是由于assert 是一个宏(并打印您正在测试的代码),ExUnit 在告诉您出了什么问题方面做得非常出色。您会看到Math.max/2 failed,但您仍然可以看到失败的案例。我能想到的唯一缺点是您当时只会看到一个错误。如果这对您很重要,请使用@FredtheMagicWonderDog 的解决方案。
    【解决方案2】:

    您还可以使用枚举来包装测试定义。 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 2015-10-29
      相关资源
      最近更新 更多