logo

¡No te olvides de los casos Edge!

Introducción al desarrollo de pruebas de manejo (TDD)

Imagine un escenario en el que desea escribir la siguiente función como parte de un proyecto más grande:

EN Escriba una función para devolver el tipo de triángulo en función del valor de la longitud de 3 lados de un triángulo. Hagámoslo un poco más fácil asumiendo que la prueba para el tipo de datos de entrada ya está implementada, por lo que solo recibirá valores numéricos con los que trabajar.



La situación parece fácil. Continúe y escriba la función que se parece a esto:

Algoritmo:   

    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

Después de completar la función, se le dan un par de afirmaciones para realizar. Y para tu sorpresa descubres que sólo el 50% de los casos pasaron. 

Veamos las declaraciones de prueba. Los que pasan son:
1. Afirmar si (String_toLowerCase(triangle_type(678))==triángulo escalar) = Correcto 
2. Afirmar si (String_toLowerCase(triangle_type(666))==triángulo equilátero) = Correcto 
3. afirmar (String_toLowerCase (triangle_type (676)) == triángulo isósceles) = Correcto 
Bueno, las cosas pintan bien hasta aquí. Pero los que fallan son:
4. Afirmar si (String_toLowerCase(triangle_type(000))==no es un triángulo) = Incorrecto 
5. Afirmar si (String_toLowerCase(triangle_type(-6-7-8))==no es un triángulo) = Incorrecto 
6. Afirmar si (String_toLowerCase(triangle_type(528))==no es un triángulo) = Incorrecto 

  • En el 4to Los valores de entrada de la declaración son (000). Ahora sabemos que (000) forma un punto y no un triángulo. De hecho, si algún valor de entrada es cero, el triángulo no es posible. ¡Pero en nuestro caso devolverá un triángulo equilátero!
  • También el 5to La declaración nos recuerda que la longitud nunca puede ser un valor negativo. Ves una escala de -30 cm de largo. Por lo tanto, si tenemos incluso un valor -ve de longitud, el triángulo no es posible. Pero en nuestro caso dependiendo del valor puede devolver cualquiera de los 3 resultados. Aquí devuelve un escalar.
  • Ahora ¿qué pasa con el 6to declaración. Todos los valores son >= 0 y seguramente es un triángulo escalar. ¿O no? Recuerda la regla de que en un triángulo la suma de 2 lados cualesquiera es siempre mayor o igual que el tercero.

Aquí vemos por:  

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

Producción :  

True  
True
False

No pasa la prueba de la triangularidad. Por tanto, las longitudes (258) no forman un triángulo.

Entonces, lo que necesitamos es una especie de validación de triángulo que nos diga si lo que tenemos es incluso un triángulo o no. Como parte de la solución, escribe otra función que se parece a:

Algoritmo:   

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

Nuestra función anterior ahora incluye 2 líneas adicionales al principio y ¡wola! Todas son pruebas que están pasando ahora.

Este es solo un escenario de ejemplo simple para recordarnos que cuando escribimos código a nivel de producción debemos tener cuidado incluso con las cosas simples. Al tener en cuenta los casos extremos simples y verificar con casos de cadena uniforme, aumentamos nuestra cobertura de prueba e hicimos que nuestro programa arrojara resultados matemáticamente más correctos.

A continuación se muestra la implementación del enfoque anterior:  

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

El programa anterior, cuando se pruebe con las afirmaciones discutidas anteriormente, ahora pasará los casos de prueba.

En la industria, idear casos de esquina y luego desarrollar funciones para garantizar que esos casos de prueba pasen se denomina "desarrollo impulsado por pruebas". Este blog es sólo una muestra de lo que significa TDD en la práctica.
 

Crear cuestionario