Введение

Представьте себе, как строители возводят высокую ровную стену? Они проверяют каждый уложенный блок отвесом, чтобы убедиться, что он расположен на прямой линии. Точно так же каждый разработчик проверяет каждую функцию, метод и код, чтобы убедиться, что они дают ожидаемый результат.

Модульное тестирование (unit testing) - это один из ранних этапов разработки программного обеспечения. Это процесс, в ходе которого самая маленькая, тестируемая часть приложения проверяется на соответствие своему назначению. Он включает в себя выделение кода, такого как функция или метод, в небольшие независимые единицы и тестирование их по отдельности. Идея состоит в том, чтобы выбрать эти функции и методы и изолировать их, заменив внешние зависимости, такие как сетевое соединение и база данных, фиктивными объектами.

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

Модульное тестирование является компонентом разработки на основе тестов (TDD). TDD - это методология, которая включает в себя три критических взаимосвязанных действия: модульное тестирование, кодирование и проектирование (в форме рефакторинга кода). TDD - это все о красно-зеленом тестировании. Это означает, что мы написали бы тест, провалили тест, а затем, наконец, написали код, чтобы пройти тест.

Свойства хорошего модульного теста

  • Небольшой и целенаправленный: тестирование одного блока кода упрощает отладку и поиск источника проблемы.
  • Пишите тест перед кодом. Это облегчает разработчикам размышления о функциональности и понятности кода. Это упрощает написание тестируемого кода.
  • Используйте описательные имена тестов. Это важно, поскольку помогает разработчикам понять, для чего предназначен тестовый код.
  • Используйте утверждения (выражения, содержащие тестируемый код), чтобы убедиться, что выходные данные кода соответствуют желаемому поведению.
  • Тестирование пограничных случаев, таких как граничные условия, null, пустой ввод и другие менее распространенные сценарии, которые все же могут возникнуть.
  • Регулярно запускайте тесты.
  • Рефакторируйте код и убедитесь, что он тестирует целевую функциональность.

Преимущества модульного тестирования

  • Помогает обнаружить ошибки на ранней стадии.
  • Облегчает разработчику изменение кодовой базы.
  • Удешевляет исправление ошибок.
  • Повышает качество кода.
  • Ускоряет цикл разработки, поскольку сокращает время на отладку.

Недостатки модульного тестирования

  • Не обнаружит все ошибки.
  • Не обнаружит ошибки при интеграции с другими наборами данных.
  • Для тестирования одной строки кода необходимо написать несколько строк тестового кода.
  • Имеет крутую кривую обучения.

Как написать простой модульный тест

Рассмотрим пример простого модульного теста в JavaScript с использованием Jest.

// functions.js
const functions = {
    add: (num1, num2) => num1 + num2,
}
module.exports = functions

// functions.test.js
const functions = require('./function')

test('Adds 2 + 2 to equal 4', () => {
  expect(functions.add(2,2)).toBe(4);
});

// В терминале введите npm test, чтобы проверить код, прошел ли он или нет.

Этот тест проверит, возвращает ли функция add() правильный результат при передаче ей аргументов 2 и 2. Если тест пройден, в терминале будет выведено "PASS". Если тест не пройден, в терминале будет выведено "FAIL" и предоставлена дополнительная информация об ошибке.

Модульное тестирование является важной частью процесса разработки программного обеспечения. Оно может помочь улучшить качество вашего кода и уменьшить количество ошибок в вашем приложении.