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('Giris akisi', () => {
test('gecerli kullanici ile giris yapar ve dashboard gorur', 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('E-posta').fill('[email protected]');
await page.getByLabel('Sifre').fill('guclu-sifre-123');
await page.getByRole('button', { name: 'Giris Yap' }).click();
// الانتظار التلقائي (Auto-wait): ينتظر حتى يصبح المحدد (locator) مرئيًا
await expect(page.getByText('Hos geldin, Ayse')).toBeVisible();
await expect(page).toHaveURL('/dashboard');
});
test('checkout iframe icindeki odeme butonunu bulur (cross-frame)', async ({ page }) => {
await page.goto('/checkout');
// v1.63.0: يبحث frameLocator بدون محدد في كامل شجرة الإطارات الفرعية
const payButton = page.frameLocator().getByRole('button', { name: 'Ode' });
await payButton.click();
await expect(page.getByText('Odeme basarili')).toBeVisible();
});
});
test('3 tarayicida paralel calisir (playwright.config.ts icinde tanimli)', async ({ page }) => {
await page.goto('/');
await expect(page).toHaveTitle(/Ana Sayfa/);
});// Cypress - تدفق تسجيل الدخول ومحاكاة API (JavaScript/TypeScript)
describe('Giris akisi', () => {
it('gecerli kullanici ile giris yapar ve dashboard gorur', () => {
// محاكاة الشبكة (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('[email protected]');
cy.get('[data-cy=password]').type('guclu-sifre-123');
cy.get('[data-cy=submit]').click();
cy.wait('@loginRequest');
// إعادة المحاولة التلقائية في Cypress: تنتظر حتى يصبح العنصر مرئيًا
cy.contains('Hos geldin, Ayse').should('be.visible');
cy.url().should('include', '/dashboard');
});
it('cross-origin odeme sayfasina yonlenir (cy.origin gerekli)', () => {
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('Odeme onaylandi').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، فإن الانتقال لا يُبرَّر بمجرد 'فرق الأداة' — الترحيل التدريجي أكثر منطقية.