Настройка порогов покрытия

Порог покрытия (coverage threshold) в Mocha — это настройка, которая позволяет контролировать минимальный процент покрытия кода тестами, необходимый для успешного прохождения тестирования. Эта функция полезна для обеспечения качественного тестирования и предотвращения пропуска важных участков кода. Важно настроить правильный порог покрытия, чтобы тесты оставались эффективными и код не был лишён критической проверки.

Важность порогов покрытия

Порог покрытия кода помогает:

  • Обеспечить минимальный уровень тестирования, гарантируя, что важные части кода всегда протестированы.
  • Повысить качество кода, выявляя участки, которые не покрыты тестами.
  • Позволить команде разработки отслеживать улучшения покрытия в процессе работы над проектом.
  • Убедиться, что изменения в коде не снижены уровень тестирования, создавая «пустые» места без проверок.

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

Для настройки порога покрытия в Mocha обычно используется инструмент Istanbul, который анализирует покрытие кода, и его обёртка — NYC. Они предоставляют полную информацию о покрытии кода и позволяют задавать пороги, которые проверяются при запуске тестов.

  1. Установка зависимостей

    Для начала необходимо установить необходимые пакеты:

    npm install --save-dev mocha nyc
  2. Конфигурация в package.json

    Настройка порога покрытия осуществляется через конфигурацию в файле package.json. Для этого добавляется секция nyc, где указывается минимальный процент покрытия для разных типов покрытия (например, для строк, функций и линий).

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

    {
      "scripts": {
        "test": "mocha"
      },
      "nyc": {
        "all": true,
        "check-coverage": true,
        "branches": 90,
        "functions": 95,
        "lines": 98,
        "statements": 95
      }
    }

    В данном примере:

    • branches — минимальный порог покрытия для ветвлений (ветвление кода).
    • functions — минимальный порог покрытия для функций.
    • lines — минимальный порог покрытия для строк.
    • statements — минимальный порог покрытия для операторов.

    Эти значения означают, что для успешного прохождения тестов необходимо обеспечить покрытие не менее 90% для ветвлений, 95% для функций, 98% для строк и 95% для операторов.

  3. Параметры командной строки

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

    nyc --lines 95 mocha
  4. Игнорирование файлов

    Иногда необходимо исключить определённые файлы или директории из подсчёта покрытия. Для этого можно использовать параметр exclude в конфигурации:

    {
      "nyc": {
        "exclude": [
          "test/**",
          "src/utils/**"
        ]
      }
    }

    В данном случае тесты в папке test/ и утилиты в src/utils/ не будут учитываться при подсчёте покрытия.

Как работает проверка порога покрытия

После выполнения тестов, инструменты покрытия (например, NYC) анализируют результаты тестов и вычисляют процент покрытия для каждого типа — строк, функций, ветвлений и операторов. Затем они проверяют, соответствуют ли эти проценты заданным порогам. Если хотя бы один из порогов не выполнен, тесты завершатся с ошибкой.

Пример ошибки:

----------------------------|---------|----------|---------|---------|-------------------
File                        | % Stmts | % Branch | % Funcs | % Lines | Uncovered Lines
----------------------------|---------|----------|---------|---------|-------------------
All files                   |   94.92 |    88.71 |   93.98 |   95.56 |                 
 src/app.js                 |   85.56 |    73.14 |   88.57 |   89.23 | 45-56, 78-80        
----------------------------|---------|----------|---------|---------|-------------------
Test failed: coverage threshold not met.

В этом примере видно, что порог покрытия для ветвлений (% Branch) не был выполнен, так как минимальный порог был установлен на 90%, а фактическое покрытие составило 88.71%.

Оповещения и выход с ошибкой

Чтобы автоматически завершать тесты с ошибкой при несоответствии порога, необходимо использовать флаг check-coverage. Он заставит Mocha завершить выполнение тестов с кодом ошибки, если покрытие не достигло минимального значения:

{
  "nyc": {
    "check-coverage": true,
    "branches": 90,
    "functions": 95,
    "lines": 98,
    "statements": 95
  }
}

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

Использование --branches, --functions, --lines для тонкой настройки

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

nyc --branches 90 --functions 95 --lines 98 --statements 95 mocha

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

Исключения из покрытия

Некоторые участки кода не всегда подходят для тестирования. Для таких случаев Mocha и NYC позволяют использовать комментарии для исключения частей кода из подсчёта покрытия.

Пример:

/* istanbul ignore next */
function nonTestableFunction() {
  // Этот код не будет учитыватьсь в подсчете покрытия
}

Это позволяет избежать включения сложных или незначительных участков в отчёт о покрытии, сохраняя фокус на тестируемых частях программы.

Интеграция с CI/CD

Настройка порога покрытия является важной частью процесса интеграции с системой CI/CD. Для этого необходимо добавить соответствующую настройку в файл конфигурации CI (например, .gitlab-ci.yml, .github/workflows и т.д.). Важно, чтобы порог покрытия был проверен на каждом этапе тестирования, чтобы автоматически отклонять запросы на слияние или деплой, если покрытие кода упало ниже минимального порога.

Пример конфигурации для GitHub Actions:

name: Test and Coverage

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '14'
      - run: npm install
      - run: npm test

Для интеграции с системой CI/CD нужно убедиться, что скрипты для тестирования и покрытия корректно выполняются, а также настраиваются оповещения при падении покрытия ниже допустимого уровня.

Рекомендации по настройке порогов покрытия

  1. Умеренные пороги: Не стоит сразу устанавливать слишком высокие пороги покрытия (например, 100%), так как это может привести к фальшивым ошибкам в тестах, если какие-то участки кода по умолчанию не покрываются.

  2. Регулярные ревизии: Важно регулярно проверять и корректировать пороги покрытия, чтобы они соответствовали реальным требованиям к проекту.

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

  4. Отслеживание изменений: Использование порогов покрытия помогает отслеживать изменения в тестировании при добавлении нового функционала.