Vitest
npm install @tracera/vitest
Проверено на Node.js 22.19–26.12 и Vitest 2–5.0 (см. Адаптеры автотестов). @tracera/vitest на npm.
В vitest.config.ts:
import { defineConfig } from 'vitest/config';
import { tracera } from '@tracera/vitest/plugin';
export default defineConfig({
plugins: [tracera()],
});
Плагин подключает custom runner, setup и reporter. При желании можно задать test.runner / setupFiles / reporters вручную.
Переменные окружения, режим прогона и повторы: Адаптеры автотестов.
Ключ Env при повторе: VITEST_RETRY.
Привязка testCaseId и autotestName
Импортируйте test, expect и хуки из vitest, а из @tracera/vitest — tracera и annotations. Плагин подключает runner, setup и reporter, чтобы стандартные beforeEach / afterEach попадали в Предусловие / Постусловие результата.
В объявлении (предпочтительно — привязка сработает, даже если тест сразу уйдёт в skip):
import { test, expect } from 'vitest';
import { annotations } from '@tracera/vitest';
test('login', { meta: annotations(42, 'e2e/login') }, async () => {
expect(true).toBe(true);
});
Внутри теста (необязательно, если кейс уже привязан через annotations):
import { test, expect } from 'vitest';
import { tracera } from '@tracera/vitest';
test('login', async () => {
tracera.testCase(42, 'e2e/login');
expect(true).toBe(true);
});
Пропуск
Штатный skip Vitest (test.skip или skip(reason) из контекста теста). Skip reason добавляется в результат как comment.
import { test } from 'vitest';
import { annotations } from '@tracera/vitest';
test('login', { meta: annotations(42, 'e2e/login') }, async ({ skip }) => {
if (!process.env.READY) skip('env not ready');
});
Шаги
Используйте tracera.step: вызов tracera.step(title, fn), декоратор @tracera.step("…") на методе класса или tracera.step("…")(fn). В заголовке декоратора {name} / {0} подставляются из аргументов метода; вместо строки можно передать функцию, которая вернёт заголовок. В вызове tracera.step(title, fn) плейсхолдеры {name} / {0} не подставляются — передайте уже готовую строку. Асинхронные методы и Promise ожидаются до завершения. С плагином Tracera (или явным runner: "@tracera/vitest/runner") шаги внутри стандартных beforeEach / afterEach попадают в Предусловие / Постусловие результата. Хуки уровня suite (beforeAll / afterAll) не попадают в отчёт.
import { test, beforeEach, afterEach } from 'vitest';
import { tracera } from '@tracera/vitest';
beforeEach(async () => {
await tracera.step('open shop', async () => {
// …
});
});
test('checkout', async () => {
tracera.testCase(10, 'e2e/checkout');
await tracera.step('add to cart', async () => {
// …
});
});
afterEach(async () => {
await tracera.step('cleanup', async () => {
// …
});
});
Декоратор на методе:
import { tracera } from '@tracera/vitest';
class Cart {
@tracera.step('add {item}')
async addToCart(item: string) {
// …
}
}
Комментарии, ошибки и вложения
Комментарии, ошибки и вложения: Адаптеры автотестов.
import { test } from 'vitest';
import { tracera } from '@tracera/vitest';
test('login', async () => {
tracera.testCase(42, 'e2e/login');
tracera.comment('result-level note');
tracera.error('result-level error text');
await tracera.step('open login', async () => {
tracera.comment('landed on login');
tracera.attachment({
fileName: 'suite-log.txt',
mimeType: 'text/plain',
data: new TextEncoder().encode('finished login flow'),
});
});
});
Параметризованные тесты
С test.each / test.for оберните колбэк: annotations(id, 'login as {login}', fn) — поля объекта-строки подставятся в {login} и подобные плейсхолдеры. Необязательный {param_id} — имя теста в Vitest для этой строки.
import { test, expect } from 'vitest';
import { annotations } from '@tracera/vitest';
test.each([{ login: 'ok' }, { login: 'sso' }])(
'login as $login',
annotations(42, 'login as {login}', async ({ login }) => {
expect(login).toBeTruthy();
}),
);