מבוא לפיתוח כונן מבחן (TDD)
דמיינו תרחיש שבו תרצו לכתוב את הפונקציה הבאה כחלק מפרויקט גדול יותר:
IN טקס פונקציה להחזרת סוג המשולש בהתבסס על הערך של אורך 3 צלעות של משולש. בואו נעשה את זה קצת יותר קל על ידי הנחה שהבדיקה לסוג נתוני הקלט כבר קיימת, כך שתקבלו רק ערכים מספריים לעבוד איתם.
המצב נראה קל. תמשיך לכתוב את הפונקציה שנראית בערך כך -
אלגוריתם:
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. assert(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) יוצרים נקודה ולא משולש. למעשה אם ערך קלט כלשהו הוא אפס המשולש אינו אפשרי. אבל במקרה שלנו זה יחזיר משולש שווה צלעות!
- גם ה 5 המשפט מזכיר לנו שהאורך לעולם לא יכול להיות ערך שלילי. אתה רואה קנה מידה שאורכו -30 ס"מ. לכן אם יש לנו אפילו ערך -ve אחד באורך המשולש אינו אפשרי. אבל במקרה שלנו בהתאם לערך זה עשוי להחזיר כל אחת מ-3 התוצאות. כאן זה מחזיר סקלר.
- עכשיו מה עם ה 6 הַצהָרָה. כל הערכים הם >= 0 וזה בוודאי משולש סקלרי. או שכן? זכור את הכלל שבמשולש סכום של כל 2 צלעות תמיד גדול או שווה ל-3.
כאן אנו רואים עבור:
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
הפונקציה הקודמת שלנו כוללת כעת 2 שורות נוספות בהתחלה וולה! כל המבחנים עוברים עכשיו.
document.queryselector
זהו רק תרחיש פשוט לדוגמה כדי להזכיר לנו שכאשר אנו כותבים קוד ברמת ייצור עלינו להיות זהירים אפילו בדברים פשוטים. על ידי שמירה על מקרי הקצה הפשוטים ובדיקה עם מקרי מחרוזת אחידים, הגדלנו את כיסוי הבדיקות שלנו וגרמנו לתוכנית שלנו להחזיר תוצאות נכונות יותר מבחינה מתמטית.
להלן יישום הגישה לעיל:
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 בפועל.