3. Entornos virtuales con venv e instalación de dependencias

3.1 Objetivo del tema

En Python, las herramientas de testing se instalan como dependencias del proyecto. Por eso necesitamos entender bien cómo crear un entorno virtual, activarlo, instalar paquetes, registrar esas dependencias y reconstruir el entorno cuando sea necesario.

En este tema trabajaremos con venv, pip, requirements.txt, pytest y pytest-cov. El objetivo es que puedas preparar un proyecto de testing de forma repetible y sin depender de configuraciones globales del equipo.

Idea central: cada proyecto debe tener sus propias dependencias aisladas para que las pruebas se ejecuten siempre en un entorno controlado.

3.2 Por qué usar entornos virtuales

Un entorno virtual es una instalación aislada de Python asociada a una carpeta de proyecto. Permite instalar paquetes sin modificar el Python global del sistema.

Esto es importante en testing porque distintos proyectos pueden necesitar versiones diferentes de una herramienta. Un proyecto puede usar una versión de pytest y otro proyecto puede usar otra, sin conflictos.

  • Evita mezclar dependencias de distintos proyectos.
  • Permite reconstruir el entorno en otra computadora.
  • Reduce errores por usar paquetes instalados globalmente.
  • Facilita automatizar pruebas en servidores de integración continua.

3.3 Crear un proyecto para practicar

Crea una carpeta nueva para este tema:

mkdir dependencias-demo
cd dependencias-demo

Trabajaremos dentro de esta carpeta para no modificar los proyectos de los temas anteriores.

3.4 Crear el entorno virtual con venv

Desde la raíz del proyecto, ejecuta:

python -m venv .venv

La carpeta .venv contiene el Python aislado del proyecto. No escribiremos código propio dentro de esa carpeta.

3.5 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

Después de activar el entorno, la terminal suele mostrar (.venv). Ese indicador nos recuerda que las instalaciones se harán dentro del proyecto.

3.6 Confirmar el Python activo

Para verificar que estamos usando el Python del entorno virtual:

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

La ruta debe incluir la carpeta .venv. Si no aparece, el entorno virtual no está activo o el editor está usando otro intérprete.

3.7 Actualizar pip

Actualiza pip dentro del entorno virtual:

python -m pip install --upgrade pip

Este paso evita errores por usar una versión antigua del instalador de paquetes.

3.8 Instalar pytest

Instalamos pytest con:

python -m pip install pytest

Verificamos la instalación:

python -m pytest --version

Usar python -m pytest garantiza que se ejecute el pytest instalado en el entorno virtual activo.

3.9 Instalar pytest-cov

pytest-cov es una extensión que permite medir cobertura de código usando pytest. La veremos en profundidad en otro tema, pero podemos instalarla ahora como ejemplo de dependencia de testing:

python -m pip install pytest-cov

Luego comprobamos que pytest reconoce la opción de cobertura:

python -m pytest --help

En la ayuda debería aparecer la opción --cov.

3.10 Ver paquetes instalados

Para ver las dependencias instaladas en el entorno:

python -m pip list

La salida incluirá paquetes como pytest, pytest-cov y sus dependencias internas.

3.11 Guardar dependencias con pip freeze

Para guardar el estado exacto de las dependencias instaladas:

python -m pip freeze > requirements.txt

Esto crea un archivo requirements.txt con versiones concretas. Un ejemplo posible:

coverage==7.8.0
iniconfig==2.1.0
packaging==25.0
pluggy==1.5.0
pytest==8.3.5
pytest-cov==6.1.1

Las versiones pueden variar según el momento en que instales los paquetes.

3.12 requirements.txt simple o congelado

Hay dos estilos frecuentes para requirements.txt:

Estilo Ejemplo Uso
Simple pytest Indica qué paquete se necesita, sin fijar versión exacta.
Congelado pytest==8.3.5 Reproduce versiones exactas para mayor estabilidad.

Para prácticas del curso, un archivo simple suele alcanzar. Para proyectos reales, fijar versiones ayuda a evitar cambios inesperados.

3.13 Reconstruir el entorno desde requirements.txt

Si recibes un proyecto con requirements.txt, el proceso habitual es:

python -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install -r requirements.txt

En Linux o macOS:

python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt

3.14 Crear código mínimo para probar

Crea un archivo llamado operaciones.py:

def multiplicar(a, b):
    return a * b


def es_par(numero):
    return numero % 2 == 0

Luego crea test_operaciones.py:

from operaciones import es_par, multiplicar


def test_multiplicar_dos_numeros():
    assert multiplicar(4, 5) == 20


def test_detectar_numero_par():
    assert es_par(8) is True

3.15 Ejecutar las pruebas con el entorno activo

Ejecuta:

python -m pytest

Si todo está correcto, verás una salida similar a:

Salida esperada al ejecutar las pruebas con pytest
collected 2 items

test_operaciones.py ..                                           [100%]

2 passed in 0.02s

3.16 Ejecutar pytest con cobertura

Como instalamos pytest-cov, también podemos ejecutar:

python -m pytest --cov=operaciones

La salida mostrará una tabla de cobertura. Todavía no analizaremos ese resultado en detalle; por ahora solo queremos confirmar que la dependencia funciona.

3.17 Desactivar el entorno virtual

Para salir del entorno virtual:

deactivate

Cuando vuelvas al proyecto otro día, deberás activar nuevamente el entorno antes de ejecutar pruebas o instalar dependencias.

3.18 Qué no conviene hacer

  • No instales herramientas de testing globalmente si el proyecto puede usar un entorno virtual.
  • No edites archivos dentro de .venv; esa carpeta es generada por Python.
  • No copies la carpeta .venv entre computadoras; reconstruye el entorno con requirements.txt.
  • No mezcles dependencias de varios proyectos en el mismo entorno virtual.
  • No ejecutes pruebas sin saber qué intérprete de Python está usando la terminal o el editor.

3.19 Problemas frecuentes

  • pytest no se encuentra: el entorno virtual no está activo o pytest no se instaló en ese entorno.
  • Se instala en otro Python: usa python -m pip en lugar de ejecutar pip directamente.
  • El editor no detecta pytest: selecciona el intérprete ubicado dentro de .venv.
  • requirements.txt queda vacío: revisa que el entorno esté activo y que las dependencias estén instaladas antes de ejecutar pip freeze.
  • PowerShell no activa el entorno: puedes usar CMD, Git Bash, la terminal integrada del editor o revisar la política de ejecución de scripts.

3.20 Comandos usados en este tema

mkdir dependencias-demo
cd dependencias-demo
python -m venv .venv
.venv\Scripts\Activate.ps1
python -c "import sys; print(sys.executable)"
python -m pip install --upgrade pip
python -m pip install pytest
python -m pip install pytest-cov
python -m pip list
python -m pip freeze > requirements.txt
python -m pip install -r requirements.txt
python -m pytest
python -m pytest --cov=operaciones
deactivate

3.21 Qué debes recordar de este tema

  • venv crea un entorno aislado por proyecto.
  • Las dependencias de testing deben instalarse dentro del entorno virtual.
  • python -m pip ayuda a instalar paquetes en el Python correcto.
  • requirements.txt permite reconstruir el entorno en otra computadora.
  • python -m pytest evita confusiones con varias instalaciones de Python.
  • La carpeta .venv no se modifica manualmente ni se copia como parte del código del proyecto.

3.22 Conclusión

En este tema profundizamos en el manejo de entornos virtuales y dependencias. Este conocimiento es básico para trabajar con pruebas en Python, porque las herramientas como pytest, pytest-cov y otras extensiones deben instalarse y ejecutarse en un entorno controlado.

En el próximo tema comenzaremos con las primeras pruebas usando unittest, la biblioteca de testing incluida en Python.