Почему, что и как модульное тестирование

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

Давайте рассмотрим несколько примеров, чтобы получить представление о разнообразии Jest и посмотреть, как мы можем использовать его для тестирования регулярных выражений и массивов.

Здесь мы тестируем случаи, нечувствительные к регистру. Так же, как и регулярные выражения, i гарантирует, что он нечувствителен к регистру, поэтому тест будет пройден, если полученный алфавит и ожидаемый не имеют такой же случай. Чтобы проверить чувствительные к тесту случаи, мы должны удалить i из регулярных выражений, что гарантирует, что тест будет пройден только тогда, когда ожидаемые и полученные значения имеют одинаковые случаи.

Jest имеет богатый API с многочисленными встроенными методами, что позволяет легко тестировать практически все варианты использования.

Хотя Jest предлагает множество сопоставителей, вам могут понадобиться только .toBe / .toEqual, и вы сможете многого добиться только с помощью этих сопоставителей.

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

Давайте перейдем к немного продвинутому тестовому сценарию. Создайте новый файл и назовите его newUser.js и поместите в него следующее содержимое.

Функция в основном возвращает пользовательский объект с firstName и lastName. Давайте создадим тестовый файл с именем newUser.test.js, чтобы проверить поведение некоторых функций.

Этот тест должен пройти, так как мы ожидаем, что эта функция вернет объект John Doe, и это то, что она фактически делает в определении функции. Давайте запустим это и посмотрим, что мы получим.

Здесь мы видим, что тест не пройден, хотя ожидаемые значения и полученные значения совпадают. В сообщении об ошибке также есть несколько приятных подсказок, объясняющих, почему это не удалось. В данном случае проблема заключается в используемом нами сопоставителе toBe. toBe следует использовать для примитивных типов, таких как строки или числа. но объекты или массивы являются ссылочными типами в JavaScript. Это означает, что объекты имеют одинаковые значения, но поскольку они хранятся в другом месте памяти, они не будут считаться одинаковыми в JavaScript. В результате тест завершается неудачно, так как и функциональный объект, и тестовый объект имеют разные ссылки в ячейке памяти.

Теперь давайте исправим этот тест, используя сопоставитель toEqual из Jest, который можно использовать для проверки равенства объектов или массивов.

И запустив на этот раз набор тестов, мы видим, что тест проходит, как и ожидалось.

Для реальных приложений большинство операций будут асинхронными, например вызов API и выборка некоторых данных. Одна из полезных функций Jest — возможность тестировать не только синхронные действия, но и асинхронные. Давайте проверим реальный сценарий, как тестировать асинхронные операции.

Создайте новый файл и назовите его getUser.js и добавьте следующее содержимое.

Для выполнения вызовов API мы можем использовать встроенный метод fetch, который поставляется с node-fetch, или мы можем использовать любые внешние пакеты, такие как axios. Здесь мы в основном делаем вызов jsonplaceholder typicode, который является бесплатным поддельным API для тестирования и прототипирования, чтобы получить некоторые тестовые данные.

Теперь давайте напишем тестовый пример, чтобы увидеть, ведет ли асинхронная операция ожидаемое поведение.

Как вы можете видеть выше, Jest позволяет нам выполнять тесты асинхронных операций. Меня действительно поражает, когда я вижу, насколько разнообразна и сильна Jest. Здесь мы используем асинхронную функцию с ключевым словом async, которая возвращает обещание, и мы ждем, пока обещание будет разрешено, а затем проверяем полученные данные.

Давайте запустим этот тест и посмотрим на результат. В функции getUser мы отправляем запрос на получение номера пользователя 9. Мы также можем проверить, работает ли вызов fetch должным образом, перейдя к типикоду jsonplaceholder url где мы можем проверить пользователя вместе с его свойствами.

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

Как получить отчет о тестовом покрытии с помощью Jest?

Одной из полезных функций Jest является Отчет о покрытии. Это дает нам понимание того, какой процент утверждений/ветвей для нашего программного обеспечения покрыт тестами. Это также показывает нам, какие строки покрыты, а какие нет, что упрощает добавление тестов для соответствующих строк, которые не полностью покрыты.

Чтобы проверить отчет о покрытии, просто используйте флаг покрытия —.

Отчет о покрытии также можно создать, настроив Jest в файле package.json и запустив его впоследствии.

Добавьте следующую конфигурацию в файл package.json:

Для получения дополнительной информации о настройке Jest вы также можете ознакомиться с документацией здесь.

Давайте запустим первый написанный нами тест для сложения чисел с флагом —coverage и получим для него отчет о покрытии.

Заключение

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

Как мы уже видели, тестирование с помощью Jest довольно простое, но очень мощное. Это дает доступ к множеству различных методов и функций для тестирования практически всех возможных сценариев нашего варианта использования, и мы едва коснулись поверхности. Для получения дополнительной документации не стесняйтесь заглянуть на официальный веб-сайт Jest. Тема тестирования очень глубока, но, надеюсь, это поможет вам понять процесс тестирования и побудит вас приступить к разработке. ваши собственные тесты. Удачного кодирования!