Тестирование
Тема дорожной карты · Node.js
Тестирование приложений Node.js включает юнит-тесты для отдельных функций, интеграционные тесты для API-эндпоинтов и взаимодействий с базами данных, и end-to-end-тесты, проверяющие весь стек приложения, с целью выявления регрессий и проверки корректности в ходе серверной разработки. Экосистема Node.js предлагает несколько зрелых фреймворков тестирования, включая jest, vitest и встроенный модуль node:test, появившийся в Node.js 18, каждый из которых предоставляет тест-раннер, библиотеку утверждений, утилиты мокирования и отчёты о покрытии кода. TypeScript-проекты Node.js выигрывают от нативной поддержки TypeScript и совместимости с ESM в vitest, тогда как jest с ts-jest или babel-jest остаётся наиболее распространённым выбором в экосистеме npm для юнит- и интеграционного тестирования. Интеграционное тестирование HTTP API Node.js обычно выполняется с помощью supertest для внутрипроцессного тестирования запросов, тогда как взаимодействия с базой данных можно тестировать как против реальной базы данных в Docker, так и с помощью in-memory-альтернатив в зависимости от типа базы данных. Измерение покрытия тестами с помощью c8 или istanbul (поставляемого с jest) гарантирует, что критические пути в сервисах Node.js проверяются, а пороги покрытия, применяемые в CI-конвейерах, предотвращают регрессию покрытия по мере роста кодовой базы.
Как это работает
Тестирование имеет несколько test-runner: встроенный node:test (Node 20+, без установки), Vitest (быстрый, Vite-native, Jest-совместимый), Jest (зрелый, большая экосистема), Mocha (классический, гибкий). Ассерты: node:assert, chai, expect. Моки: встроенный mock в node:test, sinon, vitest mock. Integration-тесты обычно поднимают приложение + test DB; HTTP-ассерты через supertest. Coverage — через c8 или nyc.
Когда применять
Vitest — для новых проектов: быстрый, ESM-native, watch-mode перезагружает только изменившееся. node:test — для zero-dependency ситуаций (CI-раннеры, внутренности npm-пакетов). Jest — только в legacy. Тесты в CI на каждый PR. Реальная test DB для integration-тестов (testcontainers поднимает на запуск); мокайте только реально внешнее (third-party API, payment-шлюзы).
Типичные ошибки
Ловушки Тестирование: тесты, делящие state (строка БД из теста A роняет тест B); over-mocking (тестируете моки, не код); process.exit() в тестах (убивает runner); нет timeout (висящий promise вешает suite); snapshot-тесты на нестабильном выводе (каждое изменение — diff). Тестовый suite — это production-код; рефакторьте его, именуйте хорошо.