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

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


Это усложняет поддержку тестов

Представьте, что у вас есть следующая функция:

function multiply(x, y) {
  let total = 0;
  for (let i = 0; i < y; i++) {
    total = add(total, x);
  }
  return total;
}

function add(total, quantity) {
  return total + quantity;
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

И тогда у вас есть следующие тесты:

test("returns the correct result", () => {
  expect(multiply(5, 3)).toEqual(15);
});

test("calls the add function the correct number of times", () => {
  multiply(5, 3);
  expect(add).toHaveBeenCalledTimes(3);
});
Войти в полноэкранный режим

Выйти из полноэкранного режима

В первом тесте мы проверяем, что выход метода является правильным. Но во втором тесте мы тестируем детали реализации. Если кто-то позже придет и обновит нашу функцию до следующего:

function multiply(x, y) {
  return x * y;
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

Первый тест все равно пройдет, но второй не пройдет. Функция все еще работает нормально, результат ожидаемый. Но все же нам нужно пойти и обновить тесты, потому что один из них возвращает ложноотрицательный.

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

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

Тестируя вывод нашего кода, мы улучшаем опыт разработчиков, что приводит к улучшению качества кода нашего программного обеспечения.

Должно быть легко узнать, работает ли наш код после рефакторинга или нет.


Ресурсы