Vitest
Тема дорожной карты · Node.js
vitest — это современный фреймворк тестирования на базе Vite для JavaScript и TypeScript, быстро завоевавший признание для серверной разработки Node.js благодаря мгновенному запуску, нативной поддержке TypeScript и ESM, а также совместимому с jest API, требующему минимальных усилий при миграции. В отличие от jest, требующего ts-jest или трансформации Babel для работы с TypeScript, vitest запускает TypeScript-файлы нативно с помощью esbuild, что делает выполнение тестов значительно быстрее в крупных проектах Node.js с большим количеством тестовых файлов. Npm-пакет vitest предоставляет встроенные отчёты о покрытии тестами через @vitest/coverage-v8 или @vitest/coverage-istanbul, режим браузера для тестирования фронтенд-кода и UI-дашборд для интерактивного изучения тестов — всё в рамках одного инструмента. Режим наблюдения vitest перезапускает только затронутые тесты при изменении исходных файлов, используя граф модулей Vite для интеллектуальной инвалидации, что значительно сокращает время обратной связи в ходе серверной разработки Node.js. Для проектов Node.js, использующих workspace в pnpm, vitest поддерживает общую конфигурацию и запуск тестов на уровне workspace, что делает его сильным выбором для TypeScript-монорепозиториев наряду с файлом конфигурации vitest.config.ts.
Как это работает
Vitest имеет несколько 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-шлюзы).
Типичные ошибки
Ловушки Vitest: тесты, делящие state (строка БД из теста A роняет тест B); over-mocking (тестируете моки, не код); process.exit() в тестах (убивает runner); нет timeout (висящий promise вешает suite); snapshot-тесты на нестабильном выводе (каждое изменение — diff). Тестовый suite — это production-код; рефакторьте его, именуйте хорошо.