Requisito previo: prueba de BVA
Para realizar pruebas BVA (Boundary Value Analysis) automatizadas, podemos usar las bibliotecas Pytest o Unittest en Python. Aquí, usaremos la biblioteca Pytest para ejecutar casos de prueba escritos para un programa simple.
Realizaremos la prueba BVA para un programa que determina el tipo de triángulo (es decir, equilátero, isósceles, escaleno o si la formación del triángulo no es posible) cuando se dan las longitudes de sus lados A, B y C. Además, el rango de la longitud está entre 10 y 50 (ambos inclusive).
Código en el archivo Triangletype.py :
Python3
# import math class Error(BaseException): pass class OutOfRangeError(Error): def __init__(self, message): self.message = message class TriangleError(Error): def __init__(self, message): self.message = message 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') 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') 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. En BVA, se utilizan 3 técnicas: verificación de valor límite (BVC), prueba de robustez y prueba del peor de los casos. Aquí, realizaremos pruebas de Robustez donde para un número n de variables de entrada, se pueden escribir 6n + 1 casos de prueba.
NOTA: El nombre de la función y el nombre del archivo de prueba siempre deben comenzar con la palabra ‘prueba’.
In the above program, n = 3 Since number of test cases = 6n + 1 Therefore, Number of test cases = 6 * 3 + 1 = 19 test cases
Por lo tanto, escribimos 19 casos de prueba para el programa anterior para los siguientes valores: min, min – 1, min + 1, max, max – 1, max + 1 y valor nominal
Código en el archivo test_triangletype_bva.py :
Python3
import pytest from triangletype import triangleType from triangletype import OutOfRangeError def test_bva_minm_a(): with pytest.raises(OutOfRangeError): triangleType(9, 20, 15) def test_bva_minm_b(): with pytest.raises(OutOfRangeError): triangleType(20, 9, 15) def test_bva_minm_c(): with pytest.raises(OutOfRangeError): triangleType(20, 15, 9) def test_bva_min_a(): assert triangleType(10, 20, 15) == "Scalene Triangle" def test_bva_min_b(): assert triangleType(20, 10, 15) == "Scalene Triangle" def test_bva_min_c(): assert triangleType(15, 20, 10) == "Scalene Triangle" def test_bva_minp_a(): assert triangleType(11, 20, 15) == "Scalene Triangle" def test_bva_minp_b(): assert triangleType(20, 11, 15) == "Scalene Triangle" def test_bva_minp_c(): assert triangleType(15, 20, 11) == "Scalene Triangle" def test_bva_maxm_a(): assert triangleType(49, 30, 45) == "Scalene Triangle" def test_bva_maxm_b(): assert triangleType(30, 49, 45) == "Scalene Triangle" def test_bva_maxm_c(): assert triangleType(45, 30, 49) == "Scalene Triangle" def test_bva_max_a(): assert triangleType(50, 30, 45) == "Scalene Triangle" def test_bva_max_b(): assert triangleType(30, 50, 45) == "Scalene Triangle" def test_bva_max_c(): assert triangleType(45, 30, 50) == "Scalene Triangle" def test_bva_maxp_a(): with pytest.raises(OutOfRangeError): triangleType(51, 30, 45) def test_bva_maxp_b(): with pytest.raises(OutOfRangeError): triangleType(30, 51, 45) def test_bva_maxp_c(): with pytest.raises(OutOfRangeError): triangleType(30, 45, 51) def test_bva_nominal(): assert triangleType(12, 12, 12) == "Equilateral Triangle"
Para ejecutar los casos de prueba anteriores, cree dos archivos separados Triangletype.py y test_triangletype_bva.py en una sola carpeta. Para ejecutar escribe el siguiente comando:
pytest
O
pytest -v
pytest -v muestra una salida detallada.
La salida se muestra a continuación:
Como podemos ver en el resultado, todos los 19 casos de prueba han pasado. Sin embargo, si editamos los casos de prueba de manera que la entrada no sea válida, los casos de prueba fallarán. Por ejemplo, si cambiamos el valor de la variable c en el caso de prueba test_bva_max_c() en el archivo test_triangletype_bva.py , el resultado será el siguiente: