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