Функциональность
- Vite: конфигурация, трансформеры, разрешители и плагины.
- Используйте те же настройки, что и в вашем приложении, для запуска тестов!
- Умный режим наблюдения (watch mode), как HMR для тестов!
- Компонентное тестирование для Vue, React, Svelte, Lit и других
- Поддержка TypeScript и JSX "из коробки"
- ESM first, top level await (сначала ESM, await верхнего уровня)
- Многопоточность через воркеры с помощью Tinypool
- Поддержка тестирования производительности с помощью Tinybench
- Фильтрация, таймауты и параллельный запуск для наборов тестов и отдельных тестов
- Поддержка Workspace (рабочего пространства)
- Совместимость со Snapshot от Jest
- Встроенная библиотека Chai для утверждений и API, совместимые с Jest expect
- Встроенная библиотека Tinyspy для мокирования
- happy-dom или jsdom для мокирования DOM
- Покрытие кода через v8 или istanbul
- Тестирование внутри исходного кода в стиле Rust
- Тестирование типов через expect-type
Общая конфигурация для тестов, разработки и сборки
Используйте конфигурацию Vite, трансформеры, разрешители и плагины, как и в вашем приложении, для запуска тестов.
Узнайте больше в разделе Настройка Vitest.
Режим наблюдения (Watch Mode)
$ vitest
При изменении исходного кода или файлов тестов Vitest автоматически анализирует граф модулей и перезапускает только связанные тесты, как HMR в Vite!
vitest
запускается в watch mode
по умолчанию в среде разработки и в run mode
в среде CI (если присутствует process.env.CI
). Используйте vitest watch
или vitest run
, чтобы явно указать желаемый режим.
Поддержка распространенных веб-технологий "из коробки"
Встроенная поддержка ES Module / TypeScript / JSX / PostCSS.
Многопоточность
Многопоточность реализована с использованием воркеров через Tinypool (легковесный форк Piscina), что позволяет запускать тесты параллельно. Многопоточность включена по умолчанию и может быть отключена с помощью флага --no-threads
в CLI.
Vitest также изолирует среду каждого файла, поэтому изменения переменных окружения в одном файле не влияют на другие. Изоляцию можно отключить, передав --no-isolate
в CLI (в ущерб корректности ради производительности).
Фильтрация тестов
Vitest предоставляет различные способы сузить круг запускаемых тестов для ускорения тестирования и фокусировки на разработке.
Подробнее о фильтрации тестов.
Параллельный запуск тестов (concurrently)
Используйте .concurrent
в последовательных тестах для их параллельного запуска.
import { describe, it } from 'vitest';
// Два теста, отмеченные как concurrent, будут запущены параллельно
describe('suite', () => {
it('serial test', async () => {
/* ... */
});
it.concurrent('concurrent test 1', async ({ expect }) => {
/* ... */
});
it.concurrent('concurrent test 2', async ({ expect }) => {
/* ... */
});
});
При использовании .concurrent
в наборе тестов (suite), каждый тест в нем будет запущен параллельно.
import { describe, it } from 'vitest';
// Все тесты в этом наборе будут запущены параллельно
describe.concurrent('suite', () => {
it('concurrent test 1', async ({ expect }) => {
/* ... */
});
it('concurrent test 2', async ({ expect }) => {
/* ... */
});
it.concurrent('concurrent test 3', async ({ expect }) => {
/* ... */
});
});
Вы также можете использовать .skip
, .only
и .todo
с параллельными наборами тестов и тестами. Подробнее в API Reference.
WARNING
При запуске параллельных тестов Snapshots и Assertions должны использовать expect
из локального контекста теста для правильной идентификации теста.
Snapshot-тестирование
Поддержка snapshot-тестирования, совместимая с Jest.
import { expect, it } from 'vitest';
it('renders correctly', () => {
const result = render();
expect(result).toMatchSnapshot();
});
Подробнее в разделе Snapshot.
Совместимость с Chai и Jest expect
Chai встроен для утверждений и предоставляет API, совместимые с Jest expect
.
Если вы используете сторонние библиотеки, добавляющие сопоставители (matchers), установка test.globals
в true
обеспечит лучшую совместимость.
Мокирование
Tinyspy встроен для мокирования с jest
-совместимыми API через объект vi
.
import { expect, vi } from 'vitest';
const fn = vi.fn();
fn('hello', 1);
expect(vi.isMockFunction(fn)).toBe(true);
expect(fn.mock.calls[0]).toEqual(['hello', 1]);
fn.mockImplementation(arg => arg);
fn('world', 2);
expect(fn.mock.results[1].value).toBe('world');
Vitest поддерживает happy-dom или jsdom для мокирования DOM и браузерных API. Они не включены в Vitest, и вам может потребоваться их установить:
$ npm i -D happy-dom
# or
$ npm i -D jsdom
Затем измените параметр environment
в файле конфигурации:
// vite.config.ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
environment: 'happy-dom', // or 'jsdom', 'node'
},
});
Подробнее в разделе Мокирование.
Покрытие кода
Vitest поддерживает нативное покрытие кода через v8
и покрытие инструментированного кода через istanbul
.
{
"scripts": {
"test": "vitest",
"coverage": "vitest run --coverage"
}
}
Подробнее в разделе Покрытие.
In-source testing (Тестирование в исходном коде)
Vitest предоставляет возможность запускать тесты непосредственно в исходном коде, рядом с реализацией, аналогично модульным тестам в Rust.
Это позволяет тестам использовать то же замыкание, что и реализация, и тестировать частные состояния без экспорта. Также это сокращает цикл обратной связи при разработке.
// src/index.ts
// реализация
export function add(...args: number[]) {
return args.reduce((a, b) => a + b, 0);
}
// тесты в исходном коде
if (import.meta.vitest) {
const { it, expect } = import.meta.vitest;
it('add', () => {
expect(add()).toBe(0);
expect(add(1)).toBe(1);
expect(add(1, 2, 3)).toBe(6);
});
}
Подробнее в разделе In-source testing.
Тестирование производительности экспериментально
Начиная с Vitest 0.23.0, для оценки и сравнения производительности можно использовать функцию bench
через Tinybench.
import { bench, describe } from 'vitest';
describe('sort', () => {
bench('normal', () => {
const x = [1, 5, 4, 2, 3];
x.sort((a, b) => {
return a - b;
});
});
bench('reverse', () => {
const x = [1, 5, 4, 2, 3];
x.reverse().sort((a, b) => {
return a - b;
});
});
});
Проверка типов экспериментально
Начиная с Vitest 0.25.0, вы можете писать тесты для выявления регрессий типов. Vitest поставляется с пакетом expect-type
, предоставляющим аналогичный и простой для понимания API.
import { assertType, expectTypeOf } from 'vitest';
import { mount } from './mount.js';
test('my types work properly', () => {
expectTypeOf(mount).toBeFunction();
expectTypeOf(mount).parameter(0).toMatchTypeOf<{ name: string }>();
// @ts-expect-error name is a string
assertType(mount({ name: 42 }));
});