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 .