محتويات الدورة

اختبار API / أساسي: ملاحظات واجهة موثوقة / الدرس 5

بناء بيانات معزولة واختبارات حتمية

ضبط الحالة والساعات والمعرفات والتبعيات دون استخدام خدمات مهيأة.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تصميم بيانات صغيرة تجعل الفشل قابلا للتفسير.
  • منع تسرب الحالة واستدعاء التبعيات عرضيا في الاختبارات المحلية.

اختيار أصغر عالم مفيد

بيانات الاختبار هي العالم المضبوط اللازم لفحص ادعاء. قد يكفي قارئان وكتابان لتمييز الملكية والتوفر في قائمة قراءة. تضيف البيانات الكبيرة المنسوخة تفاصيل غير مهمة ومخاطر خصوصية وغموضا. استخدم سجلات مختلقة بأسماء تبين دورها. ضع البيانات قرب الحالة أو وفر منشئا موثقا بقيم افتراضية مناسبة. يجب أن يظهر المنشئ الفرق الحاسم؛ فإخفاء الملكية في دالة تسهيل عامة يصعب مراجعة حالات الصلاحية.

إنشاء حالة قابلة للتغيير جديدة لكل حالة

يجب ألا تعتمد الاختبارات على ترتيب تشغيل الجيران. قد تربط القواميس العامة القابلة للتغيير والعملاء المعاد استخدامهم والمعرفات المخزنة الحالات عرضيا. أنشئ بيانات جديدة لكل حالة وتحقق من تنظيف الموارد التي تملكها. ينشئ المثال قاموسين مستقلين ويعدل أحدهما فقط. تبقي النسخة السطحية القوائم المتداخلة مشتركة، لذا يستخدم deepcopy لهذه البيانات الصغيرة. اختر في التطبيق آلية عزل تناسب الحد الفعلي؛ لا يفحص المثال المعاملات أو محرك قاعدة بيانات.

python فحص استقلال بيانات متداخلة
from copy import deepcopy
BASE = {"reader-a": {"entries": ["book-1"]}}
first = deepcopy(BASE)
second = deepcopy(BASE)
first["reader-a"]["entries"].append("book-2")
assert second["reader-a"]["entries"] == ["book-1"]
assert BASE["reader-a"]["entries"] == ["book-1"]
print("nested fixtures isolated")
الناتج المتوقع
nested fixtures isolated

يتحقق البرنامج الكامل من استقلال هذه الكائنات في الذاكرة. لا يقرأ بيانات المشروع ولا يغير خدمة. النسخ العميق أسلوب تدريبي هنا وليس بديلا عاما لعزل الموارد الخارجية.

حقن التبعية المهمة

تجعل الساعة أو مصدر المعرفات أو عملية البحث المحقونة الاختبار حتميا دون نوم أو اتصال بمزود بعيد. يجب أن يطبق البديل العقد الذي يستخدمه المستدعي بالفعل. قد يخفي بديل يعيد الجواب المرغوب دائما غياب التحقق أو خطأ الوسائط. سجل الاستدعاءات المهمة وافشل بوضوح عند استخدام غير متوقع. يوفر المثال الثاني بحثا ثابتا ويفحص الكتاب المطلوب. إنه اختبار حد عمل ولا يثبت اتصال HTTP أو مكتبة مزود أو بياناته.

python تبعية فهرس مضبوطة
calls = []
def lookup(book_id):
    calls.append(book_id)
    if book_id != "book-4":
        raise ValueError("UNEXPECTED_BOOK")
    return {"id": book_id, "available": True}

def can_add(book_id, catalog_lookup):
    return catalog_lookup(book_id)["available"] is True

assert can_add("book-4", lookup) is True
assert calls == ["book-4"]
print("lookup boundary checked")
الناتج المتوقع
lookup boundary checked

يفحص البرنامج الكامل المعرف المطلوب وقرار التوفر المختار. البديل محلي ومحدود عمدا. لا يجوز وصف نجاحه بأنه دليل على التزام مزود فهرس حقيقي بالعقد نفسه.

جعل التغير قابلا للإعادة

توسع المدخلات العشوائية التغطية، لكن الفشل غير المسجل مكلف الإعادة. احتفظ بالبذرة وإصدار المولد وأصغر مدخل فاشل عند استخدام أداة خصائص. قد لا تكفي البذرة بعد تغير التنفيذ أو البيئة. وقد تتصادم المعرفات الزمنية في التشغيل المتوازي عندما تقل الدقة عن الافتراض. فضل معرفات صريحة لكل حالة أو تسلسلا حتميا محقونا. لا تعالج التصادم بنوم اعتباطي؛ فهو يخفي تصميم الحالة المشتركة ويبطئ الاختبارات ويضعف موثوقيتها.

التمييز بين العزل والواقعية

يسهل فهم الاختبار المعزول، لكن كل بديل يترك حدا غير مختبر. احتفظ بقائمة تبين ما هو حقيقي أو محاكى أو غائب. يمكن لاختبارات تكامل لاحقة في بيئة مؤقتة معتمدة التحقق من المحولات وافتراضات المزود. لا توجه الاختبار المحلي إلى قاعدة أو خدمة مهيأة خفية لزيادة الواقعية. يجب أن يبقى الإنشاء والتنظيف ضمن الموارد المصرح بها. تعمل أمثلة هذا المساق القابلة للتنفيذ في التخزين المؤقت أو الذاكرة بأدوات المكتبة القياسية فقط.

الأخطاء الشائعة وإصلاحها

يفشل اختبار بعد اختبار آخر فقط

لماذا يحدث؟
الحالة المتداخلة القابلة للتغيير مشتركة.
كيف تصلحه؟
أنشئ حالة مستقلة وأعد الترتيب الفاشل.
كيف تتجنب تكراره؟
راجع ملكية البيانات ومنع التعديل العام العرضي.

يقبل البديل معرف كتاب خاطئا

لماذا يحدث؟
يتجاهل البديل الوسائط.
كيف تصلحه؟
ارفض المعرفات غير المتوقعة وأكد الاستدعاء المهم.
كيف تتجنب تكراره؟
طابق سلوك البديل مع عقد التبعية المستخدم.

يبدو الاختبار مستقرا بعد النوم

لماذا يحدث؟
يخفي التوقيت تصادم المعرفات أو الحالة.
كيف تصلحه؟
اضبط الساعة ومصدر المعرفات وأزل تبعيات الحالات.
كيف تتجنب تكراره؟
اعتبر حلول التأخير دلائل تشخيص لا إصلاحا.

اختبر فهمك

1. تسرب نسخة سطحية المدخلات المضافة. فسر وأصلح.

اعرض الحل المشروح

تختلف القواميس الخارجية لكن القائمة المتداخلة مشتركة. أنشئ بنية متداخلة جديدة أو نسخة عميقة مقصودة لهذه البيانات الصغيرة، وافحص بقاء المرجع دون تغيير. أما التخزين الخارجي فيحتاج إلى عزل موارده الفعلي.

2. يعيد بديل التبعية available=True دائما. ما الدليل الناقص؟

اعرض الحل المشروح

لا يثبت طلب المعرف الصحيح أو معالجة الكتب غير المتاحة والمفقودة. أضف نتائج محلية مختلفة وفحوص وسائط صريحة. وضح أن نقل المزود والتسلسل خارج الاختبار، وأسندهما إلى فحوص محول مصرح بها مستقلا.

أهم ما تعلمته

  • تكشف البيانات الصغيرة الفرق الحاسم.
  • تجعل الحالة الجديدة والتبعيات المحقونة الفشل قابلا للإعادة.
  • يثبت البديل الحد الذي ينمذجه عمدا فقط.

المراجع الرسمية