سؤال

لقد قرأت للتو مقالة ويكيبيديا كائنات وهمية, ، لكنني ما زلت غير واضح تمامًا حول هدفهم. يبدو أنها كائنات يتم إنشاؤها بواسطة إطار اختبار عندما يكون الكائن الفعلي معقدًا جدًا أو لا يمكن التنبؤ به (أنت تعرف 100 ٪ متأكد من قيم الكائن الوهمي لأنك تتحكم فيها بالكامل).

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

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

المحلول

كائن وهمية ليس مجرد كائن له قيم معروفة. إنه كائن له نفس الواجهة ككائن معقد لا يمكنك استخدامه في الاختبار (مثل اتصال قاعدة البيانات ومجموعات النتائج) ، ولكن مع تطبيق يمكنك التحكم فيه في الاختبار.

هناك أطر عمل يسخر تسمح لك بإنشاء هذه الكائنات أثناء الطيران وفي جوهرها تسمح لك أن تقول شيئًا مثل: اجعلني كائنًا بطريقة foo تأخذ int وإرجاع منطقة. عندما أمر 0 ، يجب أن يعود صحيح. ثم يمكنك اختبار الكود الذي يستخدم Foo () ، للتأكد من أنه يتفاعل بشكل مناسب.

مارتن فاولر لديه مقال رائع عن السخرية:

نصائح أخرى

فكر في الحالة الكلاسيكية لوجود برنامج عميل وخادم. لاختبار العميل ، تحتاج إلى الخادم ؛ لاختبار الخادم ، تحتاج إلى العميل. هذا يجعل اختبار الوحدة مستحيلًا إلى حد كبير - دون استخدام Mocks. إذا قمت بالسخرية من الخادم ، فيمكنك اختبار العميل في عزلة والعكس صحيح.

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

أنا أتفق مع كل شيء lou Franco يقول ، ويجب عليك بالتأكيد قراءة مقالة مارتن فاولر الممتازة حول اختبارات الزوجي التي تشير لك إلى.

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

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

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

إليك مثال: إذا كنت تكتب رمزًا يملأ قاعدة بيانات ، فقد ترغب في التحقق مما إذا كانت طريقة معينة قد أضافت بيانات إلى قاعدة البيانات.

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

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

يتيح لك Mock الحفاظ على الاختبارات مستقلة عن بعضها البعض وسهلة الإعداد.

هذا مثال واحد فقط - أنا متأكد من أن الآخرين يمكنهم توفير المزيد.

أوافق 100 ٪ مع المساهمين الآخرين في هذا الموضوع ، خاصة مع التوصية الخاصة بمقال مارتن فاولر.

You might be interested in our book, see http://www.growing-object-oriented-software.com/. It's in Java, but the ideas still apply.

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