Mocha позволяет выполнять тесты прямо из командной строки, что значительно упрощает процесс их запуска и интеграции в рабочие процессы, например, в систему непрерывной интеграции (CI). Для начала работы с запуском тестов через командную строку необходимо разобраться с несколькими аспектами: установкой Mocha, базовой настройкой и доступными опциями запуска.
Для того чтобы начать использовать Mocha, его нужно установить. Существуют два основных способа установки: глобальная и локальная.
Глобальная установка:
Глобальная установка Mocha позволяет использовать команду
mocha из любой директории на вашем компьютере. Для этого
достаточно выполнить команду:
npm install -g mocha
После этого тесты можно запускать с помощью команды
mocha в любой папке, где находятся тесты.
Локальная установка:
Локальная установка Mocha предпочтительнее в большинстве случаев, так как она позволяет зафиксировать версию Mocha в проекте и обеспечивает совместимость с другими зависимостями. Для этого нужно выполнить:
npm install --save-dev mocha
В этом случае запуск тестов будет осуществляться через
npx mocha, так как npx позволяет выполнять
локально установленные пакеты без необходимости их глобальной
установки.
Обычно тесты располагаются в отдельной директории, например,
test или tests. Структура папок может
выглядеть следующим образом:
my-project/
├── node_modules/
├── test/
│ ├── example.test.js
├── package.json
└── package-lock.json
Тесты пишутся в отдельных JavaScript-файлах с использованием стандартных методов Mocha. Например:
const assert = require('assert');
describe('Математические операции', function () {
it('должен возвращать 4 при сложении 2 и 2', function () {
assert.strictEqual(2 + 2, 4);
});
});
Чтобы запустить тесты из командной строки, достаточно использовать
команду mocha с указанием пути к тестам:
mocha test/example.test.js
Если тесты находятся в директории test, можно указать её
напрямую:
mocha test
Mocha будет рекурсивно искать все файлы с расширением
.js внутри указанной папки и выполнять их.
Mocha предоставляет множество опций для гибкой настройки запуска тестов.
–reporter:
Опция позволяет выбрать репортер для вывода результатов тестирования. Например:
mocha --reporter spec test
Среди популярных репортеров:
spec — выводит результаты в виде дерева, показывая
иерархию тестов и их статусы.dot — выводит результаты в виде точек.nyan — выводит результат с анимированным котом.–timeout:
Эта опция задает максимальное время выполнения каждого теста в миллисекундах. Если тест не завершится в установленный срок, он будет прерван.
mocha --timeout 5000 test
По умолчанию Mocha использует значение таймаута 2000 миллисекунд для каждого теста.
–grep:
Опция позволяет запускать только те тесты, которые соответствуют регулярному выражению. Это полезно, если нужно запустить только определённые тесты.
mocha --grep "сложение" test
В этом примере будут запущены только те тесты, в названии которых встречается слово “сложение”.
–invert:
Вместе с опцией --grep эта опция инвертирует фильтрацию:
тесты, не соответствующие регулярному выражению, будут выполнены.
mocha --grep "сложение" --invert test–bail:
Если указан флаг --bail, Mocha завершит выполнение
тестов при первой ошибке, не дожидаясь завершения остальных тестов.
mocha --bail test–watch:
При использовании опции --watch Mocha будет отслеживать
изменения в тестовых файлах и автоматически перезапускать тесты, когда
файл изменяется. Это полезно при разработке и активной работе над
кодом.
mocha --watch
Это поведение особенно полезно в связке с редакторами кода, которые позволяют автоматически сохранять изменения, что делает процесс тестирования быстрым и непрерывным.
–require:
Опция позволяет загрузить дополнительные модули перед запуском тестов. Это может быть полезно, например, если требуется настроить Babel для транспиляции ES6/ES7 в ES5 перед запуском тестов.
mocha --require babel-register test
В этом примере перед запуском тестов будет загружен модуль
babel-register, который позволит Mocha поддерживать
синтаксис ES6.
–exit:
При использовании этой опции Mocha принудительно завершит процесс Node.js после выполнения всех тестов. Это полезно в случаях, когда не все асинхронные операции успели завершиться, но тесты уже завершились.
mocha --exit test
В обычных условиях Mocha сам управляет завершением процесса, но иногда при работе с нестандартными асинхронными операциями или в сложных окружениях может потребоваться явное завершение.
Mocha поддерживает асинхронные тесты, что позволяет запускать их с
помощью колбэков, промисов или async/await. Для асинхронных тестов
необходимо либо передать колбэк в it(), либо вернуть
промис, либо использовать async функцию.
Пример с колбэком:
it('должен выполнить асинхронный запрос', function (done) {
setTimeout(() => {
assert.strictEqual(1 + 1, 2);
done();
}, 1000);
});
Пример с промисом:
it('должен вернуть промис', function () {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, 1000);
});
});
Пример с async/await:
it('должен выполнить асинхронную функцию', async function () {
const result = await someAsyncFunction();
assert.strictEqual(result, 'expected');
});
Mocha автоматически будет ждать завершения промиса или асинхронной функции, прежде чем считать тест завершённым.
Mocha легко интегрируется с системами непрерывной интеграции (CI/CD). Это особенно важно для автоматического тестирования при каждом изменении в коде.
При использовании Mocha в таких системах рекомендуется настраивать
репортеры, которые будут выводить результаты тестов в удобном формате
для CI-систем, таких как mocha-junit-reporter или
mocha-teamcity-reporter.
Пример использования репортера для JUnit-совместимого формата:
mocha --reporter mocha-junit-reporter --reporter-options mochaFile=results/test-results.xml
Этот формат легко читается большинством CI-систем и позволяет интегрировать результаты тестов в отчёты и дашборды.
Запуск тестов с использованием командной строки в Mocha предлагает большое количество гибких опций для настройки процесса тестирования. Эти возможности полезны как для локальной разработки, так и для интеграции в CI/CD пайплайны. Опции, такие как использование репортеров, асинхронных тестов и фильтрация по регулярным выражениям, позволяют значительно упростить и ускорить процесс разработки и тестирования.