4. Instalación de herramientas: pytest, python-dotenv y dependencias útiles

4.1 Objetivo del tema

En los temas anteriores creamos un proyecto base y organizamos sus carpetas. Ahora instalaremos y verificaremos herramientas que nos ayudarán a ejecutar pruebas automatizadas de forma más práctica.

Trabajaremos con pytest, python-dotenv y algunas extensiones útiles. También aprenderemos a registrar dependencias para que el entorno pueda reconstruirse en otro equipo.

Objetivo práctico: instalar las herramientas básicas del proyecto, verificar que funcionan y dejar documentadas las dependencias de la suite automatizada.

4.2 Herramientas que usaremos

Para esta etapa instalaremos estas dependencias:

  • pytest: framework principal para ejecutar pruebas.
  • python-dotenv: lectura de variables desde archivos .env.
  • pytest-xdist: ejecución paralela de pruebas.
  • pytest-html: generación de reportes HTML.

No usaremos todas en profundidad en este tema. Las dejaremos instaladas y verificadas para utilizarlas gradualmente en las próximas clases.

4.3 Activar el entorno virtual

Ubícate en la raíz del proyecto automatizacion-pruebas-python y activa 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

Antes de instalar paquetes, conviene confirmar que el entorno activo es el correcto.

4.4 Verificar el Python activo

Ejecuta:

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

La ruta debería apuntar a la carpeta .venv del proyecto. Si apunta a otra instalación, revisa la activación del entorno virtual.

4.5 Actualizar pip

Actualiza pip dentro del entorno activo:

python -m pip install --upgrade pip

Esto evita errores de instalación causados por versiones antiguas del instalador de paquetes.

4.6 Instalar dependencias

Instala las herramientas principales:

python -m pip install pytest python-dotenv pytest-xdist pytest-html

Si el comando termina sin errores, las herramientas quedaron instaladas en el entorno virtual del proyecto.

Instala dependencias siempre con el entorno virtual activo. Así evitas instalar paquetes en el Python global del sistema.

4.7 Verificar pytest

Comprueba que pytest está disponible:

python -m pytest --version

También puedes ejecutar la suite actual:

python -m pytest -v

Si las pruebas de los temas anteriores pasan, el proyecto sigue funcionando después de instalar las nuevas herramientas.

4.8 Verificar pytest-xdist

pytest-xdist permite ejecutar pruebas en paralelo. Para verificar que está instalado, ejecuta:

python -m pytest -n auto

La opción -n auto indica que pytest puede usar varios procesos según la capacidad del equipo.

En este momento la suite es pequeña, así que quizá no notes diferencia. El objetivo por ahora es confirmar que la herramienta funciona.

4.9 Verificar pytest-html

pytest-html permite generar un reporte HTML. Ejecuta:

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

Luego revisa que exista el archivo reports/reporte.html. Más adelante veremos reportes con mayor detalle.

4.10 Registrar dependencias en requirements.txt

Después de instalar herramientas, actualiza el archivo requirements.txt:

python -m pip freeze > requirements.txt

Este archivo permite reconstruir el entorno en otra computadora con:

python -m pip install -r requirements.txt

Registrar dependencias es parte de la automatización: evita que el proyecto funcione solo en la máquina de quien lo creó.

4.11 Crear un archivo .env

Un archivo .env permite guardar configuración local del proyecto. Crea un archivo llamado .env en la raíz:

APP_ENV=local
TEST_TIMEOUT=5
REPORTS_DIR=reports

Estos valores son simples, pero nos servirán para practicar la lectura de configuración desde Python.

No guardes claves reales, contraseñas ni tokens privados en archivos que luego subirás a un repositorio público.

4.12 Crear un lector de configuración

Crea el archivo app/config.py:

import os

from dotenv import load_dotenv


load_dotenv()


def obtener_ambiente():
    return os.getenv("APP_ENV", "local")


def obtener_timeout():
    return int(os.getenv("TEST_TIMEOUT", "5"))


def obtener_carpeta_reportes():
    return os.getenv("REPORTS_DIR", "reports")

La función load_dotenv() carga las variables definidas en el archivo .env.

4.13 Probar la lectura de configuración

Crea el archivo tests/test_config.py:

from app.config import obtener_ambiente, obtener_carpeta_reportes, obtener_timeout


def test_obtener_ambiente_desde_env():
    assert obtener_ambiente() == "local"


def test_obtener_timeout_desde_env():
    assert obtener_timeout() == 5


def test_obtener_carpeta_reportes_desde_env():
    assert obtener_carpeta_reportes() == "reports"

Ejecuta:

python -m pytest tests/test_config.py -v

4.14 Crear .gitignore

Aunque este curso no depende de Git, es buena práctica preparar un archivo .gitignore para excluir archivos generados o locales.

type nul > .gitignore

En Linux o macOS:

touch .gitignore

Agrega este contenido:

.venv/
__pycache__/
.pytest_cache/
reports/
.env

Esto ayuda a no mezclar archivos del entorno, cachés o configuración local con el código del proyecto.

4.15 Dependencias directas e indirectas

Cuando ejecutamos pip freeze, el archivo requirements.txt incluye dependencias directas e indirectas. Por ejemplo, al instalar pytest también se instalan paquetes que pytest necesita para funcionar.

Para este curso usaremos requirements.txt como registro simple del entorno completo. En proyectos profesionales puede ser conveniente separar dependencias principales, dependencias de desarrollo y archivos de bloqueo.

4.16 Actualizar el script de ejecución

Modifica run_tests.py para aceptar una ejecución normal y generar reportes en la carpeta configurada:

import subprocess
import sys

from app.config import obtener_carpeta_reportes


def main():
    reporte = f"{obtener_carpeta_reportes()}/reporte.html"
    comando = [
        sys.executable,
        "-m",
        "pytest",
        "-v",
        f"--html={reporte}",
        "--self-contained-html",
    ]
    resultado = subprocess.run(comando, check=False)
    return resultado.returncode


if __name__ == "__main__":
    raise SystemExit(main())

Ahora puedes ejecutar:

python run_tests.py

El script ejecutará la suite y generará un reporte HTML.

4.17 Comprobar herramientas instaladas desde Python

Crea un archivo temporal llamado verificar_herramientas.py si quieres comprobar imports básicos:

import dotenv
import pytest


print("pytest:", pytest.__version__)
print("python-dotenv instalado:", dotenv is not None)

Ejecuta:

python verificar_herramientas.py

Después de verificar, puedes eliminar ese archivo porque no forma parte de la aplicación ni de la suite.

4.18 Problemas frecuentes

  • No se reconoce pytest: ejecuta python -m pytest o revisa que el entorno virtual esté activo.
  • No se encuentra dotenv: instala python-dotenv dentro del entorno virtual.
  • No se genera el reporte: verifica que exista la carpeta reports o créala antes de ejecutar.
  • El archivo .env no se carga: revisa que esté en la raíz del proyecto desde donde ejecutas pytest.
  • La ejecución paralela falla: ejecuta primero sin -n auto para comprobar si el problema está en la prueba y no en la herramienta.

4.19 Ejercicio práctico

Agrega una nueva variable al archivo .env:

MAX_REINTENTOS=3

Luego agrega en app/config.py una función llamada obtener_max_reintentos que devuelva ese valor como número entero.

Finalmente crea una prueba en tests/test_config.py para verificar que la función devuelve 3.

4.20 Solución propuesta

Agrega esta función a app/config.py:

def obtener_max_reintentos():
    return int(os.getenv("MAX_REINTENTOS", "3"))

Y esta prueba a tests/test_config.py:

from app.config import obtener_max_reintentos


def test_obtener_max_reintentos_desde_env():
    assert obtener_max_reintentos() == 3

Ejecuta toda la suite:

python -m pytest -v

4.21 Lista de verificación

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

  • El entorno virtual está activo antes de instalar dependencias.
  • pytest, python-dotenv, pytest-xdist y pytest-html están instalados.
  • La suite se ejecuta con python -m pytest -v.
  • El archivo requirements.txt fue actualizado.
  • Existe un archivo .env con configuración local.
  • La configuración se puede leer desde app/config.py.
  • El proyecto puede generar un reporte HTML en reports.

4.22 Conclusión

En este tema instalamos las herramientas básicas que acompañarán la automatización de pruebas durante el curso. También registramos dependencias, leímos configuración desde un archivo .env y generamos un primer reporte HTML.

Con el entorno preparado, en el próximo tema crearemos un primer script de ejecución automática más enfocado en repetir la suite con comandos simples y consistentes.