وكيل المراجعة الأساسي

محلل الاختبارات

يضمن أن اختباراتك تحميك فعلاً

الاختبارات الناجحة لا تعني أن كودك يعمل. محلل الاختبارات يجد الثغرات — الحالات الحدية المفقودة، الاختبارات غير المستقرة، ومشاكل العزل التي تسمح للأخطاء بالتسلل.

ما يكتشفه محلل الاختبارات

الثغرات في مجموعة اختباراتك التي تسمح للأخطاء بالهروب

تغطية الحالات الحدية المفقودة

المسار السعيد مختبر، لكن ماذا عن القيم الفارغة والمصفوفات الفارغة والشروط الحدية؟

المدخلات الفارغةالمجموعات الفارغةالقيم الحديةمسارات الأخطاء

الاختبارات غير المستقرة

الاختبارات التي تنجح أحياناً وتفشل أحياناً أخرى — القتلة الصامتون لثقة CI/CD

اعتماديات التوقيتاعتماديات الترتيبالحالة المشتركةاستدعاءات الشبكة

عزل الاختبارات السيئ

الاختبارات التي تعتمد على بعضها البعض أو تشترك في حالة قابلة للتغيير — كوابيس التصحيح

التثبيتات المشتركةتلوث قاعدة البياناتالحالة العامةأخطاء ترتيب الاختبارات

جميع أنواع الاختبارات مغطاة

من اختبارات الوحدة إلى E2E، محلل الاختبارات يراجعها جميعاً

اختبارات الوحدة

اختبار على مستوى الدوال والفئات

اختبارات التكامل

اختبار تفاعل المكونات

اختبارات E2E

اختبار تدفق المستخدم من البداية إلى النهاية

اختبارات API

اختبار نقاط النهاية والعقود

اختبارات اللقطة

اكتشاف تراجع واجهة المستخدم

اختبارات الأداء

اختبار التحميل والأداء المعياري

تحسين جودة الاختبارات

أمثلة حقيقية على تحسينات الاختبارات

حالة حدية مفقودة

اختبار ضعيف
describe('calculateDiscount', () => {
  it('applies 10% for orders over $100', () => {
    expect(calculateDiscount(150)).toBe(15)
  })

  it('applies 5% for orders over $50', () => {
    expect(calculateDiscount(75)).toBe(3.75)
  })

  // What about $0? Negative? Exactly $50? $100?
})

اختبارات الحدود مفقودة: $0، $50، $100، سالب

اختبار قوي
describe('calculateDiscount', () => {
  it('applies 10% for orders over $100', () => {
    expect(calculateDiscount(150)).toBe(15)
  })

  it('applies 5% for orders over $50', () => {
    expect(calculateDiscount(75)).toBe(3.75)
  })

  it('returns 0 for orders at boundary', () => {
    expect(calculateDiscount(50)).toBe(0)
    expect(calculateDiscount(100)).toBe(5) // 5% tier
  })

  it('handles zero and negative gracefully', () => {
    expect(calculateDiscount(0)).toBe(0)
    expect(calculateDiscount(-10)).toBe(0)
  })
})

إضافة حالات حدية للحدود والمدخلات غير الصالحة

اكتشاف الاختبار غير المستقر

اختبار ضعيف
it('shows notification after save', async () => {
  await user.click(saveButton)

  // Flaky! Depends on timing
  await waitFor(() => {
    expect(screen.getByText('Saved!')).toBeVisible()
  })

  // Even worse: arbitrary timeout
  await new Promise(r => setTimeout(r, 100))
  expect(notificationCount).toBe(1)
})

مهلات عشوائية وافتراضات توقيت

اختبار قوي
it('shows notification after save', async () => {
  await user.click(saveButton)

  // Wait for specific state change
  await waitFor(() => {
    expect(screen.getByRole('alert')).toHaveTextContent('Saved!')
  })

  // Assert on observable behavior, not timing
  expect(
    await screen.findByRole('alert', { name: /saved/i })
  ).toBeVisible()
})

انتظر تغييرات الحالة الملاحظة، وليس الوقت

مشكلة عزل الاختبار

اختبار ضعيف
let testUser: User

beforeAll(async () => {
  // Shared across ALL tests — mutations leak!
  testUser = await createUser({ name: 'Test' })
})

it('updates user name', async () => {
  await updateUser(testUser.id, { name: 'Updated' })
  // Now testUser.name is 'Updated' for all following tests
})

it('checks original name', () => {
  // FAILS! Previous test mutated shared state
  expect(testUser.name).toBe('Test')
})

الحالة المشتركة في beforeAll تتسرب بين الاختبارات

اختبار قوي
describe('user updates', () => {
  let testUser: User

  beforeEach(async () => {
    // Fresh user for EACH test
    testUser = await createUser({ name: 'Test' })
  })

  afterEach(async () => {
    await deleteUser(testUser.id)
  })

  it('updates user name', async () => {
    await updateUser(testUser.id, { name: 'Updated' })
    expect(testUser.name).toBe('Updated')
  })

  it('checks original name', () => {
    // Works! Fresh testUser with original name
    expect(testUser.name).toBe('Test')
  })
})

استخدم beforeEach لعزل الاختبارات

تحليل الاختبارات

كيف يعمل محلل الاختبارات

محلل الاختبارات لا يكتفي بعدّ الاختبارات — بل يحلل ما تختبره فعلاً. يجد الفجوات بين ما تغطيه اختباراتك وما يحتاجه كودك.

تحليل المسارات

يرسم خريطة مسارات الكود للعثور على الفروع غير المختبرة

اكتشاف عدم الاستقرار

يحدد اعتماديات التوقيت والترتيب

اقتراحات الحالات الحدية

يوصي بحالات اختبار محددة للإضافة

خط أنابيب التحليل

1

تحليل تغطية الاختبارات

يرسم خريطة مسارات الكود المختبرة وغير المختبرة

2

تحديد نقاط الضعف

يجد الحالات الحدية وحالات الأخطاء بدون اختبارات

3

اكتشاف الأنماط السيئة

يكتشف الأنماط غير المستقرة ومشاكل العزل

4

اقتراح التحسينات

يوصي بحالات اختبار محددة للإضافة

لماذا جودة الاختبارات مهمة

الاختبارات السيئة أسوأ من عدم وجود اختبارات — فهي تعطي ثقة زائفة

اكتشاف الأخطاء الحقيقية

الاختبارات التي تغطي الحالات الحدية تكتشف الأخطاء قبل المستخدمين

CI/CD موثوق

لا مزيد من "إعادة المحاولة حتى النجاح" — الاختبارات تنجح أو تفشل لأسباب حقيقية

إعادة الهيكلة بأمان

الاختبارات الجيدة تتيح لك تغيير الكود بثقة

تغطية 100% لا تعني شيئاً إذا لم تكتشف الاختبارات الأخطاء.
محلل الاختبارات يضمن أن اختباراتك تعمل فعلاً.

اختبارات تحميك فعلاً

دع محلل الاختبارات يجد الثغرات في مجموعة اختباراتك. مجاني لمدة 14 يوماً، لا حاجة لبطاقة ائتمان.

اكتشاف الحالات الحدية
منع الاختبارات غير المستقرة
تحليل العزل