#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)
})