Pruebas orientadas a objetos en Python

Prerrequisito: Pruebas Orientadas a Objetos

Las pruebas automatizadas orientadas a objetos se pueden realizar en Python utilizando la herramienta de prueba Pytest . En este artículo, realizamos pruebas orientadas a objetos mediante la ejecución de casos de prueba para clases. Escribimos un programa que tiene una clase principal llamada Producto y tres clases secundarias : bocadillos, bebidas y alimentos básicos. Implementamos todas las clases y las guardamos en un archivo llamado product.py . Las clases tienen las siguientes funciones: 

  • Merienda – imprimirDetalles() y obtenerExpDate()
  • Bebida – printDetails() y getExpDate()
  • Grapas – printDetails() y getExpDate()

Es importante tener en cuenta que getExpDate() es una función anulada en este caso.

Código en el archivo  product.py :

Python3

# importing the modules
from datetime import date
from dateutil.relativedelta import relativedelta
  
# base class
  
  
class Product:
  
    name = ""
  
    # printing the class in the constructor
    def __init__(self):
        print("super class Product")
  
# getExpDate() returns the expiry date of product
# since every product has different expiry date
# therefore this method is overridden by child classes
    def getExpDate():
  
        # gives exp date
        print("Expiry date")
        pass
  
  
# derived class 1
class Snack(Product):
  
    # months
    shelfLife = 6
    price = 0
  
    # constructor - initializing variables
    def __init__(self, name, price):
        self.name = name
        self.price = price
  
    # prints the Snack product details
    def printDetails(self):
        print("name : " + self.name)
        print("price : " + str(self.price))
        print("shelf life : " + str(self.shelfLife) + " months")
  
    # calculates the expiry date using relativedelta library and returns
    def getExpDate(self, pkdDate):
        expDate = pkdDate + relativedelta(months=self.shelfLife)
        return expDate
  
# derived class 2
class Beverage(Product):
  
    # 2 years
    shelfLife = 2
    price = 0
  
    # constructor - initializing variables
    def __init__(self, name, price):
        self.name = name
        self.price = price
  
    # prints the Beverage product details
    def printDetails(self):
        print("name : " + self.name)
        print("price : " + str(self.price))
        print("shelf life : " + str(self.shelfLife) + " years")
  
    # calculates the expiry date using relativedelta 
    # library and returns
    def getExpDate(self, pkdDate):
        expDate = pkdDate + relativedelta(years=self.shelfLife)
        return expDate
  
  
# derived class 3
class Staples(Product):
  
    # 1 year
    shelfLife = 1
    price = 0
  
    # constructor - initializing variables
    def __init__(self, name, price):
        self.name = name
        self.price = price
  
    # prints the Staples product details
    def printDetails(self):
        print("name : " + self.name)
        print("price : " + str(self.price))
        print("shelf life : " + str(self.shelfLife) + " year")
  
    # calculates the expiry date using relativedelta
    # library and returns
    def getExpDate(self, pkdDate):
        expDate = pkdDate + relativedelta(years=self.shelfLife)
        return expDate
  
  
def main():
    s = Snack('cookies', 60)
    s.printDetails()
    print(s.name + " will expire on " +
          str(s.getExpDate(date(2019, 10, 3))) + "months")
    # yyyy-mm-dd
  
    p = Product()
  
    st = Staples('rice', 300)
    st.printDetails()
    print(st.name + " will expire on " + str(st.getExpDate(date(2020, 1, 23))))
  
    b = Beverage('coffee', 250)
    b.printDetails()
    print(b.name + " will expire on " + str(b.getExpDate(date(2018, 12, 17))))
  
    print("done till here")
  
  
if __name__ == '__main__':
    main()

Producción:

name : cookies
price : 60
shelf life : 6 months
cookies will expire on 2020-04-03months
super class Product
name : rice
price : 300
shelf life : 1 year
rice will expire on 2021-01-23
name : coffee
price : 250
shelf life : 2 years
coffee will expire on 2020-12-17
done till here

Para realizar pruebas orientadas a objetos, escribimos casos de prueba para cada una de las clases. Se deben tener en cuenta las siguientes cosas al escribir estos casos de prueba: 

  • Cree una clase de prueba separada para probar las funciones de cada clase, por ejemplo , TestSnack , TestStaple , TestBeverage
  • Escriba un caso de prueba para cada función de una clase
  • Use la palabra clave assert para agregar afirmaciones en los casos de prueba. La declaración de afirmación devolverá True si el caso de prueba pasa o devolverá False si el caso de prueba falla

Hemos escrito casos de prueba para cada función presente en todas las clases del archivo product.py excepto la clase Product (clase principal). Esto se debe a que la clase Product tiene solo una función y también ha sido anulada por las clases secundarias, por lo que escribir un caso de prueba no supondría ninguna diferencia. Por lo tanto, escribimos 6 casos de prueba en total donde se escriben dos casos de prueba para cada una de las clases secundarias.

Código en el archivo test_product.py

Python3

# importing the modules
import pytest
from product import Snack, Staples, Beverage
from datetime import date
  
  
class TestSnack:
  
      # test case for print details of Snack
    def test_details(self):
        s = Snack('chips' , 50)
        print("testing details : snack")
        assert ('chips' , 50, 6)  == (s.name, s.price, s.shelfLife)
  
    # test case for calculating exiry date of Snack
    def test_expDate(self):
        s = Snack('wafers', 40)
        print("testing expiry date : snack")
        expdate = s.getExpDate(date(2019, 10, 3))
        assert expdate == date(2020, 4, 3)
  
  
class TestStaple:
  
      # test case for print details of Staples
    def test_details(self):
        st = Staples('rice' , 300)
        print("testing details : staples")
        assert ('rice' , 300, 1)  == (st.name, st.price, st.shelfLife)
  
    # test case for calculating exiry date of Staples
    def test_expDate(self):
        st = Staples('wheat flour', 400)
        print("testing expiry date : staples")
        expdate = st.getExpDate(date(2020, 1, 23))
        assert expdate == date(2021, 1, 23)
  
  
  
class TestBeverage:
  
      # test case for print details of Beverage
    def test_details(self):
        b = Beverage('coffee' , 250)
        print("testing details : beverage")
        assert ('coffee' , 250, 2)  == (b.name, b.price, b.shelfLife)
  
    # test case for calculating exiry date of Beverage
    def test_expDate(self):
        b = Beverage('green tea', 400)
        print("testing expiry date : beverage")
        expdate = b.getExpDate(date(2018, 12, 17))
        assert expdate == date(2020, 12, 17)

Nota: El nombre de la función y el nombre del archivo de prueba siempre deben comenzar con la palabra ‘ prueba ‘.

Para ejecutar los casos de prueba anteriores, cree dos archivos separados, product.py y test_product.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: 

Si cambiamos el valor en una de las declaraciones de aserción de un caso de prueba, hará que el caso de prueba falle. Consulte la salida que se muestra a continuación: 

En el resultado que se muestra arriba, el caso de prueba test_expDate() en la clase TestBeverage falló porque la declaración de aserción resultó en una expresión   falsa .

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 *