تكرار السؤال: …
الإجابة المختصرة
يقترح هرم الاختبارات قاعدة عريضة من اختبارات الوحدة السريعة والرخيصة في الأسفل، تليها اختبارات التكامل في المنتصف، وقمة مدببة من الاختبارات الشاملة (E2E) المعقدة والبطيئة.
الشرح
اختبارات الوحدة (Unit Tests) تختبر دوال وفئات معزولة بالميكروثانية وتمنح تشخيصاً لحظياً دقيقاً لمكان الخطأ ورخيصة الصيانة. اختبارات التكامل (Integration Tests) تتحقق من سلامة تفاعل عدة مكونات حقيقية معاً (مثل الخدمة مع قاعدة البيانات). أما اختبارات E2E فتحاكي المستخدم الحقيقي في المتصفح؛ وهي ممتازة لزرع الثقة قبل الشحن ولكنها بطيئة جداً ومكلفة وعرضة للاهتزاز (Flakiness). الاعتماد على هرم مقلوب (Ice Cream Cone Anti-pattern) يقتل سرعة فرق التطوير.
مثال بالكود
# Unit test — milliseconds, many of them
def test_total_with_tax():
assert total(100, tax=0.14) == 114
# Integration test — real database, fewer
@pytest.mark.integration
def test_order_is_saved(db):
repo = OrderRepository(db)
repo.add(Order(id=1, total=50))
assert repo.get(1).total == 50
# End-to-end test — real browser, very few and only for critical journeys
def test_checkout_flow(page):
page.goto("/cart")
page.click("text=Checkout")
expect(page.locator("h1")).to_have_text("Order confirmed")أخطاء شائعة
- كتابة معظم الاختبارات كـ E2E متجاهلين اختبارات الوحدة، مما يجعل بناء الـ CI/CD يستغرق ساعات طويلة ويفشل عشوائياً.