اختبار API / أساسي: ملاحظات واجهة موثوقة / الدرس 3
اختبار حدود JSON واختيارات التمثيل
التمييز بين التحليل والتحقق البنيوي والتحقق من قواعد المجال بحالات حدية صغيرة مقصودة.
في هذه الصفحة
أهداف الدرس
- فصل الغياب وnull والفراغ وfalse والصفر دون تحويل ضمني.
- اختيار الحالات الحدية من مجال الحقل الموثق وقواعد الترميز.
تسمية طبقة التحقق
يجيب تحليل JSON عن إمكان تفسير البايتات بصيغة JSON. ويسأل التحقق البنيوي عن شكل الكائنات والمصفوفات والحقول المطلوبة بعد فك الترميز. أما تحقق المجال فيسأل هل يمثل هذا الشكل إجراء عمل مسموحا. العدد الصحيح نحويا ليس بالضرورة حجم صفحة صالحا، والتاريخ السليم شكلا لا يثبت السماح بالحجز. افصل هذه الأخطاء ليصلح العميل المدخل المناسب. تبدأ الأمثلة بسلاسل وقواميس محلية ولا تختبر حدود جسم HTTP أو محلل إطار عمل.
فصل الغياب عن القيم الصريحة
قد يستخدم التحديث الجزئي وجود الحقل للتعبير عن النية. قد يعني حذف subtitle تركه كما هو، بينما تعني null مسحه إذا سمح العقد بذلك. والسلسلة الفارغة قيمة مرسلة أيضا. تجنب شروط الصدق العامة مثل if value عندما يكون الصفر أو false أو المجموعة الفارغة صالحا. يحافظ البرنامج الأول على الفرق بين الغياب وnull والقيم العادية. إنه مصنف مقصود وليس أداة تحقق عامة؛ وعلى الواجهة توثيق الحالات التي يقبلها كل حقل.
def classify(payload, key):
if key not in payload:
return "absent"
if payload[key] is None:
return "null"
return "value"
assert classify({}, "subtitle") == "absent"
assert classify({"subtitle": None}, "subtitle") == "null"
assert classify({"subtitle": ""}, "subtitle") == "value"
print("presence cases accepted")
presence cases accepted
يقارن البرنامج الكامل ثلاث حمولات مستقلة دون تعديلها. يثبت تمييز المصنف للحالات المذكورة، ولا يقرر السماح بالمسح أو بالنص الفارغ في تطبيق حقيقي.
اختبار جانبي حدود المجال
لحجم صفحة موثق من واحد إلى خمسين اختر صفر وواحد وخمسين وواحدا وخمسين قبل الأمثلة العشوائية. افحص أيضا سلسلة أرقام وقيمة كسرية وقيمة منطقية. تعتبر Python النوع bool فرعا من int، لذا يقبل isinstance(value, int) القيمة True. تختلف قواعد التحويل بين بيئات التنفيذ. حدد مجال الواجهة بدلا من الاعتماد على مصادفة لغوية. يستخدم المثال الثاني النوع الصحيح الدقيق لهذه السياسة المختلقة ويعيد علامة خطأ ثابتة دون كشف استثناء خام.
def page_size(value):
if type(value) is not int or not 1 <= value <= 50:
return "INVALID_PAGE_SIZE"
return value
for value in [0, 51, "3", 1.5, True, None]:
assert page_size(value) == "INVALID_PAGE_SIZE"
for value in [1, 50]:
assert page_size(value) == value
print("eight boundary cases accepted")
eight boundary cases accepted
هذه سياسة تطبيق واحدة وليست تنفيذا عاما لمخطط JSON. يفحص المثال ثماني حالات محلية. يحتاج المحلل الحقيقي وتجاوز الأعداد وتكرار أسماء الكائنات وحدود حجم الطلب إلى اختبارات منفصلة.
تحديد تمثيل النصوص والأعداد
الطول غامض حتى يحدد العقد وحدة العد. تختلف البايتات ونقاط Unicode والمحارف التي يراها المستخدم، خاصة مع العلامات المركبة والرموز التعبيرية. تحتاج العملات والمعرفات إلى قرارات تمثيل واضحة أيضا: قد تتطلب الكسور حسابا عشريا أو أعداد وحدات صغيرة صحيحة، وقد تناسب السلاسل المعرفات الكبيرة لدى عملاء مختلفين. حافظ في الاختبارات على التمثيل المختار خلال التسلسل والتحليل. استخدم بيانات قصيرة متعددة اللغات وسلاسل عند الحدود؛ لا داعي لإرسال حمولات هائلة إلى خدمة حقيقية.
رفض الغموض قبل قبول نتيجة الاختبار
قد تختلف معالجة الحقول المجهولة وأسماء الكائنات المكررة والأعداد غير المنتهية وصيغ التاريخ بين المحللات وأدوات المخططات. ثبت المحلل الفعلي ولهجة المخطط في بيئة معتمدة ووثق السلوك المقصود. لا تفترض أن كل مدقق JSON Schema يفرض format كشرط تحقق. حافظ على الفرق بين مدخل معطوب وقيمة صحيحة تخالف سياسة العمل. نجاح المساعد دليل عنه فقط؛ ويحتاج تفسير التطبيق للبايتات إلى اختبار حد مستقل ومصرح به.
الأخطاء الشائعة وإصلاحها
يرفض الصفر بوصفه غائبا
- لماذا يحدث؟
- يخلط شرط الصدق بين القيم الصحيحة والغياب.
- كيف تصلحه؟
- افحص الوجود وقبول null والنوع والمجال منفصلة.
- كيف تتجنب تكراره؟
- أدرج false والصفر والفراغ وnull والحذف في مراجعة الحقول.
تقبل True في حقل أعداد صحيحة فقط
- لماذا يحدث؟
- يرث المدقق علاقة النوع المنطقي بالعدد الصحيح في Python.
- كيف تصلحه؟
- استخدم قاعدة مجال القيم المقصودة في العقد.
- كيف تتجنب تكراره؟
- اختبر التحويلات الخاصة باللغة بحالات مختلقة.
يمر تاريخ غير صالح من المخطط
- لماذا يحدث؟
- يتعامل المدقق المختار مع format بوصفه وصفا.
- كيف تصلحه؟
- افحص اللهجة والمفردات وإعداد فرض الصيغة.
- كيف تتجنب تكراره؟
- سجل سلوك المدقق بدلا من افتراض فرض الكلمة.
اختبر فهمك
1. حد الحقل خمسون بايت UTF-8. هل تقبل سلسلة عربية من خمسين حرفا بالضرورة؟
اعرض الحل المشروح
لا. يفحص حد البايتات بعد الترميز، وتشغل حروف عربية كثيرة عدة بايتات. احسب طول ترميز بيانات قصيرة محليا، ثم اختبر الحد الموثق وتحقق مستقلا من اتفاق التطبيق والعميل على وحدة العد.
2. يحذف تحديث جزئي subtitle. هل ينبغي توقع تحويله إلى null؟
اعرض الحل المشروح
فقط إذا نص العقد على ذلك. في السياسة الخيالية هنا يبقي الحذف القيمة دون تغيير، وتمسحها null الصريحة عندما يسمح بذلك. أنشئ حالتين مستقلتين قبل التحديث وبعده بدلا من اختبار حمولة فارغة واحد لكل الحالات.
أهم ما تعلمته
- يجيب التحليل والبنية وصلاحية العمل عن أسئلة مختلفة.
- تشمل اختبارات الحدود اختيارات التمثيل والتحويل.
- الغياب وnull الصريحة مدخلان مختلفان.