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

Нам нужен структурированный тест с тестовыми примерами, которые проверяют различное поведение нашего приложения. 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 и подтвердите, что модуль выдает ошибку

Тестовая реализация

Пошаговое руководство по коду

  1. describe(): эта функция, как мы упоминали ранее, используется для группировки наших тестов и добавления описания к тесту. Поскольку мы добавили наш тест в этот блок, метод before() — это хук, который запускается до запуска первого теста. В этом блоке определен testClass, чтобы сделать его глобально доступным для всех наших тестов.
  2. assert.equal() проверяет, равны ли две переменные, он использует оператор ==. Этот тип проверки на равенство пытается преобразовать переменные разных типов в одно и то же время, в отличие от assert.strictEqual(). assert.strictEqual() использует оператор ===.
  3. 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