إما/أو التأكيدات Unittest
-
21-12-2019 - |
سؤال
في 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
, ، وتداعيات تغيير السلوك.