Una suite automatizada no solo necesita pruebas. También necesita tareas auxiliares: limpiar reportes, crear carpetas, listar pruebas, verificar estructura y ejecutar comandos frecuentes.
En este tema crearemos scripts de Python para automatizar tareas repetitivas del proyecto y reducir errores manuales.
Podríamos escribir comandos manualmente en la terminal, pero los scripts tienen ventajas:
Crea una carpeta para scripts auxiliares:
mkdir scripts
La estructura quedará así:
automatizacion-pruebas-python/
|-- app/
|-- tests/
|-- reports/
|-- scripts/
`-- run_tests.py
Crea scripts/preparar_proyecto.py:
from pathlib import Path
CARPETAS = [
Path("reports"),
Path("tests/data"),
Path("tests/helpers"),
]
def main():
for carpeta in CARPETAS:
carpeta.mkdir(parents=True, exist_ok=True)
print(f"Carpeta lista: {carpeta}")
if __name__ == "__main__":
main()
Ejecuta:
python scripts/preparar_proyecto.py
Crea scripts/limpiar_reportes.py:
import shutil
from pathlib import Path
REPORTS_DIR = Path("reports")
def main():
if REPORTS_DIR.exists():
shutil.rmtree(REPORTS_DIR)
print("Reportes eliminados")
REPORTS_DIR.mkdir()
print("Carpeta reports creada")
if __name__ == "__main__":
main()
Ejecuta:
python scripts/limpiar_reportes.py
Crea scripts/listar_pruebas.py:
import subprocess
import sys
def main():
comando = [sys.executable, "-m", "pytest", "--collect-only", "-q"]
resultado = subprocess.run(comando, check=False)
return resultado.returncode
if __name__ == "__main__":
raise SystemExit(main())
Ejecuta:
python scripts/listar_pruebas.py
Este script ayuda a revisar qué pruebas detecta pytest.
Crea scripts/verificar_estructura.py:
from pathlib import Path
RUTAS_REQUERIDAS = [
Path("app"),
Path("tests"),
Path("tests/data"),
Path("tests/helpers"),
Path("pytest.ini"),
Path("run_tests.py"),
]
def main():
faltantes = [ruta for ruta in RUTAS_REQUERIDAS if not ruta.exists()]
if faltantes:
print("Faltan rutas requeridas:")
for ruta in faltantes:
print(f"- {ruta}")
return 1
print("Estructura correcta")
return 0
if __name__ == "__main__":
raise SystemExit(main())
Ejecuta:
python scripts/verificar_estructura.py
Los scripts deben devolver 0 cuando todo está bien y un valor distinto de 0 cuando hay un problema.
Este patrón permite que otros scripts sepan si una tarea fue exitosa:
if __name__ == "__main__":
raise SystemExit(main())
Crea scripts/rutina_local.py:
import subprocess
import sys
def ejecutar(comando):
print("Ejecutando:", " ".join(comando))
resultado = subprocess.run(comando, check=False)
return resultado.returncode
def main():
pasos = [
[sys.executable, "scripts/verificar_estructura.py"],
[sys.executable, "scripts/preparar_proyecto.py"],
[sys.executable, "run_tests.py", "--reporte"],
]
for paso in pasos:
codigo = ejecutar(paso)
if codigo != 0:
return codigo
return 0
if __name__ == "__main__":
raise SystemExit(main())
Ejecuta:
python scripts/rutina_local.py
La rutina anterior se detiene si un paso devuelve error:
if codigo != 0:
return codigo
Esto evita ejecutar pruebas o generar reportes si la estructura del proyecto está incompleta.
Los scripts deben ser cuidadosos. Por ejemplo, limpiar la carpeta reports es razonable porque contiene archivos generados. En cambio, borrar carpetas de código o pruebas sería peligroso.
Antes de eliminar archivos, verifica que el script actúe sobre rutas esperadas y limitadas.
Si varios scripts comparten lógica, puedes crear scripts/utils.py:
import subprocess
def ejecutar(comando):
print("Ejecutando:", " ".join(comando))
return subprocess.run(comando, check=False).returncode
Luego importarlo desde otros scripts:
from scripts.utils import ejecutar
Para importar desde scripts.utils, crea:
type nul > scripts\__init__.py
En Linux o macOS:
touch scripts/__init__.py
Podemos usar argparse para hacer scripts más flexibles. Ejemplo para limpiar reportes:
import argparse
def leer_argumentos():
parser = argparse.ArgumentParser()
parser.add_argument("--crear", action="store_true", help="Crea reports después de limpiar")
return parser.parse_args()
No hace falta agregar argumentos si el script tiene una sola tarea clara.
Agrega una sección al README.md:
## Scripts auxiliares
Preparar carpetas:
python scripts/preparar_proyecto.py
Limpiar reportes:
python scripts/limpiar_reportes.py
Listar pruebas:
python scripts/listar_pruebas.py
Rutina local:
python scripts/rutina_local.py
Un script sin documentación puede quedar olvidado aunque sea útil.
run_tests.py debe seguir concentrado en ejecutar pruebas. Los scripts auxiliares pueden encargarse de tareas alrededor de la suite.
run_tests.py: ejecutar pytest con opciones.limpiar_reportes.py: limpiar artefactos.verificar_estructura.py: validar rutas esperadas.rutina_local.py: combinar varias tareas.Antes de confiar en un script, ejecútalo varias veces:
python scripts/verificar_estructura.py
python scripts/preparar_proyecto.py
python scripts/limpiar_reportes.py
python scripts/rutina_local.py
Un buen script debe poder repetirse sin romper el proyecto.
Crea un script cuando una tarea:
No crees scripts para acciones triviales que no se repetirán.
__file__.Crea scripts/diagnostico.py. El script debe:
run_tests.py --tipo rapida.Archivo scripts/diagnostico.py:
import subprocess
import sys
def ejecutar(comando):
print("Ejecutando:", " ".join(comando))
return subprocess.run(comando, check=False).returncode
def main():
pasos = [
[sys.executable, "scripts/verificar_estructura.py"],
[sys.executable, "scripts/listar_pruebas.py"],
[sys.executable, "run_tests.py", "--tipo", "rapida"],
]
for paso in pasos:
codigo = ejecutar(paso)
if codigo != 0:
return codigo
return 0
if __name__ == "__main__":
raise SystemExit(main())
Ejecuta:
python scripts/diagnostico.py
Antes de continuar con el próximo tema, verifica lo siguiente:
scripts.python -m pytest desde los scripts.En este tema automatizamos tareas repetitivas con scripts de Python. Estos scripts ayudan a preparar el proyecto, limpiar artefactos, listar pruebas y ejecutar rutinas completas con menos errores manuales.
En el próximo tema crearemos comandos simples para ejecutar suites por objetivo, llevando esta automatización a una interfaz más cómoda para el uso diario.