Тестирование программного обеспечения является неотъемлемой частью разработки программного обеспечения и обеспечения качества. Тестирование может помочь нам писать более качественный и качественный код, заблаговременно выявлять неоднозначности, выявлять регрессию, уверенно проводить рефакторинг, а также развертывать его в рабочей среде, наслаждаясь чашечкой кофе ☕.
Нам нужен структурированный тест с тестовыми примерами, которые проверяют различное поведение нашего приложения. Mocha — это среда JavaScript, которая организует наши тестовые примеры и запускает их для нас. Хотя Mocha не будет проверять поведение наших тестов, мы собираемся использовать библиотеку Nodejs assert
для проверки поведения наших тестов.
NodeJS — это среда выполнения, построенная на движке Chrome V8, которая позволяет нам писать и запускать JavaScript вне веб-браузера. Node.js использует модель неблокирующего ввода-вывода, управляемую событиями, что делает его легким и эффективным, идеально подходящим для приложений реального времени, интенсивно использующих данные, которые работают на распределенных устройствах.
Модули NodeJS — это блоки кода с определенными функциями, которые можно использовать с внешним приложением на основе их соответствующих функций. Основная идея модулей NodeJS — инкапсуляция, возможность повторного использования и модульность. Модули можно разделить на три части, такие как:
- локальные модули: это модули, которые мы можем создавать локально в нашем приложении и повторно использовать в нашем приложении.
- сторонние модули: это модули, которые предоставляются из внешних источников, отличных от нашего локального приложения и основных модулей NodeJS. Mocha — это сторонний модуль, который мы должны установить из внешних источников.
Предпосылки
Пример использования основного модуля NodeJS
Мы напишем простое приложение NodeJS с именем core_modules.js
, которое использует встроенный модуль path
для вывода типа расширения нашей программы, который равен .js
.
Функции path.extname
принимают строковый аргумент (путь) и возвращают расширение файла в пути. Когда мы запускаем этот код, выполнив команду node core_modules.js
в нашем терминале. process.argv
— это массив, а второй элемент (индекс 1
) в нем — это путь к нашему работающему файлу JavaScript.
Запустив приведенный выше код, мы должны получить результат: .js
.
Теперь мы собираемся написать модуль NodeJS, который имитирует приложение для управления студентами. Этот модуль сможет хранить список студентов, добавлять новых студентов в список, получать список студентов и оценивать успеваемость студентов в диапазоне от 0 до 100.
Имея указанные выше предварительные условия, мы создадим новую папку и инициализируем среду нашего приложения. В нашем терминале мы создадим новую папку, выполнив команду
Измените текущий рабочий каталог нашего терминала на папку students-manager
, запустив
Далее мы инициализируем npm, что необходимо, потому что мы собираемся установить Mocha через npm.
Параметр -y
позволяет npm запускать наш проект, используя параметры по умолчанию:
Мы создадим файл index.js
, в котором мы сможем начать писать наш модуль NodeJS.
В приведенном выше коде мы создали класс с конструктором, который принимает массив строк (имена учащихся) в качестве аргумента и преобразует каждый элемент массива в объект со свойствами id
, name
и performance
. #students
— это закрытое свойство класса, к которому можно получить доступ только внутри.
generateId
— это вспомогательная функция, которая увеличивает переменную counter
на единицу и возвращает текущее значение counter
. Возвращенное значение будет использоваться для создания уникального id
для каждого созданного учащегося.
generateId
и counter
представляют особенность модулей, то есть инкапсуляцию. Инкапсуляция помогает нам скрыть реализацию и раскрыть функциональность. Реальный сценарий - это то, как работают автомобили, многие из нас на самом деле не знают, как работают двигатели и система передач, мы подвергаемся воздействию функциональности автомобиля, который в основном управляет автомобилем.
Давайте создадим метод с именем для добавления ученика в список учеников:
Метод add()
берет строку (имя учащегося) и создает объект, в котором строка является свойством name
, а производительность учащегося устанавливается равной null
.
Что, если мы хотим добавить группу имен учащихся, было бы целесообразно добавить одно имя или несколько аргументов имени, используя одну и ту же функцию, поэтому мы перепишем метод add()
.
Далее мы добавим метод с именем getStudent()
, который возвращает массив учащихся и их данные.
Метод getStudent()
работает двумя способами в зависимости от того, передается ли studentIdOrName
в качестве параметра. studentIdOrName
может быть идентификатором студента (число) или именем студента (строка).
Метод возвращает только одного студента, если найден id
или name
студента, в противном случае он просто возвращает весь список студентов.
Мы используем filter()
, который является методом массива. filter()
перебирает каждый элемент в массиве и делает этот элемент доступным через функцию обратного вызова, которую мы ему передали. Если обратный вызов возвращает true, filter()
включает этот элемент в свой результат.
Давайте создадим метод, позволяющий оценивать учащихся. Функция будет принимать два аргумента: один для идентификатора учащегося, а другой для оценки учащегося, которая должна быть числом от 0 до . 100.
Наш метод score()
проверяет, находится ли performance
в диапазоне 0–100, если аргумент меньше 0 или больше 100, мы поднять ошибку. Метод проверяет список студентов и находит студента с похожим id
, указанным в первом аргументе метода.
До сих пор файл index.js
еще не был модулем, поэтому нам нужно экспортировать его, чтобы его можно было повторно использовать в нашем локальном приложении, и протестировать его.
NodeJS использует соглашение CommonJS для модулей, поэтому теперь наш модуль экспортирован и готов к использованию в нашем локальном приложении.
После этого наш index.js
должен быть похож на этот:
Далее мы вручную воспользуемся нашим проектом и посмотрим, как он работает.
Мы создаем файл demo.js
в корневом каталоге нашей папки students-manager и используем модуль, вызывая функцию require
.
Когда мы запускаем это приложение, вызывая node demo.js
, мы видим результат, подтверждающий, что модуль работает должным образом.
Вот скриншот результата:
Помните, когда мы говорили о модуле NodeJS, мы говорили о различных типах модулей, assert
— это встроенный модуль, а mocha — внешний модуль, поэтому мы должны установить его в наш проект, используя npm.
В нашем терминале, убедившись, что мы все еще находимся в каталоге students-manager
, мы установим mocha, выполнив команду:
Флаг --save-dev
сохраняет mocha как зависимость разработки в нашем NodeJS, потому что мы хотим писать тесты только на этапах разработки и не включать их в производственные развертывания.
Давайте создадим наш тестовый файл с именем index.test.js
и включим наш локальный модуль StudentManager
, а также модуль asset
в текущий рабочий каталог:
Mocha помогает нам организовывать и запускать наши тесты. Структура теста обычно имеет следующую структуру:
Функция it
содержит наш тестовый код. Здесь мы используем наш модуль assert для тестирования нашего модуля StudentManagement
.
Функция describe
не является обязательной для Mocha для запуска нашего теста, но она помогает группировать наши тесты и легко ими управлять.
Давайте определим наши тестовые случаи и напишем реализацию этих тестовых случаев.
Тестовые случаи
- инициализируем наш модуль тремя именами: Авель, Бен и Каин
- подтвердите, что модуль имеет в общей сложности трех студентов
- добавить двух новых студентов и подтвердить, что количество студентов увеличилось до пяти
- оценка Abel с 50 и убедитесь, что оценка включена в показатель производительности Abel
- наберите Бену 120 и подтвердите, что модуль выдает ошибку
Тестовая реализация
Пошаговое руководство по коду
describe()
: эта функция, как мы упоминали ранее, используется для группировки наших тестов и добавления описания к тесту. Поскольку мы добавили наш тест в этот блок, методbefore()
— это хук, который запускается до запуска первого теста. В этом блоке определенtestClass
, чтобы сделать его глобально доступным для всех наших тестов.assert.equal()
проверяет, равны ли две переменные, он использует оператор==
. Этот тип проверки на равенство пытается преобразовать переменные разных типов в одно и то же время, в отличие отassert.strictEqual()
.assert.strictEqual()
использует оператор===
.assert.deepEqual()
используется для проверки равенства объектов, которая выполняет сравнение перечислимых свойств объекта.
Чтобы запустить наш тест, мы собираемся использовать Mocha, выполнив приведенную ниже команду в нашем терминале в корне нашего текущего рабочего каталога, который является students-manager
:
Но в npm есть функция, с помощью которой мы можем определять различные наборы команд и делать их простыми и общедоступными. Команды находятся в разделе scripts
нашего файла package.json
.
Когда мы запустили npm init -y
, npm создает для нас файл package.json
, а когда мы установили Mocha, npm обновил этот файл для использования с установленными зависимостями.
Давайте создадим наш скрипт с именем:
Тогда наш окончательный package.json
должен быть похож на этот:
Теперь давайте начнем наш тест, запустив в нашем терминале:
Вывод нашего теста в терминале:
В этом руководстве мы познакомились с модулями NodeJS, как требовать модули в нашем приложении и как создать наш модуль. Мы создали NodeJS, который имитирует приложение для управления студентами, и написали тесты, основанные на функциях, предоставляемых модулем с Mocha, и утверждали для проверки нашего теста, и наслаждались чашкой кофе, делая это.
Mocha — это многофункциональная среда тестирования JavaScript, работающая на NodeJS и в браузере, что делает асинхронное тестирование простым и забавным. Тесты Mocha запускаются последовательно, что позволяет создавать гибкие и точные отчеты при сопоставлении неперехваченных исключений с правильными тестовыми примерами.
Испытайте себя, написав тесты для своих последующих модулей NodeJS.
Чтобы глубже погрузиться в Mocha, вы можете ознакомиться с официальной документацией Mocha. А чтобы продолжить изучение модуля NodeJS, вы можете ознакомиться с Документацией NodeJS по модулям.
Если вам нравится читать эту статью, вы можете подумать о том, чтобы купить мне кофе.
Первоначально опубликовано на blog.z4ff.dev