Jest

npm install @tracera/jest

Проверено на Node.js 22.19–26.12 и Jest 30–30.5 (см. Адаптеры автотестов). @tracera/jest на npm.

В jest.config.cjs (или вашем конфиге Jest):

module.exports = {
  testEnvironment: 'node',
  setupFilesAfterEnv: ['@tracera/jest/setup'],
  reporters: ['default', '@tracera/jest/reporter'],
};

Переменные окружения, режим прогона и повторы: Адаптеры автотестов.

Ключ Env при повторе: JEST_RETRY.

Привязка testCaseId и autotestName

Импортируйте test, expect и хуки из @jest/globals (или используйте глобальные API Jest), а из @tracera/jest — tracera, annotations и skip. Подключите @tracera/jest/setup, чтобы шаги и привязка работали со стандартными API Jest.

В объявлении (предпочтительно — привязка сработает, даже если сразу вызвать skip):

import { test, expect } from '@jest/globals';
import { annotations } from '@tracera/jest';

test(
  'login',
  annotations(42, 'e2e/login', async () => {
    expect(true).toBe(true);
  }),
);

Внутри теста (необязательно, если кейс уже привязан через annotations):

import { test, expect } from '@jest/globals';
import { tracera } from '@tracera/jest';

test('login', async () => {
  tracera.testCase(42, 'e2e/login');
  expect(true).toBe(true);
});

Пропуск

Если заранее известно, что тест следует пропустить — используйте test.skip или describe.skip. Если условие skip вычисляется внутри теста — используйте skip из этого пакета: у Jest нет test.skip(reason).

import { test } from '@jest/globals';
import { annotations, skip } from '@tracera/jest';

test(
  'login',
  annotations(42, 'e2e/login', () => {
    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 ожидаются до завершения. Стандартные beforeEach / afterEach из @jest/globals обёрнуты: шаги внутри них попадают в Предусловие / Постусловие результата. Хуки уровня suite (beforeAll / afterAll) не попадают в отчёт.

import { test, beforeEach, afterEach } from '@jest/globals';
import { tracera } from '@tracera/jest';

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/jest';

class Cart {
  @tracera.step('add {item}')
  async addToCart(item: string) {
    // …
  }
}

Комментарии, ошибки и вложения

Комментарии, ошибки и вложения: Адаптеры автотестов.

import { test } from '@jest/globals';
import { tracera } from '@tracera/jest';

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 оберните колбэк: annotations(id, 'login as {login}', fn) — поля объекта-строки подставятся в {login} и подобные плейсхолдеры.

import { test, expect } from '@jest/globals';
import { annotations } from '@tracera/jest';

test.each([{ login: 'ok' }, { login: 'sso' }])(
  'login as $login',
  annotations(42, 'login as {login}', async ({ login }) => {
    expect(login).toBeTruthy();
  }),
);