سؤال

في Unittest أريد أن أفعل شيئًا مثل:

result = myFunction()
self.assertFalse(result) OR self.assertRaises(Exception, myFunction)

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

هل أمر مثل هذا ممكن؟

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

المحلول

يمكنك التحقق مما إذا myFunction() يثير استثناء محددا:

try:
    self.assertFalse(myFunction())
except SpecificException:
    pass

في هذه الحالة إذا myFunction() يثير SpecificException سيتم تجاهله بصمت.

بمعنى آخر، سوف ترى فشل الاختبار في حالتين:أيضاً myFunction() يثير الاستثناء الذي لا تنتظره، أو نتيجة myFunction() لا يتم تقييم المكالمة ل False.


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

try:
    self.assertFalse(myFunction())
except AssertionError:
    raise
except:
    pass

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

نصائح أخرى

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

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

بدلاً من ذلك، قم بإجراء اختبار محدد يستخدم assertRaises.دع الاختبار يفشل إذا تغير التنفيذ، وقم بتغيير الاختبار بعد ذلك إلى assertFalse.قد يؤدي هذا التغيير أيضًا إلى فشل الاختبارات الأخرى، وهذا أمر جيد.سوف يجبرك على مراجعة حالات الاستخدام لـ myFunction, ، وتداعيات تغيير السلوك.

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