ما هو السخرية من الكائنات ومتى أحتاج إليها؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

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

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

المحلول

يتم استخدام Object Mocking لإبعاد التبعيات عن اختبار الوحدة الخاصة بك.في بعض الأحيان، سيكون لديك اختبار مثل "SelectPerson" والذي سيحدد شخصًا من قاعدة البيانات ويعيد كائن الشخص.

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

نصائح أخرى

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

  1. أداء

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

  2. تعاون

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

يتيح لك الكائن الوهمي اختبار ما تكتبه فقط، والتفاصيل المجردة مثل الوصول إلى أحد الموارد (القرص، خدمة الشبكة، وما إلى ذلك).ثم يتيح لك النموذج الوهمي التظاهر بأنك ذلك المورد الخارجي أو الفئة أو أي شيء آخر.

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

سوف تظهر لك الممارسة متى تكون المحاكاة مفيدة ومتى لا تكون كذلك.

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

هل أحتاج إلى إطار عمل كائن وهمي؟

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

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

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

يسمى أحد الأنواع الشائعة التي أحب استخدامها موك, ، ولكن هناك العديد من البرامج الأخرى مثل RhinoMock والعديد منها التي لا أعرف عنها.

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

يحرر:مثال رائع من ويكيبيديا:فهو يسمح لك باختبار الكود مسبقًا، مثلما يستخدم مصمم السيارة دمية اختبار التصادم لاختبار سلوك السيارة أثناء وقوع حادث.

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

ما إذا كان إطار العمل الساخر مفيدًا أم لا يعتمد جزئيًا على لغة الكود الذي تكتبه.باستخدام اللغة الثابتة، تحتاج إلى بذل جهد إضافي لخداع المترجم لقبول كائناتك الوهمية كبديل للكائن الحقيقي.في اللغة المكتوبة ديناميكيًا مثل Python أو Ruby أو Javascript، يمكنك بشكل عام فقط إرفاق الأساليب بكائن أو فئة عشوائية وتمريرها كمعلمة - لذا فإن إطار العمل سيضيف قيمة أقل بكثير.

هناك إطاران محاكاة موصى بهما لاختبار .net Unit وهما Typemock Isolator وRhino Mock.

في الرابط التالي يمكنك رؤية شرح من Typemock لسبب حاجتك إلى إطار السخرية لاختبار الوحدة.

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