Покрытие тестами — это метрика, которая показывает, сколько строк кода или функций тестируется в процессе автоматизированного тестирования. В Jest можно использовать инструменты, позволяющие измерить и проанализировать покрытие, что критически важно для поддержания качества кода. Покрытие помогает выявить участки программы, которые могут быть уязвимы или недостаточно протестированы.
Jest предоставляет встроенные средства для подсчета покрытия, которые
могут быть активированы с помощью флага --coverage. При
запуске тестов с этим флагом Jest анализирует, какие строки кода были
выполнены в процессе тестирования, и выводит отчет, содержащий процент
покрытия.
Пример команды для запуска тестов с покрытием:
jest --coverage
После выполнения этой команды Jest генерирует подробный отчет, который можно просмотреть в консоли или в виде HTML-файла. В отчете будут указаны следующие ключевые метрики:
Для получения отчета в виде HTML можно использовать следующий флаг:
jest --coverage --coverageReporters=html
Анализ покрытия — это не просто проверка процента покрытия. Важно понимать, что высокое покрытие не гарантирует отсутствие ошибок. Однако оно позволяет минимизировать риски, убедившись, что основные пути кода протестированы. Рекомендуется стремиться к высокому покрытию, но также важно учитывать, что:
Чтобы улучшить покрытие тестами, можно использовать несколько стратегий:
Каждый функциональный блок в коде должен покрываться как для обычных, так и для крайних значений. Например, при тестировании функции сортировки нужно учитывать как обычные случаи, так и крайние случаи (пустой список, одноэлементный список, отсортированный список).
Тестирование «положительных» путей — это только половина задачи. Важно не забывать и про тесты на обработку ошибок: исключения, невалидные данные, отказ от внешних сервисов и так далее. Это помогает убедиться, что приложение корректно обрабатывает нештатные ситуации.
В приложениях часто встречаются побочные эффекты, такие как обновление глобальных переменных, отправка запросов на сервер или изменения в базе данных. Такие действия должны тестироваться на соответствие ожидаемому поведению.
Когда необходимо протестировать поведение в условиях, когда внешние зависимости (например, базы данных или API) недоступны, используются моки и шпионы. Это позволяет создать контролируемую среду для тестирования и повысить покрытие.
Если проект уже существует, а покрытие тестами оставляет желать лучшего, то можно двигаться к цели постепенными шагами. Например, можно начать с покрытия тестами наиболее сложных и критичных частей системы, а затем постепенно расширять тестирование на остальные участки.
После запуска тестов с флагом покрытия в консоли появляется подробный отчет, где указаны данные о проценте покрытия для каждого файла и общей статистике. Важно не только смотреть на проценты, но и учитывать, какие именно строки или функции не покрыты тестами.
Statements — этот показатель указывает на процент строк кода, которые были выполнены в тестах. Но не стоит забывать, что 100% покрытие не означает отсутствие ошибок. Иногда тесты могут покрывать много кода, но не проверять его функциональность достаточно полно.
Branches — этот показатель особенно важен для тех участков кода, которые включают условные операторы. Важно тестировать все возможные ветви, чтобы убедиться, что программа правильно реагирует на различные условия.
Functions — этот процент показывает, сколько функций было протестировано. Если функция не тестируется, это может означать, что в программе есть логика, которая не используется или тестируется не полностью.
Lines — это процент строк, которые были фактически выполнены в ходе тестирования. Важно проверять, чтобы тесты не игнорировали критичные участки программы, такие как условия и циклы.
Предположим, что тесты дали следующий отчет:
Statements : 85.71% (48/56)
Branches : 72.22% (13/18)
Functions : 90% (9/10)
Lines : 84.62% (44/52)
Здесь можно видеть, что:
При низком покрытии важно выявить и устранить проблемы с тестами. Некоторые распространенные причины, по которым код может оставаться непокрытым:
--coverage для анализа покрытияJest предлагает возможность финишного отчета с конкретными данными о покрытии, что дает возможность разработчикам выявить проблемные места и исправить их. Важно использовать эту информацию для повышения качества кода и обеспечения надежности приложения.