Requisito previo: prueba de clase de equivalencia
Para realizar pruebas de clase de equivalencia automatizadas, podemos utilizar las bibliotecas Python Pytest o Unittest. En este artículo, usaremos la biblioteca Pytest para ejecutar casos de prueba para un programa simple.
Pregunta:
Realice pruebas de equivalencia para un programa que determina el tipo de triángulo dada la longitud de sus tres lados A, B y C. El rango de longitud de los lados se encuentra entre 10 y 50 (ambos inclusive).
Código en el archivo Triangletype.py :
Python3
# import math # parent class for Error class Error(BaseException): pass # child class of Error named OutOfRangeError class OutOfRangeError(Error): def __init__(self, message): self.message = message # child class of Error named TriangleError class TriangleError(Error): def __init__(self, message): self.message = message # checks if variables are in range # if variables not in range then OutOfRangeError is raised def checkRange(a, b, c): if a<10 or a>50: raise OutOfRangeError('A is out of the given range') if b<10 or b>50: raise OutOfRangeError('B is out of the given range') if c<10 or c>50: raise OutOfRangeError('C is out of the given range') # checks if the given values of a, b, c can form a triangle # if not, then Triangle error is raised def checkTriangle(a, b, c): if a + b<= c or b + c<= a or c + a<= b: raise TriangleError('Triangle cannot be formed with these sides') # determines the type of triangle def triangleType(a, b, c): checkRange(a, b, c) checkTriangle(a, b, c) # s = (a + b+c)/2 # ar = math.sqrt(s*(s-a)*(s-b)*(s-c)) # inradius = ar / s if(a == b and b == c): return "Equilateral Triangle" elif(a == b or a == c or b == c): return "Isosceles Triangle" else: return "Scalene Triangle" def main(): try: print("Enter the sides of the triangle in range [10-50]") a = int(input('Enter Side A:')) b = int(input('Enter Side B:')) c = int(input('Enter Side C:')) except ValueError as v: print(v + " Raised :Input is not an integer.") exit(0) try: checkRange(a, b, c) except OutOfRangeError as e: print("OutOfRangeError:" + e.message) try: checkTriangle(a, b, c) except TriangleError as e: print('TriangleError:' + e.message) typeOfTriangle = triangleType(a, b, c) print("The triangle is: " + typeOfTriangle) if __name__ == "__main__": main()
Ahora, necesitamos escribir casos de prueba para el programa anterior usando la biblioteca Pytest. Cada caso de prueba está escrito en una función separada donde usamos la función pytest.raises para verificar que la entrada dada sea válida o no. Para el programa anterior, creamos 7 clases no válidas y 1 clase válida. Las 7 clases inválidas son:
- un < 10
- un > 50
- b < 10
- b > 50
- do < 10
- c > 50
- Los valores dados de a, b, c no pueden formar un triángulo
La 1 clase válida es:
- 10 <= a, b, c <= 50
NOTA: El nombre de la función y el nombre del archivo de prueba siempre deben comenzar con la palabra ‘prueba’.
Código en el archivo test_triangletype_eq.py :
Python3
import pytest # importing classes and function which we use in this file from triangletype import OutOfRangeError from triangletype import TriangleError from triangletype import triangleType # check if a < 10 def test_invalid_less_a(): with pytest.raises(OutOfRangeError): triangleType(9, 20, 15) # check if b < 10 def test_invalid_less_b(): with pytest.raises(OutOfRangeError): triangleType(20, 9, 15) # check if c < 10 def test_invalid_less_c(): with pytest.raises(OutOfRangeError): triangleType(20, 15, 9) # check if a > 50 def test_invalid_more_a(): with pytest.raises(OutOfRangeError): triangleType(51, 30, 45) # check if b > 50 def test_invalid_more_b(): with pytest.raises(OutOfRangeError): triangleType(30, 51, 45) # check if c > 50 def test_invalid_more_c(): with pytest.raises(OutOfRangeError): triangleType(30, 45, 51) # check if a, b, c can form a triangle or not def test_valid_invalidtriangle(): with pytest.raises(TriangleError): triangleType(20, 15, 40) # valid class - determines type of triangle def test_valid(): assert triangleType(20, 15, 10) == "Scalene Triangle"
Para ejecutar los casos de prueba anteriores, cree dos archivos separados Triangletype.py y test_triangletype_eq.py en una sola carpeta. Para ejecutar escribe el siguiente comando:
pytest
O
pytest -v
pytest -v muestra la salida detallada.
La salida se muestra a continuación:
Como podemos ver en el resultado anterior, se aprobaron los 8 casos de prueba. Sin embargo, si editamos un caso de prueba, por ejemplo, si cambiamos el valor de la variable c a 90 en el caso de prueba test_valid() en el archivo test_triangletype_eq.py , entonces el caso de prueba falla: