Каков предпочтительный способ реализации Data Driven Testing с использованием Elixir/ExUnit?

Я хотел бы повторно использовать один и тот же код тестового примера для нескольких созданных вручную комбинаций входных данных и ожидаемых результатов, но без копирования кода для каждого набора. Фреймворки на других языках поддерживают его по-разному, например, в 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 не лучший фреймворк для этого?


person MachinesAreUs    schedule 07.05.2015    source источник


Ответы (2)


Я думаю, вы могли бы сделать что-то очень простое, например:

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.

person whatyouhide    schedule 07.05.2015
comment
Проблема, которую я вижу в этом подходе, заключается в том, что если какой-либо из примеров не пройден, вы получите провал всего теста. - person MachinesAreUs; 08.05.2015
comment
@MachinesAreUs правда, но ExUnit отлично справляется с тем, что сообщает вам, что пошло не так, благодаря тому, что assert является макросом (и печатает код, который вы тестируете). Вы бы увидели Math.max/2 failed, но все равно смогли бы увидеть, какой случай не удался. Единственный недостаток, о котором я могу думать, это то, что вы увидите только одну ошибку за раз; если это важно для вас, воспользуйтесь решением @FredtheMagicWonderDog. - person whatyouhide; 09.05.2015

Вы также можете обернуть определения тестов с помощью перечислимого. Блог Дэйва Томаса содержит расширенный пример.

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

Я не уверен, что для такого относительно простого теста этот подход лучше, но для более сложных тестов это может обеспечить лучшую отчетность, и вы можете динамически создавать тесты во время тестирования, используя функцию, как в записи блога.

person Fred the Magic Wonder Dog    schedule 07.05.2015