¿Qué es Doctest?
doctest permite escribir pruebas dentro de los docstrings de tus funciones.
Es decir, los ejemplos que pones en la documentación se ejecutan automáticamente para comprobar que el código funciona como dices.
Esto ayuda a:
Documentar funciones con ejemplos reales
Detectar errores rápidamente
Enseñar buenas prácticas
Crear tests sin frameworks complicados
1. Ejemplo básico de doctest
def sumar(a, b):
"""
Suma dos números.
>>> sumar(2, 3)
5
>>> sumar(-1, 1)
0
"""
return a + b
Para ejecutar los tests:
python -m doctest archivo.py
Si todo está bien, no muestra nada. Si falla, muestra el error.
2. Doctest con cadenas
def mayusculas(texto):
"""
Convierte un texto a mayúsculas.
>>> mayusculas("hola")
'HOLA'
"""
return texto.upper()
3. Doctest con listas
def pares(lista):
"""
Devuelve los números pares de una lista.
>>> pares([1,2,3,4,5])
[2, 4]
"""
return [n for n in lista if n % 2 == 0]
4. Ignorar espacios o formatos (ELLIPSIS)
A veces no importa el resultado exacto:
def info():
"""
>>> info() # doctest: +ELLIPSIS
'Versión...'
"""
return "Versión 1.2.3"
5. Ejecutar doctest desde el propio archivo
Al final del archivo:
if __name__ == "__main__":
import doctest
doctest.testmod()
Así, al ejecutar:
python archivo.py
se ejecutan los tests automáticamente.
6. Ventajas de Doctest para tus alumnos
Aprenden a documentar funciones
Aprenden a escribir pruebas sin frameworks
Ven ejemplos reales funcionando
Es perfecto para ejercicios pequeños
Se integra muy bien con FP y proyectos educativos
ACTIVIDAD PRÁCTICA: “Biblioteca de utilidades con Doctest”
Objetivo: crear un módulo con varias funciones documentadas y probadas.
Enunciado
Crea un archivo utilidades.py con las siguientes funciones:
es_primo(n)Devuelve True si n es primo
Incluye 3 doctests
invertir(texto)Devuelve el texto al revés
Incluye 2 doctests
media(lista)Devuelve la media de una lista
Incluye 2 doctests
Al final del archivo, añade:
if __name__ == "__main__":
import doctest
doctest.testmod()
Solución propuesta
def es_primo(n):
"""
Determina si un número es primo.
>>> es_primo(2)
True
>>> es_primo(15)
False
>>> es_primo(17)
True
"""
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
def invertir(texto):
"""
Invierte un texto.
>>> invertir("hola")
'aloh'
>>> invertir("Python")
'nohtyP'
"""
return texto[::-1]
def media(lista):
"""
Calcula la media de una lista de números.
>>> media([1,2,3])
2.0
>>> media([10, 20])
15.0
"""
return sum(lista) / len(lista)
if __name__ == "__main__":
import doctest
doctest.testmod()
Resultado esperado
Los alumnos ejecutan el archivo
Doctest valida automáticamente todos los ejemplos
Si algo falla, doctest lo muestra