Въведение в разработката на Test Drive (TDD)
python запазва json във файл
Представете си сценарий, при който искате да напишете следната функция като част от някакъв по-голям проект:
IN rite функция за връщане на типа на триъгълник въз основа на стойността на дължината на 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))==не е триъгълник) = Неправилно
- В 4th входните стойности на израза са (000). Сега знаем, че (000) образуват точка, а не триъгълник. Всъщност, ако някоя входна стойност е нула, триъгълникът не е възможен. Но в нашия случай ще върне равностранен триъгълник!
- Също така 5-ти твърдението ни напомня, че дължината никога не може да бъде отрицателна стойност. Виждате скала с дължина -30 см. Следователно, ако имаме дори една -ve стойност на дължината, триъгълникът не е възможен. Но в нашия случай в зависимост от стойността може да върне всеки от 3-те резултата. Тук връща скалар.
- Сега какво да кажем за 6th изявление. Всички стойности са >= 0 и това със сигурност е скаларен триъгълник. Или е така? Запомнете правилото, че в триъгълник сборът от кои да е 2 страни винаги е по-голям или равен на 3-тата.
Тук виждаме за:
8 + 2 > 5
8 + 5 > 2
5 + 2 > 8
Изход:
True
True
False
Не издържа теста за триъгълност. Следователно дължините (258) не образуват триъгълник.
заместване от низ в java
Така че това, от което се нуждаем, е валидиране на един вид триъгълник, което ни казва дали това, което имаме, е дори триъгълник или не. Като част от решението пишете друга функция, която изглежда така:
Алгоритъм:
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 допълнителни реда в началото и 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 на практика.