Интеграция с Istanbul

Istanbul — это инструмент для анализа покрытия кода в JavaScript, который позволяет оценить, насколько хорошо тесты покрывают приложение. Используя Istanbul в связке с Mocha, можно не только запускать тесты, но и получать статистику покрытия, которая поможет выявить неохваченные участки кода. Это важно для повышения качества и надежности тестируемых приложений.

Установка и настройка Istanbul

Для начала необходимо установить Istanbul, а также Mocha, если это ещё не было сделано. Установка осуществляется через менеджер пакетов npm:

npm install --save-dev mocha istanbul

После установки пакетов можно настроить Mocha для работы с Istanbul.

Настройка скриптов для запуска с Istanbul

Для того чтобы интегрировать Istanbul с Mocha, необходимо запускать тесты через инструмент istanbul или использовать его команду через Mocha. Один из способов — использовать команду nyc (современная версия Istanbul).

Для начала установим nyc:

npm install --save-dev nyc

Теперь добавим в package.json раздел с командой для тестирования с покрытием:

"scripts": {
  "test": "nyc mocha"
}

С помощью этого скрипта можно запускать тесты с анализом покрытия через команду:

npm test

Основные флаги и параметры nyc

nyc предоставляет несколько полезных флагов для конфигурации анализа покрытия кода. Некоторые из них:

  • --reporter — указывает, в каком формате выводить отчет о покрытии. По умолчанию это будет text, но можно выбрать и другие форматы: lcov, html, json и т.д.

  • --check-coverage — проверка минимального процента покрытия. Например, если требуется, чтобы покрытие было не ниже 80%, можно использовать параметр:

    "scripts": {
      "test": "nyc --check-coverage --lines 80 mocha"
    }
  • --all — позволяет собирать статистику покрытия по всем файлам, а не только по тем, которые участвуют в тестах.

Пример использования флага для HTML-отчета:

"scripts": {
  "test": "nyc --reporter=html mocha"
}

Отчеты о покрытии

После запуска тестов с использованием nyc, отчеты о покрытии будут сохраняться в указанном формате. Если выбран HTML-формат, можно открыть отчет в браузере для более наглядного отображения.

По умолчанию, результаты сохраняются в директорию coverage/, где будет создан файл index.html, который можно открыть и посмотреть подробный отчет о покрытии.

Игнорирование файлов и строк

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

Для игнорирования файлов можно использовать конфигурацию в package.json:

"nyc": {
  "exclude": [
    "test/**",
    "src/someFile.js"
  ]
}

Для игнорирования отдельных строк можно использовать комментарии в коде:

/* istanbul ignore next */
function someFunction() {
  // Эта строка будет проигнорирована Istanbul
}

Пример настройки

Предположим, что необходимо настроить Mocha и Istanbul для простого проекта. В package.json можно добавить следующие настройки:

{
  "name": "my-project",
  "scripts": {
    "test": "nyc mocha"
  },
  "nyc": {
    "reporter": ["text", "html"],
    "check-coverage": true,
    "lines": 80
  },
  "devDependencies": {
    "mocha": "^9.0.0",
    "nyc": "^15.0.0"
  }
}

После этого, запуск команды npm test произведет запуск тестов с анализом покрытия, и будет выведен отчет в консоль, а также сохранен HTML-отчет в папке coverage.

Дополнительные возможности с Istanbul

  1. Конфигурация через файл .nycrc Вместо настройки в package.json можно создать отдельный файл конфигурации .nycrc, где будут прописаны все параметры:

    {
      "reporter": ["text", "lcov"],
      "check-coverage": true,
      "lines": 80
    }
  2. Использование с Babel Если проект использует Babel для транспиляции кода, необходимо настроить Istanbul на работу с транспилированным кодом. Для этого следует установить и настроить @babel/register или babel-register:

    npm install --save-dev @babel/register

    В тестовом файле нужно добавить настройку перед запуском тестов:

    require("@babel/register");

    Это позволит Istanbul правильно работать с кодом, написанным на ES6 или выше.

  3. Покрытие асинхронных тестов Mocha поддерживает асинхронные тесты, и Istanbul также может отслеживать покрытие асинхронных функций. Важно правильно обрабатывать промисы и колбэки, чтобы отчет был точным. Например:

    it('should resolve promise', async function () {
      const result = await someAsyncFunction();
      assert.equal(result, 'expected');
    });

    В этом случае, Mocha и Istanbul автоматически обработают асинхронный тест.

Заключение

Интеграция Mocha с Istanbul (или его современным вариантом, nyc) является мощным инструментом для анализа покрытия кода. Это позволяет не только запускать тесты, но и получать статистику, которая помогает поддерживать качество и надежность приложения. Тесты с покрытием помогают выявить слабые места в коде и улучшить его тестируемость, что в конечном итоге способствует созданию более стабильных приложений.