سؤال

يمكنني استخدام NMOCK2، وقد قمت بصياغة فئات NMOCK التالية لتمثيل بعض مفاهيم Frame Framework الشائعة:

  • Expect: هذا يحدد ما يجب أن تعود طريقة السخرية ويقول أن المكالمة يجب أن تحدث أو فشل الاختبار (عند مصحوب استدعاء VerifyAllExpectationsHaveBeenMet()).

  • Stub: هذا يحدد ما يجب أن يعوده طريقة السخرية ولكن لا يمكن أن يسبب الاختبار فشل.

إذن ما الذي يجب علي فعله متى؟

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

المحلول

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

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

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

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

يحرر: قد يكون الأمر أكثر وضوحا على مثال مفصل حيث يقوم كائن آلة حاسبة بتدقيق جميع الإضافات إلى قاعدة بيانات (في الكود الزائفي) ...

public void CalculateShouldAddTwoNumbersCorrectly() {
    var auditDB = //Get mock object of Audit DB
    //Stub out the audit functionality...
    var calculator = new Calculator(auditDB);
    int result = calculator.Add(1, 2);
    //assert that result is 3
}

public void CalculateShouldAuditAddsToTheDatabase() {
    var auditDB = //Get mock object of Audit DB
    //Expect the audit functionality...
    var calculator = new Calculator(auditDB);
    int result = calculator.Add(1, 2);
    //verify that the audit was performed.
}

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

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

نصائح أخرى

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

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

حسنا ... IMHO لا يمكن أن يكون أكثر بساطة: إذا كان الاختبار الخاص بك هو ضمان سيقوم مقدمك بإحفظه، فقم بانتظام. إذا كان الاختبار الخاص بك يدور حول ضمان مقدم العرض الخاص بك سوف يتعامل مع الاستثناء بأمان إذا كان حفظ رميات، ففعل كعب.

لمزيد من التفاصيل، تحقق من هذا بودكاست من قبل هانزيلمان و Oshherove (مؤلف فن اختبار الوحدة)

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