logo

N'oubliez pas les coques Edge !

Une introduction au développement de tests routiers (TDD)

Imaginez un scénario dans lequel vous souhaitez écrire la fonction suivante dans le cadre d'un projet plus vaste :

DANS rite une fonction pour renvoyer le type d'un triangle en fonction de la valeur de la longueur des 3 côtés d'un triangle. Rendons les choses un peu plus faciles en supposant que le test du type de données d'entrée est déjà en place afin que vous ne receviez que des valeurs numériques avec lesquelles travailler.



ml en onces

La situation semble facile. Vous continuez et écrivez la fonction qui ressemble à ceci -

Algorithme :   

    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

Après avoir terminé la fonction, vous recevez quelques assertions à exécuter. Et à votre grande surprise, vous constatez que seulement 50 % des cas ont abouti. 

Regardons les instructions de test. Ceux qui passent sont :
1. Affirmez si (String_toLowerCase(triangle_type(678))==triangle scalaire) = Correct 
2. Affirmez si (String_toLowerCase(triangle_type(666))==triangle équilatéral) = Correct 
3. assert(String_toLowerCase(triangle_type(676))==triangle isocèle) = Correct 
Eh bien, les choses semblent bonnes jusqu'ici. Mais ceux qui échouent sont :
4. Affirmez si (String_toLowerCase(triangle_type(000))==pas un triangle) = Incorrect 
5. Affirmez si (String_toLowerCase(triangle_type(-6-7-8))==pas un triangle) = Incorrect 
6. Affirmez si (String_toLowerCase(triangle_type(528))==pas un triangle) = Incorrect 

  • Dans le 4ème les valeurs d’entrée de l’instruction sont (000). Nous savons maintenant que (000) forme un point et non un triangle. En fait, si une valeur d'entrée est nulle, le triangle n'est pas possible. Mais dans notre cas, cela renverra un triangle équilatéral !
  • Aussi le 5ème Cette déclaration nous rappelle que la longueur ne peut jamais être une valeur négative. Vous voyez une écaille de -30 cm de long. Ainsi, si nous avons ne serait-ce qu'une valeur -ve de longueur, le triangle n'est pas possible. Mais dans notre cas, en fonction de la valeur, il peut renvoyer l'un des 3 résultats. Ici, il renvoie un scalaire.
  • Et maintenant, qu'en est-il du 6ème déclaration. Toutes les valeurs sont >= 0 et c'est sûrement un triangle scalaire. Ou est-ce ? Rappelez-vous la règle selon laquelle dans un triangle, la somme des 2 côtés est toujours supérieure ou égale au 3ème.

Ici on voit pour :  

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

Sortir :  

trimestres de l'année
True  
True
False

Il échoue au test de la triangularité. Les longueurs (258) ne forment donc pas un triangle.

Ce dont nous avons donc besoin, c'est d'une sorte de validation triangulaire qui nous indique si ce que nous avons est même un triangle ou non. Dans le cadre de la solution, vous écrivez une autre fonction qui ressemble à :

Algorithme :   

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

Notre précédente fonction inclut désormais 2 lignes supplémentaires au début et wola ! tous les tests réussissent maintenant.

xd xd signification

Ceci est juste un simple exemple de scénario pour nous rappeler que lorsque nous écrivons du code au niveau de la production, nous devons être prudents, même avec des choses simples. En gardant à l'esprit les cas extrêmes simples et en vérifiant avec des cas de chaînes uniformes, nous avons augmenté notre couverture de tests et fait en sorte que notre programme renvoie des résultats plus mathématiquement corrects.

Vous trouverez ci-dessous la mise en œuvre de l'approche ci-dessus :  

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

Le programme ci-dessus, lorsqu'il est testé sur les assertions discutées précédemment, réussira désormais les cas de test.

Dans l'industrie, proposer des cas particuliers, puis développer des fonctions pour s'assurer que ces cas de test réussissent, est appelé « développement piloté par les tests ». Ce blog n'est qu'un aperçu de ce que TDD signifie en pratique.
 

Créer un quiz