Tenemos un objeto Task el cual construiremos utilizando namedtuple, el cual es parte de una librería estándar de Python.
A continuación utilizaremos Task para demostrar el uso de pytest y las opciones de la línea de comando.
Creamos el siguiente archivo, dentro de la carpeta tasks: test_three.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from collections import namedtuple Task = namedtuple('Task', ['summary', 'owner', 'done', 'id']) Task.__new__.__defaults__ = ( None, None, False, None ) def test_defaults(): ''' Al no utilizar parametros, se invoca al método por default ''' t1 = Task() t2 = Task(None, None, False, None) assert t1 == t2 def test_member_access(): ''' Valida la generación de atributos de namedtuple ''' t = Task('buy milk', 'brian') assert t.summary = 'buy milk' assert t.owner == 'brian' assert (t.done, t.id) == (False, None) |
Se puede utilizar __new__.__defaults__ para crear el objeto Task sin especificar todos los atributos. El test_defaults() valida como trabaja este método.
Agregamos un par de pruebas adicionales en otro archivo test_four.py, en el cual vamos a probar la funcionalidad de _asdict() y _replace():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | from collections import namedtuple Task = namedtuple(‘Task’, [‘summary’, ‘owner’, ‘done’, ‘id’]) Task.__new__.__defaults__ = ( None, None, False, None ) dedef test_asdict(): ''' El método _asdict() devuelve un diccionario. ''' t_task = Task('do something', 'okken', True, 21 ) t_dict = t_task._asdict() expected = {'summary': 'do something', 'Owner': 'okken', 'Done': True, 'Id': 21} assert t_dict == expected def test_replace(): ''' replace() cambia el valor de los atributos ''' t_before = Task('finish book', 'brian', False) t_after = t_before._replace(id=10, donde=True) t_expected = Task('finish book', 'brian', True, 10) assert t_after == t_expected |
Para ejecutar nuestro código tenemos diferentes opciones:
1 2 3 4 5 6 7 8 9 10 11 | # busca y ejecuta todos los test: $ pytest # ejecuta los test de los archivos indicados: $ pytest tasks/test_three.py task/test_four.py # ejecuta los test que se encuentran en la carpeta tasks $ pytest tasks # la opción -v brinda información detallada de las pruebas $ pytest -v tasks/test_four.py::test_asdict |
A continuación un breve resumen de la convención para nombrar archivos, funciones y clases:
- El nombre de archivo puede ser test_<nombre>.py o <nombre>_test.py.
- Los métodos o funciones de pruebas deben ser test_<nombre>.
- Los nombres de las clases deben ser Test<Nombre>.