8. Automatizar la ejecución de una suite completa desde la terminal

8.1 Objetivo del tema

En los temas anteriores preparamos estructura, configuración, nombres y un primer script de ejecución. Ahora vamos a practicar la ejecución completa de una suite automatizada desde la terminal.

El objetivo es que puedas ejecutar todas las pruebas de forma repetible, entender la salida, generar reportes y documentar los comandos principales del proyecto.

Objetivo práctico: ejecutar la suite completa desde la raíz del proyecto y automatizar esa ejecución con comandos simples y confiables.

8.2 Qué significa ejecutar la suite completa

La suite completa es el conjunto de pruebas automatizadas que el proyecto reconoce como parte de su verificación habitual. En nuestro caso, pytest busca las pruebas en la carpeta tests, según la configuración de pytest.ini.

Ejecutar la suite completa significa lanzar todas esas pruebas con un único comando y revisar si el resultado general fue exitoso o fallido.

8.3 Ubicarse en la raíz del proyecto

Antes de ejecutar la suite, asegúrate de estar en la raíz del proyecto:

cd automatizacion-pruebas-python

La raíz es la carpeta donde están archivos como pytest.ini, requirements.txt, run_tests.py y las carpetas app y tests.

Ejecutar desde otra carpeta puede causar errores de importación o hacer que pytest no encuentre la configuración esperada.

8.4 Activar el entorno virtual

En Windows PowerShell:

.venv\Scripts\Activate.ps1

En Windows CMD:

.venv\Scripts\activate.bat

En Linux o macOS:

source .venv/bin/activate

Luego verifica que Python apunte al entorno del proyecto:

python -c "import sys; print(sys.executable)"

8.5 Ejecutar toda la suite

Desde la raíz del proyecto, ejecuta:

python -m pytest

Como configuramos pytest.ini, pytest sabe que debe buscar pruebas dentro de tests y aplicar las opciones definidas en addopts.

8.6 Ejecutar la suite indicando la carpeta

También puedes indicar explícitamente la carpeta de pruebas:

python -m pytest tests

Este comando es útil cuando quieres ser explícito o cuando estás trabajando en un proyecto sin testpaths configurado.

8.7 Ejecutar con salida detallada

Si quieres ver cada prueba ejecutada, usa:

python -m pytest -v

En nuestro proyecto, -v ya puede estar incluido en pytest.ini. Aun así, es importante reconocerlo porque aparece con frecuencia en proyectos reales.

8.8 Ejecutar desde el script del proyecto

También podemos ejecutar la suite usando el script creado en temas anteriores:

python run_tests.py

El script centraliza el comando y puede agregar opciones como reportes o selección de pruebas. Esto evita que cada persona escriba comandos distintos.

8.9 Generar reporte HTML

Si tu script tiene la opción --reporte, ejecuta:

python run_tests.py --reporte

También puedes hacerlo directamente con pytest:

python -m pytest --html=reports/reporte.html --self-contained-html

El reporte ayuda a revisar resultados cuando la salida de consola no es suficiente.

8.10 Interpretar una ejecución exitosa

Una ejecución exitosa muestra que todas las pruebas pasaron. La salida puede incluir una línea parecida a:

12 passed in 0.45s

El número exacto dependerá de cuántas pruebas tengas en tu proyecto. Lo importante es que no haya fallas, errores ni pruebas interrumpidas.

8.11 Interpretar una ejecución con fallas

Si una prueba falla, pytest muestra el nombre de la prueba, el archivo y la diferencia entre el valor esperado y el valor obtenido.

Por ejemplo, una falla puede mostrar algo como:

FAILED tests/test_calculadora.py::test_sumar_devuelve_la_suma_de_dos_numeros

El nombre de la prueba debe ayudarte a entender qué comportamiento se rompió. Por eso las convenciones del tema anterior son importantes.

8.12 Detener la suite en la primera falla

Cuando hay muchas pruebas, a veces conviene detenerse en la primera falla:

python -m pytest -x

Si usas el script y agregaste la opción del tema anterior:

python run_tests.py --detener

Esto es útil durante el desarrollo, cuando quieres corregir una falla antes de revisar las demás.

8.13 Mostrar solo resumen de fallas

Para obtener una salida más compacta, puedes usar:

python -m pytest --tb=short

En nuestro proyecto esta opción puede estar configurada en pytest.ini. Sirve para reducir la cantidad de líneas cuando una prueba falla.

8.14 Ejecutar y guardar el resultado en un archivo

En algunos casos queremos guardar la salida de consola en un archivo de texto.

En Windows PowerShell:

python -m pytest *> reports/salida.txt

En Linux o macOS:

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

Esto puede ser útil para adjuntar evidencias o revisar resultados después.

8.15 Ver códigos de salida desde la terminal

Después de ejecutar una suite, puedes revisar el código de salida.

En Windows PowerShell:

$LASTEXITCODE

En Linux o macOS:

echo $?

Un valor 0 indica que la ejecución terminó correctamente. Un valor distinto de 0 indica fallas o errores de ejecución.

8.16 Automatizar una rutina de ejecución

Una rutina práctica de trabajo puede ser:

  1. Activar el entorno virtual.
  2. Ejecutar la suite completa.
  3. Revisar fallas si las hay.
  4. Generar reporte si se necesita evidencia.
  5. Corregir el código o la prueba.
  6. Ejecutar nuevamente la suite.

El punto central es que la ejecución sea repetible y no dependa de pasos improvisados.

8.17 Crear un script de terminal para Windows

Si quieres simplificar la ejecución en Windows PowerShell, puedes crear run_tests.ps1:

.venv\Scripts\Activate.ps1
python run_tests.py --reporte

Luego ejecuta:

.\run_tests.ps1

Este archivo es opcional. El script principal del curso seguirá siendo run_tests.py.

8.18 Crear un script de terminal para Linux o macOS

En Linux o macOS puedes crear run_tests.sh:

#!/usr/bin/env bash
source .venv/bin/activate
python run_tests.py --reporte

Dar permiso de ejecución:

chmod +x run_tests.sh

Ejecutar:

./run_tests.sh

8.19 Documentar comandos en el README

Agrega una sección de ejecución al README.md:

## Ejecución de pruebas

Ejecutar suite completa:

python -m pytest

Ejecutar usando el script del proyecto:

python run_tests.py

Ejecutar y generar reporte HTML:

python run_tests.py --reporte

Detener en la primera falla:

python run_tests.py --detener

La documentación evita confusiones y ayuda a que todos ejecuten la suite de la misma forma.

8.20 Problemas frecuentes

  • No se encuentran pruebas: revisa que estés en la raíz del proyecto y que los archivos comiencen con test_.
  • Error al importar app: ejecuta desde la raíz, no desde la carpeta tests.
  • No se genera el reporte: confirma que existe la carpeta reports o que el script la crea.
  • El comando usa otro Python: activa el entorno virtual y verifica sys.executable.
  • El script devuelve código distinto de 0: revisa si hay pruebas fallidas o errores de configuración.

8.21 Ejercicio práctico

Actualiza run_tests.py para agregar un argumento --salida. Cuando se use, debe guardar la salida de pytest en reports/salida.txt.

El objetivo es poder ejecutar:

python run_tests.py --salida

y obtener un archivo de texto con el resultado de la ejecución.

8.22 Solución propuesta

Agrega el argumento:

parser.add_argument("--salida", action="store_true", help="Guarda la salida en reports/salida.txt")

Luego modifica la ejecución en main:

def main():
    args = leer_argumentos()
    comando = construir_comando(args)
    print("Ejecutando:", " ".join(comando))

    if args.salida:
        REPORTS_DIR.mkdir(exist_ok=True)
        with open(REPORTS_DIR / "salida.txt", "w", encoding="utf-8") as archivo:
            resultado = subprocess.run(
                comando,
                stdout=archivo,
                stderr=subprocess.STDOUT,
                text=True,
                check=False,
            )
    else:
        resultado = subprocess.run(comando, check=False)

    return resultado.returncode

Después ejecuta:

python run_tests.py --salida

8.23 Lista de verificación

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

  • Ejecutas la suite desde la raíz del proyecto.
  • El entorno virtual está activo.
  • La suite completa se ejecuta con python -m pytest.
  • El script run_tests.py ejecuta la suite completa.
  • Puedes generar un reporte HTML.
  • Comprendes el significado general del código de salida.
  • El README documenta los comandos principales.

8.24 Conclusión

En este tema automatizamos la ejecución de la suite completa desde la terminal. Practicamos comandos directos con python -m pytest, ejecución mediante script, generación de reportes y revisión de códigos de salida.

Una suite automatizada tiene valor cuando se ejecuta con frecuencia y de forma consistente. En el próximo tema veremos cómo seleccionar pruebas por archivo, nombre, carpeta y expresión para trabajar con partes específicas de la suite.