كيف يمكنني التعامل مع الاتساق في نهاية المطاف في SimpledB ، خاصة فيما يتعلق باختبار الوحدة؟

StackOverflow https://stackoverflow.com/questions/1383332

سؤال

نحن نقوم ببناء تطبيق ويب أعلى مكدس خدمات الويب Amazon ، وأنا أحبه حتى الآن.

نحن أيضًا نستفيد تمامًا من التطوير الذي يحركه الاختبار وهو ما يثبت أيضًا أنه رائع.

آمل فقط أن يتمكن شخص ما من مساعدتي من خلال مشكلة واجهتها تتعلق بـ Amazon SimpledB "الاتساق النهائي".

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

يمكنني المضي قدمًا بسهولة وأكتب اختبارات ذلك ، ويمكن أن تعمل جميعًا بشكل جيد ، لكنني على دراية بـ "الاتساق النهائي" وإمكانية أنه عندما أقوم بإجراء المكالمة لجلب المستخدم ، قد لا يكون المستخدم فعليًا أضاف بعد. من الواضح أنه إذا تم استدعاء وظيفة مستخدم Fetch ولم يكن المستخدم في النظام ، فسيعود ذلك كاذبة أو فشل.

ما أود معرفته هو ما هي أفضل طريقة للتعامل مع هذا؟ لقد رأيت اقتراحات من وضع وظيفة تنام لمدة 5 ثوان بين الطلبات ومحاولات 10 مرات. لقد رأيت أيضًا حلولًا مع دعم أسي. ما هو الحل الأمثل؟

هل كانت مفيدة؟

المحلول

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

إذا كنت تختبر رمز عميل SimpledB الخاص بك م/ديسيبل وهو استنساخ simpledb يمكنك تشغيله محليًا.

لكن هذا يثير مشكلة أكبر لأن SimpledB يوفر التناسق في نهاية المطاف وليس تناسقك القراءة. سوف تحتاج رمزك على الإطلاق إلى أن تكون قادرًا على التعامل مع حقيقة أنه لن يتم إرجاع العنصر المضافة حديثًا على الفور من GET أو استعلام.

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

نصائح أخرى

هل تختبر قاعدة البيانات أو الرمز الذي يتعارض معها؟ إذا كنت تختبر الرمز الذي يتعارض مع قاعدة البيانات ، فيجب أن يكون لديك اختبارات تتوقع أن يضيف الكود مستخدمًا ، فلا تُرجع مستخدمًا ، على سبيل المثال ، تم مرور بعض الوقت من الوقت. من الواضح أن هذا يتم إعداده بسهولة باستخدام DB مزيف يتتبع مقدار الوقت منذ الطلب الأخير ويعيد فقط القيمة المتوقعة بعد الوقت المحدد منذ انقضاء الطلب الأولي. سيكون لديك اختبارات مماثلة حيث يتم إعداد مزيف لعدم إرجاع القيمة أبدًا ، وإعدادها لإعادتها على الفور ، وما إلى ذلك للتصرف ، بحيث يتبع الكود الخاص بك السلوك المتوقع (الاقتراع مرتين على الأقل ، على سبيل المثال).

أولاً ، كما ذكر mocky ، فإن ضرب قاعدة البيانات الحقيقية في اختبارات الوحدة أمر خاطئ. قد تفعل ذلك في اختبارات التكامل ، ولكن هذه ستعمل لأن جميع اختبارات وحدتك تمر.

فيما يتعلق باختبارات الوحدة التي تدرك الاتساق النهائي ، إليك بعض الأفكار:

  1. اختبار يتم إرجاع هذا المستخدم من SimpledB بعد كتابته المكتوبة (لا يوجد تأثير على EC).

  2. اختبار أن المستخدم لم يتم إرجاعه من SimpledB بعد كتابه المكتوب (EC) وضع المستخدم قبول المستخدم خطأ

  3. اختبار أنه يتم التعامل مع الأخطاء من EC الحصول على خطأ + قبول خطأ اختبار الخطأ

كنت أفكر في استخدام طبقة من memcache (أو leasticcache) لتوفير مستخدم مخبأة ، لذلك عندما يتم كتابة المستخدمين إلى SimpledB يتم إرسالهم إلى ذاكرة التخزين المؤقت أيضًا. وعندما تحدث أخطاء SimpledB ، يتم فحص ذاكرة التخزين المؤقت بعد ذلك قبل أن يقرر الرمز أنه لا يوجد من هذا القبيل بالفعل.

(في الواقع أحب أن تسمع رأيك في تلك الفقرة الأخيرة)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top