Libro Python Aplicado de Eugenia Bahit. GNU/Linux, ciencia de datos, y desarrollo web

Banner de Python Aplicado

Pruebas unitarias en Python


Cita con formato IEEE:
E. Bahit, "Pruebas unitarias", in Python Aplicado, 4th ed., EBRC Publisher, 2022, pp. 278-284.

Cita con formato APA 7:
Bahit, E. (2022). Pruebas unitarias. In Python Aplicado (4th ed., pp. 278-284). EBRC Publisher.

Cita en línea:
(Bahit, 2022)

Existen varias bibliotecas para realizar pruebas unitarias en Python. Sin embargo, este libro se centrará en módulos de la biblioteca estándar.

Doctest

En Python existe una forma bastante simple y rudimentaria de realizar pruebas unitarias, cuya curva de aprendizaje es prácticamente imperceptible. Se trata de cadenas de texto insertadas en los comentarios, cuyo contenido se equipara al de una sesión interactiva de la shell de python.

Doctest localiza dichos fragmentos, los ejecuta y verifica que la salida obtenida sea igual a la mostrada en los comentarios. Solo se requiere ejecutar el script con el argumento -v para ver los resultados.

El siguiente fragmento de código pertenece a un archivo llamado prueba.py:

#!/usr/bin/env python3
"""
>>> calcular_edad(1978)
42

>>> calcular_edad("1978")
42

>>> calcular_edad("xxx")
Traceback (most recent call last):
  ...
ValueError: invalid literal for int() with base 10: 'xxx'
>>> calcular_edad()
Traceback (most recent call last):
  ...
TypeError: calcular_edad() missing 1 required positional argument: 'nacimiento'

"""

def calcular_edad(nacimiento):
    aaaa = int(nacimiento)
    edad = 2020 - aaaa
    return edad


if __name__ == "__main__":
    from doctest import testmod
    testmod()

Al ejecutar el archivo, solo el argumento -v hará correr las pruebas:

eugenia@bella:~/Documentos$ python prueba.py 
eugenia@bella:~/Documentos$ python3 prueba.py -v
Trying:
    calcular_edad(1978)
Expecting:
    42
ok
Trying:
    calcular_edad("1978")
Expecting:
    42
ok
Trying:
    calcular_edad("xxx")
Expecting:
    Traceback (most recent call last):
      ...
    ValueError: invalid literal for int() with base 10: 'xxx'
ok
Trying:
    calcular_edad()
Expecting:
    Traceback (most recent call last):
      ...
    TypeError: calcular_edad() missing 1 required positional argument: 'nacimiento'
ok
1 items had no tests:
    __main__.calcular_edad
1 items passed all tests:
  4 tests in __main__
4 tests in 2 items.
4 passed and 0 failed.
Test passed.

La documentación oficial se encuentra disponible en https://docs.python.org/3/library/doctest.html

Unittest

Menos rudimentario, para quienes ya poseen experiencia programando con pruebas unitarias, existe el módulo unittest, el cual tampoco necesita ser instalado ya que desde la versión 2.1 forma parte de la biblioteca estándar de Python

Métodos Assert

Una lista completa de los métodos assert se puede encontrar en la documentación oficial: