С узлом и мокко

Когда код просто работает, его часто недооценивают. Однако когда код ломается, он торчит, как больной палец. Модульное тестирование - отличный метод обеспечения того, что код работает так, как ожидалось, и продолжает работать, когда происходят обновления.

Это руководство представляет собой введение в концепции модульного тестирования с использованием Node и Mocha.

Начиная

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

Сначала создайте новый каталог и запустите npm с настройками по умолчанию. Затем создайте два файла с именами nameChecker.js и test / testNameChecker.js. Команды терминала описаны ниже.

Затем добавьте следующий код в nameChecker.js.

Эта функция принимает имя, сравнивает его с validNames и возвращает сообщение. Затем функция экспортируется для использования в нашем приложении.

Запуск nameChecker

В конце концов мы напишем тесты, а пока добавим следующее в test / testNameChecker.js. Это импортирует только что созданный модуль nameChecker.js, проверит, действителен ли Brutus, и зарегистрирует ответ.

Используйте следующую команду терминала для запуска testNameChecker.js.

node test/testNameChecker.js

Результат: Брут действителен!

Добавление модульного теста

Теперь, когда у нас есть работающая функция, пора добавить тестовое покрытие. Начните с установки Mocha с помощью следующей команды. Mocha - это фреймворк, который упрощает запуск и оценку модульных тестов.

npm i --save-dev mocha

Что такое модульный тест?

Прежде чем мы напишем тест, что такое модульный тест? Модульное тестирование должно подтвердить, что отдельная часть программного обеспечения постоянно работает так, как ожидалось. В случае с нашей проверкой имени мы хотим подтвердить, что Брут - допустимое имя.

Написание модульного теста

Замените test / testNameChecker.js следующим кодом:

В приведенном выше теге description описывается логическая группа тестов, а определяется, чего должен достичь отдельный тест. Все, что находится внутри функции it (), является нашим первым модульным тестом.

должен вывести «Брут действителен!» тест пытается подтвердить, когда nameChecker пройден Брут, Брут действителен! возвращается. Это проверяется утверждением, что наше ожидаемое значение совпадает с фактическим значением, возвращаемым функцией.

Запуск модульного теста

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

node_modules/mocha/bin/mocha

Как вы можете видеть выше, Mocha запускается и подтверждает, что nameChecker, вызванный с помощью Brutus, проходит. Чтобы увидеть альтернативу, измените значение, переданное в nameChecker, и снова запустите тест.

Когда тест не проходит, Mocha указывает причину сбоя теста и ожидаемые / фактические значения, которые были получены. В этом случае наше утверждение не удалось, потому что мы ожидали значение Brutus is valid!, но получили Недействительное имя.

Прежде чем двигаться дальше, измените свой тест, чтобы он снова сдавался.

Больше тестов!

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

Новый тест приведен ниже, но сначала попробуйте написать этот тест самостоятельно. Практика - ключ к освоению новых навыков!

После нового теста весь файл test / testNameChecker.js должен выглядеть примерно так:

Тест недопустимого имени очень похож на наш первый, но ожидаемое значение изменилось с Brutus is valid! на Недействительное имя, и в функцию nameChecker передается другой аргумент.

Разработка через тестирование

Теперь, когда мы погрузились в пресловутый пул модульного тестирования, давайте немного продвинемся и попробуем свои силы в разработке через тестирование (TDD).

В TDD желаемая функциональность записывается в тестовые примеры, которые изначально терпят неудачу. Затем код приложения пишется, чтобы удовлетворить эти тесты, доказывая, что функциональность была создана только для обозначенных случаев использования.

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

Изменение стиля nameChecker TDD

Когда мы создавали nameChecker, Ремус услышал о новой классной функциональности и захотел принять участие в вечеринке. От имени TTD сначала напишите тест, который ожидает, что nameChecker, вызванный с Remus, вернет Remus is valid!

После того, как вы построите этот тест, запустите тесты и посмотрите, что произойдет. Если вы застряли, тестовый код приведен ниже.

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

Измените массив validNames в nameChecker.js с

const validNames = ['Brutus']

to

const validNames = ['Remus']

и снова запустите тесты.

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

Измените validNames еще раз на следующее и запустите тесты.

const validNames = ['Brutus', 'Remus']

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

Выводы

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

Вам нравятся такие сообщения? Следуйте за мной в Twitter @ andepaulj