تكرار السؤال: …
الإجابة المختصرة
اختبر الـ client عبر transport وهمي أو fake server، مع محاكاة الحالات الفاشلة (timeouts و 5xx و payload غير صالح)، ثم أضف عددًا محدودًا من اختبارات العقد أو التكامل ضد الخدمة الحقيقية.
الشرح
الشبكة الحقيقية تضيف بطئًا وعدم استقرار واعتمادًا على حالة خدمة خارجية. مكتبات مثل httpx توفر MockTransport، وتوجد أدوات مثل respx و responses لاعتراض الطلبات. لا تجعل الـ fake يعيد نجاحًا دائمًا؛ فقيمة الاختبار في التحقق من التعامل مع الأخطاء وإعادة المحاولة وتحويل البيانات. وامنع الاتصالات الحقيقية في الاختبارات افتراضيًا (مثل pytest-socket) حتى لا تتسرب.
مثال بالكود
import httpx
def handler(request: httpx.Request) -> httpx.Response:
if request.url.path == "/users/1":
return httpx.Response(200, json={"id": 1, "name": "Omar"})
return httpx.Response(503)
def test_get_user():
client = httpx.Client(transport=httpx.MockTransport(handler), base_url="https://api.test")
assert UserClient(client).get(1).name == "Omar"
def test_service_unavailable():
client = httpx.Client(transport=httpx.MockTransport(handler), base_url="https://api.test")
with pytest.raises(ServiceUnavailable):
UserClient(client).get(2)أخطاء شائعة
- اختبارات تستدعي APIs حقيقية فتفشل عند انقطاع الإنترنت أو تغير البيانات.
- اختبار مسار النجاح فقط وتجاهل المهلات وأخطاء الخادم.