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

تُثبّت الإضافة الـ runner والإعداد والـ reporter. يمكنك ضبط test.runner / setupFiles / reporters يدويًا إن رغبت.

متغيرات البيئة ووضع التشغيل وإعادة المحاولة: محوّلات الاختبار الآلي.

مفتاح Env عند إعادة المحاولة: VITEST_RETRY.

ربط testCaseId و autotestName

استورد test وexpect والخطافات من vitest، وtracera وannotations من @tracera/vitest. توصّل الإضافة الـ runner وsetup وreporter حتى تُقابل beforeEach / afterEach القياسيتان الإعداد / التنظيف الخاصين بالنتيجة.

عند التصريح (المفضّل — الربط يعمل حتى لو تخطّى الجسم مبكرًا):

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) من سياق الاختبار). يُضاف سبب التخطّي إلى النتيجة كـ 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} من وسائط الدالة؛ ويمكن تمرير دالة تُرجع العنوان. في نموذج الاستدعاء لا تُملأ {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();
  }),
);