logo

Не забравяйте Edge Cases!

Въведение в разработката на 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 на практика.
 

Създаване на тест