11. Instalación de pytest y primera ejecución

11.1 Objetivo del tema

pytest es uno de los frameworks de testing más usados en proyectos Python. Permite escribir pruebas con menos estructura que unittest, muestra fallas con mucha información y ofrece extensiones para cobertura, selección de pruebas, fixtures y automatización.

En este tema instalaremos pytest, verificaremos que funcione, escribiremos una primera prueba y ejecutaremos la suite desde la terminal.

Idea clave: usa python -m pytest para ejecutar pytest con el mismo Python del entorno activo.

11.2 Crear una carpeta de práctica

Crea un proyecto nuevo:

mkdir pytest-inicio-demo
cd pytest-inicio-demo

Trabajaremos dentro de esta carpeta para mantener aislados los archivos del ejemplo.

11.3 Crear un entorno virtual

Desde la raíz del proyecto, crea el entorno virtual:

python -m venv .venv

Actívalo en Windows PowerShell:

.venv\Scripts\Activate.ps1

En Linux o macOS:

source .venv/bin/activate

Cuando el entorno está activo, la terminal suele mostrar (.venv) al comienzo de la línea.

11.4 Actualizar pip

Antes de instalar paquetes, actualiza pip dentro del entorno virtual:

python -m pip install --upgrade pip

Esto reduce problemas causados por versiones antiguas del instalador.

11.5 Instalar pytest

Instala pytest con:

python -m pip install pytest

Usamos python -m pip para instalar el paquete en el Python asociado al entorno activo.

11.6 Verificar la instalación

Para comprobar que pytest quedó instalado, ejecuta:

python -m pytest --version

La salida mostrará la versión instalada. El número exacto puede variar según el momento en que instales el paquete.

11.7 Crear el código a probar

Crea un archivo llamado operaciones.py:

def sumar(a, b):
    return a + b


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


def dividir(a, b):
    if b == 0:
        raise ValueError("No se puede dividir por cero")
    return a / b

Este módulo tiene funciones simples para probar valores de retorno y una excepción esperada.

11.8 Crear la primera prueba con pytest

Crea un archivo llamado test_operaciones.py:

from operaciones import sumar


def test_sumar_dos_numeros():
    resultado = sumar(2, 3)

    assert resultado == 5

Con pytest no necesitamos crear una clase ni heredar de unittest.TestCase. Una función cuyo nombre comienza con test_ alcanza para escribir una prueba.

11.9 Ejecutar la primera prueba

Desde la raíz del proyecto, ejecuta:

python -m pytest

La salida esperada será similar a:

collected 1 item

test_operaciones.py .                                            [100%]

1 passed in 0.02s

El punto indica que la prueba pasó correctamente.

11.10 Agregar más pruebas

Amplía test_operaciones.py con nuevas pruebas:

from operaciones import dividir, es_par, sumar


def test_sumar_dos_numeros():
    resultado = sumar(2, 3)

    assert resultado == 5


def test_numero_par_devuelve_true():
    resultado = es_par(8)

    assert resultado is True


def test_numero_impar_devuelve_false():
    resultado = es_par(7)

    assert resultado is False


def test_dividir_dos_numeros():
    resultado = dividir(10, 2)

    assert resultado == 5

En pytest usamos la palabra clave assert directamente.

11.11 Ejecutar nuevamente

Ejecuta otra vez:

python -m pytest

La salida esperada será similar a:

collected 4 items

test_operaciones.py ....                                         [100%]

4 passed in 0.02s

Cada punto representa una prueba exitosa.

11.12 Probar una excepción con pytest

Para probar excepciones con pytest, importamos el paquete y usamos pytest.raises:

import pytest

from operaciones import dividir, es_par, sumar


def test_dividir_por_cero_lanza_error():
    with pytest.raises(ValueError):
        dividir(10, 0)

Esta prueba pasa si la función lanza ValueError.

11.13 Archivo completo de pruebas

El archivo test_operaciones.py puede quedar así:

import pytest

from operaciones import dividir, es_par, sumar


def test_sumar_dos_numeros():
    resultado = sumar(2, 3)
    assert resultado == 5


def test_numero_par_devuelve_true():
    resultado = es_par(8)
    assert resultado is True


def test_numero_impar_devuelve_false():
    resultado = es_par(7)
    assert resultado is False


def test_dividir_dos_numeros():
    resultado = dividir(10, 2)
    assert resultado == 5


def test_dividir_por_cero_lanza_error():
    with pytest.raises(ValueError):
        dividir(10, 0)

11.14 Ejecutar con salida detallada

La opción -v muestra el nombre de cada prueba:

python -m pytest -v

Es útil cuando queremos confirmar qué pruebas se ejecutaron o ubicar rápidamente una falla.

11.15 Ejecutar un archivo específico

Para ejecutar solamente un archivo:

python -m pytest test_operaciones.py

En proyectos con muchos archivos, esto permite enfocarse en una parte puntual de la suite.

11.16 Crear requirements.txt

Para registrar la dependencia del proyecto, crea requirements.txt con este contenido:

pytest

En PowerShell puedes crearlo automáticamente con:

Set-Content -Path requirements.txt -Value "pytest"

Otra opción es guardar las versiones exactas instaladas:

python -m pip freeze > requirements.txt

11.17 Estructura final

Al terminar, la carpeta debería quedar así:

pytest-inicio-demo/
|-- .venv/
|-- operaciones.py
|-- requirements.txt
`-- test_operaciones.py

En proyectos más grandes usaremos una carpeta tests, pero para esta primera ejecución un archivo en la raíz alcanza.

11.18 Diferencias iniciales con unittest

Aspecto unittest pytest
Estructura básica Clases que heredan de unittest.TestCase Funciones simples con nombre test_...
Aserciones self.assertEqual, self.assertTrue assert
Excepciones self.assertRaises pytest.raises
Instalación Incluido en Python Se instala con pip

11.19 Errores frecuentes

  • pytest no se reconoce como comando: usa python -m pytest o revisa si el entorno virtual está activo.
  • Instalar pytest fuera del entorno: usa python -m pip install pytest con el entorno activo.
  • Nombrar el archivo sin test_: pytest puede no descubrir la prueba.
  • Nombrar la función sin test_: esa función no se ejecutará como prueba.
  • Ejecutar desde otra carpeta: pueden fallar las importaciones del proyecto.

11.20 Comandos usados en este tema

mkdir pytest-inicio-demo
cd pytest-inicio-demo
python -m venv .venv
.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
python -m pip install pytest
python -m pytest --version
python -m pytest
python -m pytest -v
python -m pytest test_operaciones.py
python -m pip freeze > requirements.txt

11.21 Qué debes recordar de este tema

  • pytest se instala como dependencia del proyecto.
  • Conviene instalarlo dentro de un entorno virtual.
  • python -m pytest ejecuta pytest con el Python activo.
  • Las pruebas pueden escribirse como funciones simples.
  • Las aserciones se escriben con assert.
  • Los archivos y funciones de prueba deben comenzar con test_.

11.22 Conclusión

En este tema instalamos pytest, verificamos la instalación, escribimos una primera prueba y ejecutamos la suite desde la terminal.

En el próximo tema escribiremos pruebas simples con pytest con más variedad de casos y aserciones.