اختبار API / متوسط: عقود متفاعلة / الدرس 11
اختبار التحديثات الشرطية ومنع ضياع التعديل
نمذجة محررين وشرط مسبق لجعل توقعات التزامن صريحة وقابلة للإعادة.
في هذه الصفحة
أهداف الدرس
- شرح رفض الكتابة القديمة ومحققات التمثيل.
- التمييز بين نموذج سياسة تسلسلي وإنفاذ متزامن ذري.
وصف التداخل قبل اختيار الإصلاح
قد يقرأ محرران الملاحظة نفسها ويجهزان تغييرين ثم يكتبان بالتتابع. دون شرط مسبق قد تستبدل الكتابة الثانية الأولى بصمت. سم التداخل: القراءتان تريان الإصدار الأول، ويكتب المحرر A الإصدار الثاني، ثم يحاول B الكتابة استنادا إلى الأول. حدد هل يرفض العقد الكتابة القديمة أو يدمج الحقول أو يستخدم سياسة مراجعة أخرى. لا تكشف حالة تحديث ناجحة واحدة الضياع رغم صحة الاستجابة والمخطط.
إبقاء المحققات مبهمة ومقيدة
ETag محقق تمثيل وليس رقما يرفعه العميل بنفسه. تستخدم If-Match مقارنة قوية وفق HTTP، فلا تستبدل المحققات الضعيفة بالقوية في هذا الشرط. يجب أن تحدد الخدمة التمثيل الذي يخصه المحقق وكيف تستخدمه الكتابة. يوضح مثال الرسالة غير القابل للتنفيذ شكل الشرط بقيم مختلقة، ولا يثبت التحليل الفعلي أو توليد المحقق أو الحالة أو سلوك الوسطاء. لا تحذف علامتي الاقتباس لأن النص الداخلي يشبه رقم إصدار.
PUT /notes/note-4 HTTP/1.1
Host: catalog.example.invalid
Content-Type: application/json
If-Match: "note-v1"
{"text":"Revised classroom note"}
لا ترسل هذه الرسالة ولا يحللها خادم. المضيف بيانات مثال محجوزة والمحقق خيالي. يجب أن تتبع دلالات الطريقة وخريطة الرفض عقد الخدمة وتنفيذ HTTP المعتمدين.
جعل فحص الكتابة القديمة حتميا
يمكن لآلة حالة محلية توضيح القرار قبل اختبار آلية التزامن. يسمح البرنامج لـA بتحديث البيانات، ويرفض توقع B القديم ويحفظ نص A. يفحص الرفض والحالة النهائية معا. التنفيذ متسلسل وداخل عملية واحدة عمدا. يجب أن تقارن طبقة التخزين وتعدل ذريّا؛ ففحص الإصدار ثم الكتابة في عمليتين يترك سباقا. لذلك يثبت نجاح النموذج مثال السياسة لا المعاملة أو القفل في قاعدة بيانات.
note = {"version": 1, "text": "Original"}
def update(expected, text):
if note["version"] != expected:
return "STALE_WRITE"
note.update(version=expected + 1, text=text)
return "UPDATED"
assert update(1, "Editor A") == "UPDATED"
assert update(1, "Editor B") == "STALE_WRITE"
assert note == {"version": 2, "text": "Editor A"}
print("stale update rejected")
stale update rejected
يفحص البرنامج الكامل تداخلا محددا بإصدارات صحيحة لبيانات التدريب. ليس محلل ETag ولا يضمن الذرية بين العمليات. لا يستخدم قاعدة أو خيطا أو خدمة أو عملية إدارة.
تغطية الشروط الغائبة وغير الصحيحة
يحدد العقد الذي يشترط شروطا مسبقة حالات الغياب والعطب والقدم والصحة. أدرج موردا ثابتا وآخر متغيرا وحذفا بين القراءة والكتابة إن دعم. افصل الصلاحية؛ فامتلاك محقق حالي لا يمنح إذن تعديل الملاحظة. تحقق من عدم إدراج عمل أو تغيير حالة مشتقة عند فشل الشرط. إذا سمح التطبيق بالكتابة غير الشرطية عمدا فوثق الخيار بدلا من افتراض قاعدة واحدة لكل تحديث. راجع البروتوكول وسياسة العمل معا.
إسناد الذرية إلى الدليل المناسب
يجب أن يضبط اختبار السباق الحقيقي التوقف بين القراءة والاعتماد في بيئة مؤقتة مصرح بها، لا أن يعتمد على توقيت عارض أو دفعات طلبات كبيرة. حدد من اعتمد ومن رفض والحالة والآثار المتبقية. كرر عند تغير التنفيذ أو بقاء شك في الجدولة فقط. سجل المحرك وافتراضات العزل والآلية دون تعميم. قيمة النموذج المحلي في تحديد النتيجة؛ أما اختبار التكامل فيجيب عن فرض الآلية لها ذريّا.
الأخطاء الشائعة وإصلاحها
ينجح محرران قديمان في الاستبدال
- لماذا يحدث؟
- لا يملك التحديث حدا فعالا للمقارنة والتعديل.
- كيف تصلحه؟
- استخدم آلية كتابة شرطية ذرية مراجعة.
- كيف تتجنب تكراره؟
- أدرج حالة تداخل مضبوطة بقارئين.
يرفع العميل ETag بنفسه
- لماذا يحدث؟
- يعامل المحقق المبهم كعداد تطبيق.
- كيف تصلحه؟
- احفظ وأعد تمثيل المحقق الموثق بدقة.
- كيف تتجنب تكراره؟
- اختبر الاقتباس والقوة والضعف ونطاق التمثيل.
يتجاوز محقق حالي الصلاحية
- لماذا يحدث؟
- يخلط ضبط التزامن بالتفويض.
- كيف تصلحه؟
- افحص صلاحية الفاعل الموثوق مستقلا.
- كيف تتجنب تكراره؟
- أدرج فاعلا مرفوضا مع شرط حالي صحيح.
اختبر فهمك
1. ينجح A ويتلقى B خطأ كتابة قديمة. ما الرصد النهائي المطلوب؟
اعرض الحل المشروح
يجب أن يحتوي المورد تعديل A والإصدار الجديد المتوقع دون أثر خاص بـB. لا تكفي رسالة الرفض إذا كتب نص B قبل الفحص. التقط الحالة النهائية وأي حدث مهم للعقد.
2. هل يثبت نجاح نموذج Python التسلسلي منع التخزين الحقيقي للسباقات؟
اعرض الحل المشروح
لا. يثبت السياسة لتداخل حتمي واحد. يجب أن يقارن التخزين ويعدل ذريّا وفق نموذج تزامنه. افحص الآلية مستقلا بمشاركين مضبوطين في بيئة معزولة معتمدة وسجل الافتراضات.
أهم ما تعلمته
- يبدأ اختبار التزامن بتداخل مسمى وحالة نهائية متوقعة.
- لا تمنح المحققات صلاحية.
- تحدد النماذج المتسلسلة السياسة وتحتاج الذرية دليلا مستقلا.