اختبار الوحدة: هل من الممارسات الجيدة أن يكون لديك تأكيدات في أساليب الإعداد؟

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

سؤال

في اختبار الوحدة ، يتم استخدام طريقة الإعداد لإنشاء الكائنات اللازمة للاختبار.

في طرق الإعداد هذه ، أحب استخدام التأكيدات: أعرف القيم التي أريد رؤيتها في تلك الكائنات ، وأحب توثيق تلك المعرفة عبر تأكيد.

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

ولكن لا يوجد فرق كبير في "الإعداد مع الحواسات" واختبار الوحدة يستدعي اختبارات الوحدة الأخرى.

ومن هنا سؤالي: هل من الجيد أن يكون لديك تأكيدات في أساليب الإعداد؟

تعديل:

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

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

المحلول

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

لقد رأيت عدة مزايا:

  • ال يبقي الإعداد قصيرًا ومركّزًا, ، لقابلية القراءة.
  • يتم تشغيل التأكيدات مرة واحدة فقط ، وهو أكثر من ذلك فعال.

الاستخدام والمناقشة :

على سبيل المثال ، أسمي طريقة TestSetup ().

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

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

  1. بعض الاختبارات التي تختبر الكود المحلي ،
  2. وبعض الاختبارات التي تستدعي المزيد من التعليمات البرمجية العالمية ، والتي تسمي بشكل غير مباشر نفس الرمز مثل الاختبار السابق.

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

نصائح أخرى

إنها سيناريوهات مختلفة. لا أرى التشابه.

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

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

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

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

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

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

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

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

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

byte[] pkt = pktFactory.makePacket(TIME, 12, "23, F2");
assert pkt.length == 15;

إن الفشل له نظام التأثير ليس في حالة حتى محاولة لتشغيل هذا الاختبار.

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