Vitest

npm install @tracera/vitest

需要 Node.js ≥ 22.19(见 自动化测试适配器)。@tracera/vitest。

在 vitest.config.ts 中:

import { defineConfig } from 'vitest/config';

export default defineConfig({
  test: {
    runner: '@tracera/vitest/runner',
    setupFiles: ['@tracera/vitest/setup'],
    reporters: ['default', '@tracera/vitest/reporter'],
  },
});

启用重试时只上报 最终 一次 Vitest 尝试。若该次是重试(retry > 0),结果 Env 页会包含 VITEST_RETRY(1 表示第二次运行)。

环境变量与运行模式见 自动化测试适配器。

绑定 testCaseId 与 autotestName

从 vitest 导入 test / expect / hooks,从 @tracera/vitest 导入 tracera / annotations。必须配置自定义 runner,才能让标准 hooks 中的步骤进入准备 / 清理(Vitest 会冻结 hook 导出)。@tracera/vitest/setup 打开每个测试的上下文。若未设置 autotestName,适配器使用 Vitest 测试标题。

在声明时(推荐 — 即使测试体提前跳过也会绑定):

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);
});

步骤

使用 tracera.step。配置 runner: "@tracera/vitest/runner" 后,标准 beforeEach / afterEach 中的步骤进入 准备 / 清理。

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 () => {
    // …
  });
});

注释、错误与附件

在步骤内是该步骤的字段。在步骤外是结果上的字段。文件请使用 tracera.attachment(结果最多 10 个附件,每个步骤最多 10 个)。

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'),
    });
  });
});