تكرار السؤال: …
الإجابة المختصرة
يتحقق contract test من أن طرفين (مثل خدمة و client، أو adapter وواجهته) يتفقان على شكل البيانات ودلالاتها، دون تشغيل النظام كاملًا end-to-end.
الشرح
في الخدمات المصغرة يكتب المستهلك توقعاته (consumer-driven contract) ويتحقق المزود منها في CI قبل النشر، كما في أداة Pact. وداخل التطبيق يمكن كتابة مجموعة اختبارات واحدة لواجهة Repository وتشغيلها على كل implementation (في الذاكرة و PostgreSQL) لضمان أن الـ fake يتصرف كالحقيقي. اجعل العقد صغيرًا ومستقرًا، واحتفظ باختبارات تكامل تكشف اختلافات البيئة التي لا يغطيها العقد.
مثال بالكود
import pytest
class RepositoryContract:
"""اختبارات مشتركة تُشغّل على كل implementation."""
def make_repo(self): raise NotImplementedError
def test_get_missing_returns_none(self):
assert self.make_repo().get(999) is None
class TestInMemoryRepo(RepositoryContract):
def make_repo(self): return InMemoryUserRepo()
@pytest.mark.integration
class TestPostgresRepo(RepositoryContract):
def make_repo(self): return PostgresUserRepo(test_dsn())أخطاء شائعة
- fake في الذاكرة يتصرف بشكل مختلف عن قاعدة البيانات الحقيقية دون أن يكتشف أحد ذلك.
- استخدام contract tests كبديل كامل لاختبارات التكامل.