Cypress

npm install @tracera/cypress

مُختبَر على Node.js 22.19–26.12 وCypress 14–16.2 (انظر محوّلات الاختبار الآلي). @tracera/cypress على npm.

في cypress.config.ts:

import { defineConfig } from 'cypress';
import { registerTraceraPlugin } from '@tracera/cypress';

export default defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      return registerTraceraPlugin(on, config);
    },
    supportFile: 'cypress/support/e2e.ts',
  },
});

في ملف الدعم:

import '@tracera/cypress/support';

لاختبار المكوّنات (Component Testing)، استدعِ registerTraceraPlugin من component.setupNodeEvents واستورد نفس مدخل الدعم من ملف دعم اختبار المكوّنات.

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

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

ربط testCaseId و autotestName

استورد tracera وannotations من @tracera/cypress/runtime، أو استخدم cy.traceraTestCase في الاختبارات (الأمر متاح بعد import '@tracera/cypress/support' في ملف الدعم). أسماء annotations حرفية (بدون {param}).

عند التصريح (المفضّل — الربط يعمل حتى مع this.skip() المبكر):

import { annotations } from '@tracera/cypress/runtime';

it('login', annotations(42, 'e2e/login'), () => {
  cy.visit('/login');
  cy.get('[data-testid=sign-in]').should('be.visible');
});

داخل الاختبار (اختياري إذا ربطت annotations الحالة مسبقًا):

import { tracera } from '@tracera/cypress/runtime';

it('login', () => {
  tracera.testCase(42, 'e2e/login');
  cy.visit('/login');
  cy.get('[data-testid=sign-in]').should('be.visible');
});

أو: cy.traceraTestCase(42, "e2e/login").

Skip

استخدم تخطّي Cypress القياسي (this.skip()). اختياري: عيّن comment النتيجة بـ tracera.comment قبل استدعاء skip.

import { tracera, annotations } from '@tracera/cypress/runtime';

it('login', annotations(42, 'e2e/login'), function () {
  if (!Cypress.env('READY')) {
    tracera.comment('env not ready');
    this.skip();
  }
  cy.visit('/login');
});

الخطوات

استخدم tracera.step أو cy.traceraStep: الاستدعاء tracera.step(title, fn) / cy.traceraStep(title, fn)، أو المُزيِّن @tracera.step("…") على دالة في الصنف، أو tracera.step("…")(fn). في عنوان المُزيِّن تُملأ {name} / {0} من وسائط الدالة؛ ويمكن تمرير دالة تُرجع العنوان. في نموذج الاستدعاء لا تُملأ {name} / {0} — مرّر سلسلة عنوان جاهزة (أو ابنِها بنفسك). يُنفَّذ العمل غير المتزامن عبر طابور أوامر Cypress. بعد import "@tracera/cypress/support"، خطافات beforeEach / afterEach القياسية مُجهَّزة — الخطوات داخلها تذهب إلى الإعداد / التنظيف الخاصين بالنتيجة. خطافات مستوى الـ suite مثل before / after لا تُبلَّغ.

import { tracera } from '@tracera/cypress/runtime';

beforeEach(() => {
  tracera.step('open shop', () => {
    return cy.visit('/shop');
  });
});

it('checkout', () => {
  tracera.testCase(10, 'e2e/checkout');
  tracera.step('add to cart', () => {
    return cy.get('[data-testid=add]').click();
  });
});

afterEach(() => {
  tracera.step('cleanup', () => {
    // …
  });
});

المُزيِّن على الدالة:

import { tracera } from '@tracera/cypress/runtime';

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

التعليقات والأخطاء والمرفقات

التعليقات والأخطاء والمرفقات: محوّلات الاختبار الآلي. تُضاف لقطات الشاشة عند الفشل إلى النتيجة عند تسجيل الإضافة.

import { tracera } from '@tracera/cypress/runtime';

it('login', () => {
  tracera.testCase(42, 'e2e/login');
  tracera.comment('result-level note');
  tracera.error('result-level error text');

  tracera.step('open login', () => {
    return cy.visit('/login').then(() => {
      tracera.comment('landed on login');
      tracera.attachment({
        fileName: 'suite-log.txt',
        mimeType: 'text/plain',
        data: 'finished login flow',
      });
    });
  });
});

الاختبارات ذات المعلمات

import { annotations } from '@tracera/cypress/runtime';

const rows = [
  { id: 42, name: 'e2e/login-ok', path: '/login' },
  { id: 43, name: 'e2e/login-sso', path: '/login/sso' },
];

for (const row of rows) {
  it(row.name, annotations(row.id, row.name), () => {
    cy.visit(row.path);
  });
}

أو استدعِ tracera.testCase(row.id, row.name) داخل الاختبار بدلًا من annotations.