تكرار السؤال: …
الإجابة المختصرة
تختبر unit tests وحدة صغيرة (دالة أو class) معزولة عن الاعتماديات الخارجية وتعمل بسرعة، بينما تختبر integration tests تعاون عدة أجزاء حقيقية مثل الكود مع قاعدة البيانات أو HTTP.
الشرح
ابدأ باختبارات وحدة كثيرة وسريعة لمنطق الـ domain، وأضف اختبارات تكامل حيث يكون الخطر في العقد بين المكونات: استعلامات SQL، والـ serialization، وإعدادات الـ framework. اختبارات التكامل أبطأ وأكثر هشاشة لكنها تكشف أخطاء لا تظهر مع الـ mocks. يمكن فصلها بـ pytest markers وتشغيلها في مرحلة مستقلة في CI.
مثال بالكود
# unit: منطق نقي بلا اعتماديات
def test_discount():
assert apply_discount(100, 0.2) == 80
# integration: مع قاعدة بيانات حقيقية مؤقتة
@pytest.mark.integration
def test_save_order(db_session):
repo = OrderRepository(db_session)
repo.add(Order(id=1, total=50))
assert repo.get(1).total == 50أخطاء شائعة
- عمل mock لكل شيء حتى قاعدة البيانات فلا تكشف الاختبارات أخطاء SQL الحقيقية.
- تحويل كل الاختبارات إلى end-to-end بطيئة فيتوقف الفريق عن تشغيلها.