مقدمة لاختبار تطوير القيادة (TDD)
تخيل سيناريو حيث تريد كتابة الوظيفة التالية كجزء من مشروع أكبر:
في قم بوظيفة لإرجاع نوع المثلث بناءً على قيمة طول أضلاع المثلث الثلاثة. لنجعل الأمر أسهل قليلاً من خلال افتراض أن اختبار نوع بيانات الإدخال موجود بالفعل، لذا تتلقى قيمًا رقمية فقط للعمل بها.
يبدو الوضع سهلاً. تمضي قدمًا وتكتب الوظيفة التي تبدو مثل هذا -
الخوارزمية :
Input : 3 numeric values
Output : 1 string stating type of triangle
Function : triangleType (side1 side2 side3)
Start :
1. If side1 == side2 == side3
Then Return Equilateral Triangle
2. Else if side1 == side2 or side1 == side3 or side2 == side3
Then Return Isosceles Triangle
3. Else
Return Scalar Triangle
Stop
بعد إكمال الوظيفة، يتم إعطاؤك بعض التأكيدات للقيام بها. ولدهشتك تجد أن 50% فقط من الحالات مرت.
دعونا نلقي نظرة على بيانات الاختبار. والذين يمرون هم :
1. تأكد إذا (String_toLowerCase(triangle_type(678))==المثلث العددي) = صحيح
2. تأكد إذا (String_toLowerCase(triangle_type(666))==مثلث متساوي الأضلاع) = صحيح
3. التأكيد(String_toLowerCase(triangle_type(676))==مثلث متساوي الساقين) = صحيح
حسنًا، تبدو الأمور جيدة حتى هنا. لكن من فشلوا هم:
4. تأكد إذا (String_toLowerCase(triangle_type(000))==ليس مثلثًا) = غير صحيح
5. تأكد إذا (String_toLowerCase(triangle_type(-6-7-8))==ليس مثلثًا) = غير صحيح
6. تأكد إذا (String_toLowerCase(triangle_type(528))==ليس مثلثًا) = غير صحيح
- في الرابع قيم إدخال البيان هي (000). الآن نعلم أن (000) يشكل نقطة وليس مثلثًا. في الواقع، إذا كانت أي قيمة مدخلة هي صفر، فإن المثلث غير ممكن. ولكن في حالتنا سيعود مثلث متساوي الأضلاع!
- أيضا الخامس تذكرنا العبارة أن الطول لا يمكن أن يكون قيمة سالبة أبدًا. ترى مقياسًا يبلغ طوله -30 سم. وبالتالي، إذا كان لدينا قيمة واحدة للطول، فإن المثلث غير ممكن. ولكن في حالتنا اعتمادًا على القيمة، قد يُرجع أيًا من النتائج الثلاثة. هنا ترجع العددية.
- الآن ماذا عن السادس إفادة. جميع القيم >= 0 وهو بالتأكيد مثلث قياسي. أم هو كذلك؟ تذكر القاعدة التي تنص على أن مجموع أي ضلعين في المثلث يكون دائمًا أكبر من أو يساوي الضلع الثالث.
وهنا نرى ل:
8 + 2 > 5
8 + 5 > 2
5 + 2 > 8
الإخراج :
True
True
False
فشل في اختبار المثلثية. ومن ثم فإن الأطوال (258) لا تشكل مثلثا.
إذن ما نحتاج إليه هو نوع من التحقق من صحة المثلث والذي يخبرنا ما إذا كان ما لدينا هو مثلث أم لا. كجزء من الحل تكتب دالة أخرى تبدو كما يلي:
الخوارزمية :
Input : 3 sides of the triangle
Output : Boolean value: True if 3 sides form a triangle false otherwise
Function : triangleValidator(side1 side2 side3)
Start
1. If (side1 <= 0 or side2 <= 0 or side3 <= 0) and
(side2 + side3 >= side1) and
(side3 + side1 >= side2) and (side1 + side2 >= side3)
then return True
3. Return False
Stop
تتضمن وظيفتنا السابقة الآن سطرين إضافيين في البداية وwola! كلها اختبارات تمر الآن.
هذا مجرد مثال بسيط لسيناريو يذكرنا أنه عندما نكتب كود مستوى الإنتاج علينا أن نكون حذرين حتى مع الأشياء البسيطة. من خلال وضع حالات الحافة البسيطة في الاعتبار والتحقق من حالات السلسلة الموحدة، قمنا بزيادة تغطية الاختبار وجعلنا برنامجنا يُرجع نتائج أكثر صحة من الناحية الرياضية.
فيما يلي تنفيذ النهج أعلاه:
Python3# Check if given sides form a triangle or not def triangleValidator(side1 side2 side3): if side1 <= 0 or side2 <= 0 or side3 <= 0: return False elif (side1 + side2 >= side3) and (side2 + side3 >= side1) and (side3 + side1 >= side2): return True return False # Return the type of triangle def triangleType(side1 side2 side3): # If not a triangle return 'Not a triangle' if triangleValidator(side1 side2 side3) == False: return 'Not A Triangle' # Else perform type checking if side1 == side2 == side3: return 'Equilateral Triangle' elif (side1 == side2) or (side2 == side3) or (side3 == side1): return 'Isosceles Triangle' return 'Scalar Triangle' def call(): print(triangleType(678)) print(triangleType(666)) print(triangleType(676)) print(triangleType(000)) print(triangleType(-6-7-8)) print(triangleType(528)) if __name__=='__main__': call()
JavaScript // Check if given sides form a triangle or not function triangleValidator(side1 side2 side3) { if (side1 <= 0 || side2 <= 0 || side3 <= 0) { return false; } else if (side1 + side2 > side3 && side2 + side3 > side1 && side3 + side1 > side2) { return true; } return false; } // Return the type of triangle function triangleType(side1 side2 side3) { // If not a triangle return 'Not a triangle' if (triangleValidator(side1 side2 side3) === false) { return 'Not A Triangle'; } // Else perform type checking if (side1 === side2 && side2 === side3) { return 'Equilateral Triangle'; } else if (side1 === side2 || side2 === side3 || side3 === side1) { return 'Isosceles Triangle'; } return 'Scalar Triangle'; } // Assertions console.assert(triangleType(6 7 8).toLowerCase() === 'scalar triangle'); console.assert(triangleType(6 6 6).toLowerCase() === 'equilateral triangle'); console.assert(triangleType(6 7 6).toLowerCase() === 'isosceles triangle'); console.assert(triangleType(0 0 0).toLowerCase() === 'not a triangle'); console.assert(triangleType(-6 -7 -8).toLowerCase() === 'not a triangle'); console.assert(triangleType(5 3 8).toLowerCase() === 'not a triangle');
البرنامج أعلاه عند اختباره على التأكيدات التي تمت مناقشتها من قبل سوف يجتاز الآن حالات الاختبار.
في الصناعة، يُطلق على الخروج بحالات ركنية ثم تطوير الوظائف للتأكد من اجتياز حالات الاختبار هذه اسم "التطوير القائم على الاختبار". هذه المدونة هي مجرد لمحة عما يعنيه TDD عمليًا.