Запуск тестов из командной строки

Mocha позволяет выполнять тесты прямо из командной строки, что значительно упрощает процесс их запуска и интеграции в рабочие процессы, например, в систему непрерывной интеграции (CI). Для начала работы с запуском тестов через командную строку необходимо разобраться с несколькими аспектами: установкой Mocha, базовой настройкой и доступными опциями запуска.

Установка Mocha

Для того чтобы начать использовать Mocha, его нужно установить. Существуют два основных способа установки: глобальная и локальная.

  1. Глобальная установка:

    Глобальная установка Mocha позволяет использовать команду mocha из любой директории на вашем компьютере. Для этого достаточно выполнить команду:

    npm install -g mocha

    После этого тесты можно запускать с помощью команды mocha в любой папке, где находятся тесты.

  2. Локальная установка:

    Локальная установка 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 предоставляет множество опций для гибкой настройки запуска тестов.

Основные опции
  1. –reporter:

    Опция позволяет выбрать репортер для вывода результатов тестирования. Например:

    mocha --reporter spec test

    Среди популярных репортеров:

    • spec — выводит результаты в виде дерева, показывая иерархию тестов и их статусы.
    • dot — выводит результаты в виде точек.
    • nyan — выводит результат с анимированным котом.
  2. –timeout:

    Эта опция задает максимальное время выполнения каждого теста в миллисекундах. Если тест не завершится в установленный срок, он будет прерван.

    mocha --timeout 5000 test

    По умолчанию Mocha использует значение таймаута 2000 миллисекунд для каждого теста.

  3. –grep:

    Опция позволяет запускать только те тесты, которые соответствуют регулярному выражению. Это полезно, если нужно запустить только определённые тесты.

    mocha --grep "сложение" test

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

  4. –invert:

    Вместе с опцией --grep эта опция инвертирует фильтрацию: тесты, не соответствующие регулярному выражению, будут выполнены.

    mocha --grep "сложение" --invert test
  5. –bail:

    Если указан флаг --bail, Mocha завершит выполнение тестов при первой ошибке, не дожидаясь завершения остальных тестов.

    mocha --bail test
Продвинутые опции
  1. –watch:

    При использовании опции --watch Mocha будет отслеживать изменения в тестовых файлах и автоматически перезапускать тесты, когда файл изменяется. Это полезно при разработке и активной работе над кодом.

    mocha --watch

    Это поведение особенно полезно в связке с редакторами кода, которые позволяют автоматически сохранять изменения, что делает процесс тестирования быстрым и непрерывным.

  2. –require:

    Опция позволяет загрузить дополнительные модули перед запуском тестов. Это может быть полезно, например, если требуется настроить Babel для транспиляции ES6/ES7 в ES5 перед запуском тестов.

    mocha --require babel-register test

    В этом примере перед запуском тестов будет загружен модуль babel-register, который позволит Mocha поддерживать синтаксис ES6.

  3. –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 автоматически будет ждать завершения промиса или асинхронной функции, прежде чем считать тест завершённым.

Работа с тестами в CI/CD

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