Imagine un escenario en el que desea escribir la siguiente función como parte de un proyecto más grande:
Escribe una función para devolver el tipo de un triángulo basado en el 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á en su lugar, por lo que solo recibe valores numéricos para trabajar.
La situación parece fácil, sigue adelante y escribe 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 aserciones para realizar. Y para su sorpresa, encuentra que solo el 50% de los casos pasaron.
Veamos las declaraciones de prueba. Los que pasan son:
1. Afirmar si (String_toLowerCase(triangle_type(6,7,8))==”triángulo escalar”) = Correcto
2. Afirmar si (String_toLowerCase(triangle_type(6,6,6))==” triángulo equilátero”) = Correcto
3. assert(String_toLowerCase(triangle_type(6,7,6))==”triángulo isósceles”) = Correcto
Bueno, las cosas se ven bien hasta aquí. Pero los que fallan son:
4. Afirmar si (String_toLowerCase(triangle_type(0,0,0))==”no es un triángulo”) = Incorrecto
5. Afirmar si (String_toLowerCase(triangle_type(-6,-7,-8 ) ))==”no es un triángulo”) = Incorrecto
6. Comprueba si (String_toLowerCase(triangle_type(5,3,8))==”no es un triángulo”) = Incorrecto
- En la cuarta declaración, los valores de entrada son (0,0,0). Ahora sabemos que (0,0,0) forman un punto y no un triángulo. De hecho, si cualquier valor de entrada es cero, el triángulo no es posible. ¡Pero en nuestro caso, devolverá un triángulo equilátero!
- Además, la quinta declaración nos recuerda que la longitud nunca puede ser un valor negativo. Ves una escala que mide -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 la sexta declaración. Todos los valores son >= 0, y seguramente es un triángulo escalar. ¿O es eso? Recuerda la regla de que en un triángulo la suma de 2 lados siempre es mayor que el 3ro.
Aquí vemos para:
8 + 3 > 5 8 + 5 > 3 5 + 3 > 8
Producción :
True True False
No pasa la prueba de triangularidad. Por lo tanto, las longitudes (3,5,8) 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 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 > side1) then return True 3. Return False Stop
Nuestra función anterior ahora incluye 2 líneas adicionales al principio y wola! todas son pruebas están pasando ahora.
Este es solo un escenario de ejemplo simple para recordarnos que cuando escribimos código de 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 strings uniformes, aumentamos la cobertura de nuestra 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" assert (triangleType(6,7,8).lower() == "scalar triangle") assert (triangleType(6,6,6).lower() == "equilateral triangle") assert (triangleType(6,7,6).lower() == "isosceles triangle") assert (triangleType(0,0,0).lower() == "not a triangle") assert (triangleType(-6,-7,-8).lower() == "not a triangle") assert (triangleType(5,3,8).lower() == "not a triangle")
Una vez finalizado con éxito, no se devuelve ningún resultado, lo que indica que se han superado todas las pruebas.
Producción :
No output
Publicación traducida automáticamente
Artículo escrito por Sarah Masud y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA