Realización de pruebas de BVA con Pytest

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 

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: 

Publicación traducida automáticamente

Artículo escrito por ps17 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *