Unit Test مقابل Integration Test
أساس استراتيجية الاختبار في iOS: هل الاختبارات الوحدوية (unit tests) التي تعزل كل جزء على حدة، أم اختبارات التكامل (integration tests) التي تتحقق من تفاعل المكونات؟ كيف تبني هرم الاختبار الصحيح؟
محرك اختبار E2E متعدد المتصفحات ومتعدد اللغات من Microsoft
أداة اختبار E2E لـ JS/TS تعمل داخل المتصفح وتركّز على تجربة المطوّر
لا توجد إجابة قاطعة، لكن هناك إطار عمل واضح. إذا احتجت إلى دعم متعدد المتصفحات، أو توازٍ مجاني، أو تدفقات cross-origin/iframe، أو لغة غير JS/TS، فإن Playwright هو الخيار الافتراضي في 2026. إذا كانت لديك مجموعة اختبارات Cypress واسعة وسليمة واستثمار في Cloud، فإن "فرق الأداة" وحده لا يبرر إعادة الكتابة — Cypress اليوم أكثر نضجًا في اختبار المكوّنات (component testing). الترحيل التدريجي، بدءًا بالتدفقات الحرجة، أكثر منطقية من "إعادة كتابة في نهاية أسبوع".
| الفئة | Playwright | Cypress |
|---|---|---|
| الأداء | 8/10 | 7/10 |
| سهولة التعلّم | 7/10 | 8/10 |
| النظام البيئي | 8/10 | 7/10 |
| المجتمع | 8/10 | 7/10 |
| سوق العمل | 7/10 | 7/10 |
| الاستدامة المستقبلية | 9/10 | 6/10 |
// Playwright Test - تدفق تسجيل الدخول ومحاكاة API (TypeScript)
import { test, expect } from '@playwright/test';
test.describe('Login flow', () => {
test('logs in with valid credentials and sees the dashboard', async ({ page }) => {
// محاكاة الشبكة - لا حاجة لإعداد إضافي
await page.route('**/api/login', async (route) => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({ token: 'test-token', user: { name: 'Ayse' } }),
});
});
await page.goto('/login');
await page.getByLabel('Email').fill('ayse@example.com');
await page.getByLabel('Password').fill('strong-password-123');
await page.getByRole('button', { name: 'Sign in' }).click();
// الانتظار التلقائي (Auto-wait): ينتظر حتى يصبح المحدد (locator) مرئيًا
await expect(page.getByText('Welcome, Ayse')).toBeVisible();
await expect(page).toHaveURL('/dashboard');
});
test('finds the pay button inside the checkout iframe (cross-frame)', async ({ page }) => {
await page.goto('/checkout');
// v1.63.0: يبحث frameLocator بدون محدد في كامل شجرة الإطارات الفرعية
const payButton = page.frameLocator().getByRole('button', { name: 'Pay' });
await payButton.click();
await expect(page.getByText('Payment successful')).toBeVisible();
});
});
test('runs in parallel across 3 browsers (configured in playwright.config.ts)', async ({ page }) => {
await page.goto('/');
await expect(page).toHaveTitle(/Home/);
});// Cypress - تدفق تسجيل الدخول ومحاكاة API (JavaScript/TypeScript)
describe('Login flow', () => {
it('logs in with valid credentials and sees the dashboard', () => {
// محاكاة الشبكة (stub) عبر cy.intercept
cy.intercept('POST', '/api/login', {
statusCode: 200,
body: { token: 'test-token', user: { name: 'Ayse' } },
}).as('loginRequest');
cy.visit('/login');
cy.get('[data-cy=email]').type('ayse@example.com');
cy.get('[data-cy=password]').type('strong-password-123');
cy.get('[data-cy=submit]').click();
cy.wait('@loginRequest');
// إعادة المحاولة التلقائية في Cypress: تنتظر حتى يصبح العنصر مرئيًا
cy.contains('Welcome, Ayse').should('be.visible');
cy.url().should('include', '/dashboard');
});
it('redirects to the cross-origin payment page (cy.origin required)', () => {
cy.visit('/checkout');
cy.get('[data-cy=pay-button]').click();
// عند الانتقال إلى origin مختلف، cy.origin() إلزامي
cy.origin('https://pay.example.com', () => {
cy.get('[data-cy=confirm-payment]').click();
cy.contains('Payment confirmed').should('be.visible');
});
});
});
// cypress.config.js — إعداد E2E أساسي
module.exports = {
e2e: {
baseUrl: 'http://localhost:3000',
experimentalRunAllSpecs: true,
setupNodeEvents(on, config) {
return config;
},
},
};لا توجد إجابة قاطعة، لكن هناك إطار عمل واضح. إذا احتجت إلى دعم متعدد المتصفحات، أو توازٍ مجاني، أو تدفقات cross-origin/iframe، أو لغة غير JS/TS، فإن Playwright هو الخيار الافتراضي في 2026. إذا كانت لديك مجموعة اختبارات Cypress واسعة وسليمة واستثمار في Cloud، فإن "فرق الأداة" وحده لا يبرر إعادة الكتابة — Cypress اليوم أكثر نضجًا في اختبار المكوّنات (component testing). الترحيل التدريجي، بدءًا بالتدفقات الحرجة، أكثر منطقية من "إعادة كتابة في نهاية أسبوع".
احصل على استشارة مجانيةإذا احتجت إلى دعم متعدد المتصفحات (Chromium+Firefox+WebKit)، أو تريد توازيًا مجانيًا مدمجًا، أو تحتاج إلى مرونة لغوية بين TS/Python/Java/.NET، فإن Playwright هو الخيار الافتراضي في 2026. إذا كانت لديك مجموعة اختبارات Cypress واسعة قائمة، وفريقك معتاد على المُشغّل التفاعلي، وقد استثمرت بالفعل في Cypress Cloud، فإن الانتقال لا يُبرَّر بمجرد 'فرق الأداة' — الترحيل التدريجي أكثر منطقية.