سؤال

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

هل توافق على أن هذه المفاضلة موجودة ؟ إذا كان الأمر كذلك ، هل تفضل الاختبارات الخاصة بك أن تكون قابلة للقراءة ، أو الصيانة?

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

المحلول

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

إن الازدواجية في تركيب انشاء النظر في تقديم المزيد من استخدام setUp طريقة أو توفير أكثر (أو أكثر مرونة) إنشاء طرق.

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

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

assertEqual('Joe', person.getFirstName())
assertEqual('Bloggs', person.getLastName())
assertEqual(23, person.getAge())

ثم ربما كنت في حاجة واحدة assertPersonEqual طريقة بحيث يمكنك كتابة assertPersonEqual(Person('Joe', 'Bloggs', 23), person).(أو ربما كنت ببساطة الحاجة إلى الزائد المساواة بين المشغل على Person.)

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

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

نصائح أخرى

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

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

كود التنفيذ واختبارات مختلفة من الحيوانات و العوملة تطبق قواعد مختلفة لهم.

تكرار رمز أو هيكل دائما رائحة في تنفيذ التعليمات البرمجية.عند بدء وجود النمطي في التنفيذ ، تحتاج إلى مراجعة تجريدات.

من ناحية أخرى, اختبار التعليمات البرمجية يجب الحفاظ على مستوى الازدواجية.الازدواجية في اختبار التعليمات البرمجية يحقق هدفين:

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

كنت تميل إلى تجاهل تافهة الازدواجية في اختبار التعليمات البرمجية طالما كل طريقة الاختبار يبقى أقصر من حوالي 20 خطوط.أنا أحب عندما الإعداد-تشغيل-التحقق من إيقاع الظاهر في طرق الاختبار.

عندما الازدواجية تزحف في "التحقق" جزء من الاختبارات ، غالبا ما يكون من المفيد تحديد مخصص الطرق التأكيد.بالطبع هذه الأساليب يجب أن لا يزال اختبار بوضوح العلاقة التي يمكن أن تكون واضحة في اسم الأسلوب: assertPegFitsInHole -> جيد ، assertPegIsGood -> سيئة.

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

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

يمكنك تقليل التكرار باستخدام عدة نكهات مختلفة من اختبار الأداة المساعدة طرق.

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

وأنا أتفق.مقايضة موجود ولكن مختلفة في أماكن مختلفة.

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

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

أنا أحب rspec بسبب هذا:

لديها 2 الأشياء للمساعدة -

  • مشترك سبيل المثال مجموعات اختبار شائع في السلوك.
    يمكنك تحديد مجموعة من الاختبارات ، ثم تدرج' التي تضع في الاختبارات الحقيقية.

  • تداخل السياقات.
    هل يمكن أن يكون أساسا 'الإعداد' و 'teardown' طريقة لمجموعة فرعية معينة من الاختبارات الخاصة بك ، ليس فقط كل واحد في الصف.

وكلما ذلك .NET/Java/اختبار آخر أطر تعتمد هذه الطرق أفضل (أو يمكنك استخدام IronRuby أو JRuby كتابة الاختبارات التي أنا شخصيا أعتقد هو أفضل خيار)

أنا لا أعتقد أن هناك علاقة بين تكرار رمز للقراءة.أعتقد رمز الاختبار الخاصة بك ينبغي أن تكون جيدة مثل الخاص بك التعليمات البرمجية الأخرى.عدم تكرار الكود هو أكثر قابلية للقراءة ثم تكرار رمز عند القيام به بشكل جيد.

من الناحية المثالية, وحدة الاختبارات يجب أن لا تتغير كثيرا بمجرد أنها مكتوبة لذلك أود أن تميل نحو القراءة.

وجود وحدة الاختبارات تكون منفصلة ممكن يساعد أيضا على الحفاظ على الاختبارات التي تركز على وظائف محددة التي تستهدفها.

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

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

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

العثور على الحق في مستوى من التجريد عند اختبار يمكن أن يكون صعبا و أشعر أنه يستحق القيام به.

"ريفاكتوريد لجعلها أكثر الجاف--القصد من كل اختبار لم تعد واضحة"

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

هذا هو السبب في اختبارات فرعية من UnitTest -- بحيث يمكنك تصميم اختبار جيد الأجنحة التي هي صحيحة وسهلة للتحقق من صحة واضحة.

في الأزمنة القديمة كان لدينا اختبار الأدوات التي تستخدم لغات البرمجة المختلفة.كان من الصعب (أو يستحيل) أن تصميم لطيف, سهلة العمل مع الاختبارات.

لديك السلطة الكاملة -- أي لغة كنت تستخدم -- Python, Java, C# - حتى استخدام تلك اللغة جيدا.يمكنك تحقيق حسن المظهر رمز اختبار هذا واضح جدا و لا زائدة.لا يوجد مفاضلة.

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