الدقة في التقاط حالات الاختبار لاختبار الوحدة

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

  •  08-06-2019
  •  | 
  •  

سؤال

لنفترض أن لدينا وظيفة بسيطة محددة بلغة زائفة.

List<Numbers> SortNumbers(List<Numbers> unsorted, bool ascending);

نقوم بتمرير قائمة غير مصنفة من الأرقام وقيمة منطقية تحدد ترتيب الفرز تصاعديًا أو تنازليًا.في المقابل، نحصل على قائمة مرتبة من الأرقام.

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

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

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

المحلول

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

ملاحظة أخرى أريد تقديمها حول أدوات تغطية التعليمات البرمجية.في لغة مثل C# أو Java حيث يكون لديك العديد من أساليب get/set وطرق مماثلة، يجب عليك ذلك لا يتم التصوير لتغطية 100٪.هذا يعني أنك تضيع الكثير من الوقت في كتابة اختبارات التعليمات البرمجية التافهة.أنت فقط تريد تغطية 100% لمنطق عملك المعقد.إذا كانت قاعدة التعليمات البرمجية الكاملة لديك أقرب إلى تغطية بنسبة 70-80%، فأنت تقوم بعمل جيد.إذا كانت أداة تغطية التعليمات البرمجية الخاصة بك تسمح بمقاييس تغطية متعددة، فإن أفضلها هو "تغطية الكتلة" التي تقيس تغطية "الكتل الأساسية".الأنواع الأخرى هي تغطية الفئة والطريقة (والتي لا تمنحك الكثير من المعلومات) وتغطية الخط (وهي حبيبات دقيقة جدًا).

نصائح أخرى

كيف يمكنك معرفة متى "انتهيت" من التقاط حالات الاختبار؟

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

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

مقتطف من فن اختبار البرمجيات بواسطة جلينفورد ج.مايرز:

  1. إذا كان شرط الإدخال يحدد نطاقًا من القيم، فاكتب حالات اختبار لنهايات النطاق، وحالات اختبار إدخال غير صالح للمواقف التي تقع خارج النهايات مباشرةً.
  2. إذا كان شرط الإدخال يحدد عددًا من القيم، فاكتب حالات اختبار للحد الأدنى والحد الأقصى لعدد القيم وواحدة أسفل هذه القيم وما بعدها.
  3. استخدم المبدأ التوجيهي 1 لكل حالة الإخراج.
  4. استخدم المبدأ التوجيهي 2 لكل حالة الإخراج.
  5. إذا كان المدخلات أو المخرجات لبرنامج ما عبارة عن مجموعة مرتبة، ركز الانتباه على العنصرين الأول والأخير في المجموعة.
  6. بالإضافة إلى ذلك، استخدم براعتك للبحث عن شروط حدودية أخرى

(لقد قمت بلصق الحد الأدنى فقط لأسباب تتعلق بحقوق الطبع والنشر.)

النقاط 3.و 4.أعلاه مهمة جدا.يميل الناس إلى نسيان الشروط الحدودية للمخرجات.5.على ما يرام.6.حقا لا يساعد :-)

امتحان قصير

وهذا أصعب مما يبدو.يقدم مايرز هذا الاختبار:

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

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

اكتب حالات الاختبار الخاصة بك.كم لديك؟يطرح مايرز 14 سؤالاً حول مجموعة الاختبار الخاصة بك ويذكر أن البرامج المهنية المؤهلة تأهيلاً عاليًا يبلغ متوسطها 7.8 من أصل 14.

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

@ كيث

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

أداة تغطية التعليمات البرمجية الجيدة تساعد حقًا.

التغطية بنسبة 100% لا تعني أنها بالتأكيد تم اختبارها بشكل كافٍ، ولكنها مؤشر جيد.

بالنسبة لـ .Net NCover، فهو جيد جدًا، لكنه لم يعد مفتوح المصدر.


Mike Stone - نعم ، ربما كان ينبغي أن يكون "تغطية عالية" - نهدف إلى 80 ٪ على الأقل ، بعد حوالي 95 ٪ من العوائد المتناقصة عادة ، خاصة إذا كان لديك رمز الأسنان حزام.

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