В шутку, каков наилучший способ перебора массива входных данных и ожидаемых результатов?

#unit-testing #testing #jestjs #automated-tests

#модульное тестирование #тестирование #jestjs #автоматизированные тесты

Вопрос:

Если я хочу написать тест для калькулятора, который объединяет вещи. Я мог бы определить свои тесты следующим образом:

 const tests = [
    {
      input: [1, 2],
      expected: 3,
    },
    {
      input: [2, 1],
      expected: 3,
    },
    {
      input: [3, 4],
      expected: 7,
    },
    {
      input: [2, 10],
      expected: 12,
    },
    {
      input: [2, 5],
      expected: 7,
    },
    ...
]

  tests.forEach((t) => {
    expect(add(t.input)).toEqual(t.expected)
  })
  

Проблема в том, что если один из этих тестов завершается неудачей, ошибка просто говорит:

     Expected: "7"
    Received: "10"

      216 |   tests.forEach((t) => {
    > 217 |     expect(add(t.input)).toEqual(t.expected)
          |                                        ^
      218 |   })
  

Исходя из этого, я не могу сказать, было ли 3 4 вычислено неправильно, или 2 5 было вычислено неправильно.

Альтернативный вариант — вместо массива определить каждый из них как отдельный тест. Однако для этого требуется намного больше кода, и вам нужно везде копировать и вставлять expect инструкцию.

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

Ответ №1:

Вы можете использовать тест jest.каждый, чтобы определить их как отдельные тестовые примеры:

 test.each(tests)('add %j', ({ input, expected }) => {
  expect(add(input)).toEqual(expected)
})
  

но еще лучше вы бы определили tests следующим образом, чтобы воспользоваться преимуществами форматирования printf:

 const tests = [
  [[1,2], 3],
  [[2,1],3],
  [[3,4],7],
  [[2,10],12],
  [[2,5],7]
]

test.each(tests)('add(%j) should equal %d', (input, expected) => {
  expect(add(input)).toEqual(expected)
})
  

рабочий пример