23. Reportes en consola: salida corta, detallada, trazas y tiempos de ejecución

23.1 Objetivo del tema

Cuando ejecutamos una suite automatizada, la consola es el primer reporte que vemos. Una buena lectura de esa salida permite detectar fallas, ubicar pruebas lentas y entender qué ocurrió.

En este tema practicaremos opciones de pytest para controlar la salida: modo corto, detallado, trazas de error, resumen de fallas y tiempos de ejecución.

Objetivo práctico: usar opciones de consola para diagnosticar ejecuciones de pruebas con rapidez y claridad.

23.2 Ejecución base

El comando base sigue siendo:

python -m pytest

Según la configuración de pytest.ini, este comando puede aplicar opciones por defecto como -v o --tb=short.

23.3 Salida detallada con -v

La opción -v muestra cada prueba ejecutada:

python -m pytest -v

Es útil cuando quieres ver qué pruebas se ejecutan y cuáles pasan o fallan.

Una salida detallada puede mostrar líneas como:

tests/test_carrito.py::test_calcular_total_con_varios_productos_devuelve_suma_total PASSED

23.4 Salida corta con -q

La opción -q reduce la cantidad de información:

python -m pytest -q

Es útil cuando quieres una salida más compacta y ya conoces la suite.

23.5 Cuándo usar -v y cuándo usar -q

Usa -v cuando estás diagnosticando, revisando selección de pruebas o trabajando en una falla. Usa -q cuando solo necesitas saber si la suite pasó o falló.

  • -v: más información.
  • -q: menos ruido.

23.6 Controlar trazas con --tb

Cuando una prueba falla, pytest muestra una traza. La opción --tb controla cuánto detalle se muestra.

python -m pytest --tb=short

Otras variantes útiles:

python -m pytest --tb=long
python -m pytest --tb=line
python -m pytest --tb=no

23.7 Crear una prueba que falla para practicar

Crea temporalmente tests/test_reporte_consola.py:

def test_falla_de_ejemplo():
    assert 2 + 2 == 5

Ejecuta:

python -m pytest tests/test_reporte_consola.py --tb=short

Luego prueba con --tb=line y --tb=long para comparar la salida.

23.8 Resumen extra con -ra

La opción -ra muestra un resumen adicional de pruebas no exitosas o con estados especiales:

python -m pytest -ra

Es útil cuando hay pruebas omitidas, esperadas como falla o con advertencias.

23.9 Detener en la primera falla

Para detener la ejecución en la primera falla:

python -m pytest -x

Es útil durante diagnóstico. Cuando ya corregiste el problema, vuelve a ejecutar toda la suite.

23.10 Mostrar las pruebas más lentas

La opción --durations muestra las pruebas que más tardaron:

python -m pytest --durations=5

Esto lista las cinco pruebas más lentas. Si quieres ver más, aumenta el número.

23.11 Mostrar todos los tiempos

Para ver la duración de todas las pruebas:

python -m pytest --durations=0

Puede ser útil para investigar una suite pequeña, pero en una suite grande genera mucha salida.

23.12 Crear una prueba lenta de ejemplo

Crea una prueba temporal para practicar tiempos:

import time
import pytest


@pytest.mark.lento
def test_lento_de_ejemplo():
    time.sleep(0.2)

    assert True

Ejecuta:

python -m pytest --durations=3

23.13 Captura de salida

pytest captura por defecto lo que imprimen las pruebas. Si quieres ver la salida en tiempo real, puedes usar -s:

python -m pytest -s

Esto puede ayudar durante diagnóstico, pero no conviene dejar impresiones innecesarias en pruebas definitivas.

23.14 Mostrar logs en consola

Para mostrar logs durante la ejecución:

python -m pytest -o log_cli=true --log-cli-level=INFO

Esto puede ser útil para diagnosticar pruebas que usan logging.

23.15 Configurar salida en pytest.ini

Podemos definir opciones por defecto en pytest.ini:

[pytest]
testpaths = tests
python_files = test_*.py
python_functions = test_*
addopts = -v --strict-markers --tb=short -ra
markers =
    lento: pruebas que tardan más tiempo en ejecutarse
    regresion: pruebas importantes para detectar regresiones
    critica: pruebas indispensables para validar el comportamiento principal

Así no repetimos opciones comunes en cada comando.

23.16 No sobrecargar addopts

No conviene poner todas las opciones posibles en addopts. Algunas opciones son para diagnóstico puntual, no para ejecución cotidiana.

Buenas candidatas para addopts:

  • -v si quieres salida detallada por defecto.
  • --tb=short para trazas compactas.
  • -ra para resumen adicional.
  • --strict-markers para validar marcadores.

Opciones como -s o --durations=0 suelen ser mejores para uso puntual.

23.17 Guardar salida en archivo

En Windows PowerShell:

python -m pytest *> reports/salida.txt

En Linux o macOS:

python -m pytest > reports/salida.txt 2>&1

Esto puede servir para guardar evidencia de una ejecución o revisar un fallo después.

23.18 Agregar opción de tiempos a run_tests.py

Podemos agregar un argumento al script:

parser.add_argument("--durations", help="Muestra las pruebas más lentas")

Y en construir_comando:

if args.durations:
    comando.append(f"--durations={args.durations}")

Uso:

python run_tests.py --durations 5

23.19 Agregar opción de traceback a run_tests.py

También podemos permitir elegir el tipo de traza:

parser.add_argument("--tb", choices=["auto", "long", "short", "line", "no"], help="Formato de traceback")

Y en construir_comando:

if args.tb:
    comando.append(f"--tb={args.tb}")

Uso:

python run_tests.py --tb line

23.20 Interpretar una falla

Cuando una prueba falla, revisa en orden:

  1. Nombre de la prueba fallida.
  2. Archivo y línea.
  3. Valor esperado.
  4. Valor obtenido.
  5. Mensaje de error o excepción.
  6. Logs o salida capturada, si aplica.

La consola debe guiarte hacia la causa probable del problema.

23.21 Problemas frecuentes

  • La salida es demasiado larga: usa --tb=short o --tb=line.
  • No ves prints: usa -s solo para diagnóstico.
  • No sabes qué prueba tarda: usa --durations=5.
  • Hay demasiada configuración en addopts: deja allí solo opciones habituales.
  • La salida no ayuda: mejora nombres de pruebas y mensajes de aserción.

23.22 Ejercicio práctico

Ejecuta estos comandos y compara la salida:

python -m pytest -q
python -m pytest -v
python -m pytest --tb=line
python -m pytest --durations=5
python -m pytest -ra

Luego agrega a run_tests.py las opciones --durations y --tb.

23.23 Solución propuesta

En leer_argumentos:

parser.add_argument("--durations", help="Muestra las pruebas más lentas")
parser.add_argument("--tb", choices=["auto", "long", "short", "line", "no"], help="Formato de traceback")

En construir_comando:

if args.durations:
    comando.append(f"--durations={args.durations}")

if args.tb:
    comando.append(f"--tb={args.tb}")

Ejecuta:

python run_tests.py --durations 5 --tb short

23.24 Lista de verificación

Antes de continuar con el próximo tema, verifica lo siguiente:

  • Sabes usar -v para salida detallada.
  • Sabes usar -q para salida corta.
  • Sabes controlar trazas con --tb.
  • Sabes ver pruebas lentas con --durations.
  • Sabes cuándo usar -s.
  • pytest.ini tiene opciones útiles sin sobrecargarse.
  • El script puede aceptar opciones de reporte en consola si lo actualizaste.

23.25 Conclusión

En este tema usamos reportes en consola para diagnosticar ejecuciones de pytest. La salida correcta permite entender fallas, revisar trazas y detectar pruebas lentas sin herramientas adicionales.

En el próximo tema generaremos reportes HTML y JUnit XML para conservar evidencia y compartir resultados con otras herramientas.