logo

Nu uitați de husele Edge!

O introducere în dezvoltarea test drive (TDD)

Imaginați-vă un scenariu în care doriți să scrieți următoarea funcție ca parte a unui proiect mai mare:

ÎN rite o funcție pentru a returna tipul unui triunghi pe baza valorii lungimii a 3 laturi ale unui triunghi. Să ușurăm puțin, presupunând că testul pentru tipul de date de intrare este deja în vigoare, astfel încât să primiți doar valori numerice cu care să lucrați.



Situația pare ușoară. Continuați și scrieți funcția care arată cam așa -

Algoritm:   

    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

După ce finalizați funcția, vi se oferă câteva afirmații de efectuat. Și spre surprinderea ta constati că doar 50% din cazuri au trecut. 

Să ne uităm la declarațiile testului. Cele care trec sunt:
1. Afirmați dacă (String_toLowerCase(triangle_type(678))==triunghi scalar) = Corect 
2. Afirmați dacă (String_toLowerCase(triangle_type(666))==triunghi echilateral) = Corect 
3. assert(String_toLowerCase(triangle_type(676))==triunghi isoscel) = Corect 
Ei bine, lucrurile arată bine până aici. Dar cele care eșuează sunt:
4. Afirmați dacă (String_toLowerCase(triangle_type(000))==nu este un triunghi) = Incorect 
5. Afirmați dacă (String_toLowerCase(triangle_type(-6-7-8))==nu este un triunghi) = Incorect 
6. Afirmați dacă (String_toLowerCase(triangle_type(528))==nu este un triunghi) = Incorect 

  • În al 4-lea valorile de intrare ale instrucțiunii sunt (000). Acum știm că (000) formează un punct și nu un triunghi. De fapt, dacă orice valoare de intrare este zero, triunghiul nu este posibil. Dar în cazul nostru va returna un triunghi echilateral!
  • De asemenea al 5-lea afirmația ne reamintește că lungimea nu poate fi niciodată o valoare negativă. Vedeți o scară care are -30 cm lungime. Astfel, dacă avem chiar și o valoare -ve a lungimii triunghiul nu este posibil. Dar în cazul nostru, în funcție de valoare, poate returna oricare dintre cele 3 rezultate. Aici returnează un scalar.
  • Acum ce zici de al 6-lea declaraţie. Toate valorile sunt >= 0 și cu siguranță este un triunghi scalar. Sau este? Amintiți-vă regula că într-un triunghi suma oricăror 2 laturi este întotdeauna mai mare sau egală cu a treia.

Aici vedem pentru:  

8 + 2 > 5  
8 + 5 > 2
5 + 2 > 8

Ieșire:  

True  
True
False

Nu trece testul de triunghiulare. Prin urmare, lungimile (258) nu formează un triunghi.

Deci, ceea ce avem nevoie este un fel de validare a triunghiului care să ne spună dacă ceea ce avem este chiar un triunghi sau nu. Ca parte a soluției, scrieți o altă funcție care arată astfel:

Algoritm:   

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

Funcția noastră anterioară include acum 2 rânduri suplimentare la început și wola! toate testele trec acum.

Acesta este doar un exemplu de scenariu simplu pentru a ne aminti că atunci când scriem cod la nivel de producție trebuie să fim atenți chiar și la lucrurile simple. Ținând cont de cazurile marginale simple și verificând cu casete de șir uniforme, ne-am mărit acoperirea testului și am făcut ca programul nostru să returneze rezultate mai corecte din punct de vedere matematic.

Mai jos este implementarea abordării de mai sus:  

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'); 

Programul de mai sus, atunci când este testat pe afirmațiile discutate anterior, va trece acum de cazurile de testare.

În industrie, venirea cu cazuri de colț și apoi dezvoltarea funcțiilor pentru a se asigura că acele cazuri de testare trec este denumită „dezvoltare bazată pe teste”. Acest blog este doar o privire a ceea ce înseamnă TDD în practică.
 

Creați un test