logo

Vergeet de Edge-hoesjes niet!

Een inleiding tot Test Drive Development (TDD)

Stel je een scenario voor waarin je de volgende functie wilt schrijven als onderdeel van een groter project:

IN rite een functie om het type van een driehoek terug te geven, gebaseerd op de waarde van de lengte van 3 zijden van een driehoek. Laten we het een beetje eenvoudiger maken door aan te nemen dat de test voor het invoergegevenstype al aanwezig is, zodat u alleen numerieke waarden ontvangt om mee te werken.



De situatie ziet er gemakkelijk uit. Ga je gang en schrijf de functie die er ongeveer zo uitziet:

algoritme:   

    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

Nadat u de functie hebt voltooid, krijgt u een aantal beweringen die u moet uitvoeren. En tot uw verbazing constateert u dat slechts 50% van de gevallen werd goedgekeurd. 

rujira banerjee

Laten we eens kijken naar de testverklaringen. Degene die passeren zijn:
1. Beweer dat (String_toLowerCase(triangle_type(678))==scalaire driehoek) = Correct 
2. Beweer if (String_toLowerCase(triangle_type(666))==gelijkzijdige driehoek) = Correct 
3. assert(String_toLowerCase(triangle_type(676))==gelijkbenige driehoek) = Correct 
Nou, tot hier ziet het er goed uit. Maar degenen die falen zijn:
4. Beweer if (String_toLowerCase(triangle_type(000))==geen driehoek) = Onjuist 
5. Beweer if (String_toLowerCase(triangle_type(-6-7-8))==geen driehoek) = Onjuist 
6. Beweer if (String_toLowerCase(triangle_type(528))==geen driehoek) = Onjuist 

  • In de 4e Invoerwaarden voor de instructie zijn (000). Nu weten we dat (000) een punt vormt en geen driehoek. Als een invoerwaarde nul is, is de driehoek feitelijk niet mogelijk. Maar in ons geval zal het een gelijkzijdige driehoek opleveren!
  • Ook de 5e Deze verklaring herinnert ons eraan dat de lengte nooit een negatieve waarde kan zijn. Je ziet een schaal die -30 cm lang is. Dus als we zelfs maar één -ve lengtewaarde hebben, is de driehoek niet mogelijk. Maar in ons geval kan het, afhankelijk van de waarde, een van de drie resultaten opleveren. Hier retourneert het een scalair.
  • Hoe zit het nu met de 6e stelling. Alle waarden zijn >= 0 en het is zeker een scalaire driehoek. Of toch? Onthoud de regel dat in een driehoek de som van twee willekeurige zijden altijd groter is dan of gelijk is aan de derde.

Hier zien we voor:  

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

Uitgang:  

True  
True
False

Het faalt in de driehoekstoets. Daarom vormen de lengtes (258) geen driehoek.

Wat we dus nodig hebben is een soort driehoeksvalidatie die ons vertelt of wat we hebben wel een driehoek is of niet. Als onderdeel van de oplossing schrijf je nog een functie die er als volgt uitziet:

algoritme:   

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

Onze vorige functie bevat nu 2 extra regels aan het begin en wola! het zijn allemaal tests die nu slagen.

Dit is slechts een eenvoudig voorbeeldscenario om ons eraan te herinneren dat we bij het schrijven van code op productieniveau voorzichtig moeten zijn, zelfs met eenvoudige dingen. Door de eenvoudige randgevallen in gedachten te houden en te controleren met uniforme stringgevallen hebben we onze testdekking vergroot en ervoor gezorgd dat ons programma meer wiskundig correcte resultaten retourneert.

Hieronder vindt u de implementatie van bovenstaande aanpak:  

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

Wanneer het bovenstaande programma wordt getest op de eerder besproken beweringen, zal het nu de testgevallen doorstaan.

In de industrie wordt het bedenken van hoekcases en het ontwikkelen van functies om ervoor te zorgen dat die testcases slagen, 'testgedreven ontwikkeling' genoemd. Deze blog is slechts een voorproefje van wat TDD in de praktijk betekent.
 

Quiz maken