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 (أو استخدم العامّات التي يحقنها Jest)، وtracera وannotations وskip من @tracera/jest. حمّل @tracera/jest/setup حتى تعمل الخطوات والربط مع واجهات Jest القياسية.

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

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 من هذه الحزمة: 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} من وسائط الدالة؛ ويمكن تمرير دالة تُرجع العنوان. في نموذج الاستدعاء لا تُملأ {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();
  }),
);