Vitest или Jest: на проекте со сборщиком Vite берите Vitest, потому что он использует те же настройки, а если Jest уже работает, оставьте его. QUnit хватит, когда тесты должны идти прямо в браузере почти без настройки. Все три запускают автоматические тесты на JavaScript и отличаются тем, где живут и сколько настройки требуют.
Эта статья родилась из другой: про формальные модели на Quint и формальную верификацию. Названия QUnit и Quint похожи, и их легко спутать, поэтому я решил отдельно написать и про тестовые движки. Как Quint отличается от них, разобрано в сравнении Quint с тестами и TLA+.
Что общего у Jest, Vitest и QUnit
Допустим, есть функция, которая складывает два числа. Тест записывает ожидание: для единицы и двойки ответ равен трём. Движок запускает функцию, сравнивает ответ с ожидаемым и сообщает, прошла проверка или упала. Тестов в проекте сотни, поэтому их запускают автоматически после каждой правки: если правка сломала то, что работало, тест падает, и это видно сразу. Все три движка делают именно это для кода на JavaScript, то есть запускают автоматические тесты.
В описаниях движков встретятся три слова. Снимок — сохранённый эталон большого результата, например готовой разметки страницы, с которым сравнивают новый результат. Подмена — временная замена настоящего кода заглушкой, например настоящей отправки письма, чтобы тест не ходил наружу. Покрытие — отчёт о том, какие строки кода тест хотя бы раз выполнил. Поэтому выбор между движками редко решает, будут ли у проекта тесты. Он решает, сколько всего нужно настраивать и где тесты запускаются.
Jest или Vitest: сколько мест править при настройке
Jest нацелен на работу без настройки на большинстве проектов на JavaScript. Он понимает проекты на Babel, TypeScript, React, Angular и Vue. Снимки и подмены встроены, а покрытие кода включается одним флагом --coverage без дополнительной настройки. Тесты он запускает параллельно, каждый в своём процессе, чтобы они не влияли друг на друга, и в начале прогона ставит те, что упали в прошлый раз. Стиль проверок знакомый: test описывает случай, expect сравнивает ответ.
Vitest делает почти то же, но построен на сборщике Vite. Если сайт уже собирается Vite, Vitest берёт те же настройки и плагины, а Jest потребовал бы вторую, отдельную конфигурацию. Авторы Vitest прямо называют это дублированием сложности. Совместимость с Jest у Vitest высокая: он поддерживает большую часть интерфейса Jest и его библиотек, поэтому в большинстве проектов подходит как замена.
Ещё у Vitest быстрый режим наблюдения: при правке файла тесты перезапускаются мгновенно, на той же горячей замене модулей, что и в самом Vite. В документации есть режим тестов в настоящем браузере и веб-интерфейс с результатами. Цена одна: он требует достаточно свежих Vite и Node.js, в документации на сегодня указаны Vite 6.4 и Node 22.12.
QUnit: когда нужны тесты прямо в браузере
QUnit описывает себя как мощный и простой в использовании движок тестов. Для Node.js ему не нужна настройка, а для браузера достаточно минимальной. Запускается он везде, где есть JavaScript: в браузерах, в Node.js, в движке SpiderMonkey и в фоновом потоке страницы. Jest и Vitest, в отличие от него, чаще всего запускают в Node.js.
Стиль у него свой. Связанные тесты собирают в группу командой QUnit.module, отдельный тест описывают через QUnit.test, а ответ сверяют через assert. Для тестов, которые трогают страницу, есть заготовка-«стенд», которая возвращает страницу в исходный вид после каждого теста, и отдельная проверка порядка вызовов для событий и ответов с задержкой. Расширять QUnit можно под себя: свои проверки, свои запуски и свои отчёты. Старые браузеры он тоже поддерживает: версия 2 работает с Internet Explorer 9 и выше.
Что у кого: Jest, Vitest и QUnit по пунктам
| Jest | Vitest | QUnit | |
|---|---|---|---|
| Идея | привычный движок с полным набором: снимки, подмены, покрытие | движок нового поколения на базе Vite | простой движок, который запускается где угодно |
| Настройка | своя конфигурация | та же, что у Vite | почти не нужна |
| Где идёт | чаще всего в Node.js | чаще всего в Node.js | браузер, Node.js, другие среды |
| Как пишут проверку | test и expect | test и expect, как в Jest | QUnit.test и assert |
| Когда подходит | Jest уже есть и работает | проект собирается Vite | тесты нужны в браузере без сборки |
Таблица по строкам. «Идея» говорит, зачем движок появился. «Настройка» показывает, сколько работы до первого теста. «Где идёт» и «Как пишут проверку» важны, если у вас много готовых тестов: стиль Jest и Vitest совпадает, поэтому перенос между ними простой, а на QUnit придётся переписывать проверки.
Что выбрать: Jest, Vitest или QUnit
Выбор определяется проектом. Проект собирается Vite: берите Vitest, настройки уже есть. В проекте уже стоит Jest и всё работает: оставьте его. Нужны проверки прямо в браузере без сборки: берите QUnit. Перенос между Jest и Vitest обычно дешёвый, поэтому ошибка выбора не станет необратимой. Если нужно проверять не функции, а правила и порядок событий, смотрите статьи Quint против QUnit и TLA+ и про модели на Quint.
Частые вопросы
На проекте, который собирается Vite, берите Vitest: он использует те же настройки, и вторая конфигурация не нужна. Если Jest уже работает и никому не мешает, переезд редко окупается.
Vitest построен на Vite, поддерживает большую часть интерфейса Jest и быстро перезапускает тесты при правке файла. Ему нужны достаточно свежие Vite и Node.js.
Когда тесты должны идти прямо в браузере и без сборки. QUnit запускается в браузерах, в Node.js и в других средах с JavaScript, а для Node.js ему не нужна настройка.
Обычно нет: проверки в обоих пишут через
test и expect, поэтому перенос между ними простой. На QUnit придётся переписывать проверки.