سؤال

لقد بدأت مؤخرا باستخدام أدوات تغطية التعليمات البرمجية (particularily إيما EclEmma), و أنا حقا أحب يرى أنه يعطي لي أن اكتمال الاختبارات وحدتي و القدرة على رؤية ما هي المجالات من قانون بلدي وحدة الاختبارات لا تصل على الإطلاق.أنا حاليا العمل في المنظمة التي لا تفعل الكثير من وحدة اختبار و أنا أخطط حقا دفع الجميع إلى وحدة اختبار مدونة التغطية و TDD ونأمل تحويل المنظمة.

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

//this class is meant as a pseudo-enum - I'm stuck on Java 1.4 for time being
public final class BillingUnit {

    public final static BillingUnit MONTH = new BillingUnit("month");
    public final static BillingUnit YEAR = new BillingUnit("year");

    private String value;

    private BillingUnit(String value) {
        this.value = value;
    }

    public String getValue() {
        return this.value;
    }

    public boolean equals(Object obj) {
        return value.equals(((BillingUnit) obj).getValue());

    }

    public int hashCode() {
        return value.hashCode();
    }
}

كتبت بعض بسيطة وحدة الاختبارات للتأكد من أن equals() يعمل بشكل صحيح ، getValue() بإرجاع ما كنت أتوقع ، إلخ.ولكن بفضل البصرية طبيعة EclEmma ، hashcode() طريقة يظهر مشرق الأحمر "لم يتم اختباره".

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

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

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

المحلول

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

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

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

نصائح أخرى

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

if(logger.isDebugEnabled()) {
    logger.debug("something");
}

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

لمجرد أن يكون واضحا ، والسبب أعتقد الحالات المذكورة أعلاه ينبغي أن تستثنى من التغطية هو أن:

  • لا اختبار هذه الوظيفة هو موافق.لا يجب أن تعمل من خلال مجموعة كاملة من الاختبارات 5 مرات ، مع تسجيل مكتبة تعيين كل مستوى التسجيل فقط للتأكد من أن جميع البيانات الخاصة بك هي ضرب.
  • إذا لم تقدم الانحراف التغطية الخاصة بك بطريقة أخرى.إذا كان 90% من الفروع if(log.isDebugEnabled()), و يمكنك اختبار كل منهم ولكن لا يوجد فروع أخرى ، وسوف تبدو وكأنها لديك 90% فرع التغطية (جيد), بينما في الحقيقة, لديك 0% غير تافهة فرع التغطية (سيئة!!).

وهناك اختلاف بين مدونة التغطية وتغطية الاختبار. يجب عليك محاولة للتأكد من أن الشفرة يتم اختبار كاف بدلا من 100٪ تغطية رمز.

والنظر في التعليمة البرمجية التالية:

public float reciprocal (float ex)
{
    return (1.0 / ex) ;
}

إذا قمت بتشغيل اختبار واحد التي مرت في قيمة 1.0 فإنك سوف تحصل على 100٪ تغطية رمز (فرع وبيان) مع كل يمر. رمز ومن الواضح وجود خلل.

وقياس اختبار التغطية أكثر صعوبة واحدة التي تأتي من أن تصبح مطور أفضل واختبار.

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

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

كما للاختبار equals, hashCode وبعض آخر العقد على أساس واجهات مثل Comparable و Serializable, أنا لا تشمل هذه الاختبارات.من المهم أن equals/hashCode العقد يتم تنفيذها بشكل صحيح ، وبالمثل مع equals/Comparable.

انظر JUnit-Addons, خاصة

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

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

وأيضا، لTDD، كنت ترغب تغطية 100٪، لأنه عندها يمكنك أن تكون متأكدا (أو قريبة جدا من ذلك) انك لا كسر أي شيء عند ريفاكتور.

وزميل مبرمج تمسك مثلي في Java1.4 القديم؛)

وكما قال في سابقة الإجابة ، رمز تغطيتها ليست متاحة اختبارها. والاستنتاج هو: من وجهة نظر معينة، والطريقة الوحيدة لتحسين تغطية رمز هو ... لحذف كود

!

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

وكما قلت في مكان آخر، وانخفاض رمز التغطية مشكلة، ولكن ارتفاع رمز تغطية لا يعني أن كنت تكتب الذهب الخالص.

إذا كنت لا تشعر بالقلق إزاء رمز تغطية، ثم أنا أقترح أن كنت بحاجة اختبارات equals() وgetValue() - اعتمادا على كيف وأين يستخدم hashCode() (آسف، أنا C # المطور)، فإنك <م> قد نريد لاختبار ذلك.

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

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

وهذا سوف تعطيك مدونة التغطية، وفي الصفقة وسوف تعطيك بعض الثقة في أن يرضي شفرة التجزئة في الواقع العقد الذي أبرمته: -)

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

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