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.
python -m pytest para ejecutar pytest con el mismo Python del entorno activo.
Crea un proyecto nuevo:
mkdir pytest-inicio-demo
cd pytest-inicio-demo
Trabajaremos dentro de esta carpeta para mantener aislados los archivos del ejemplo.
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.
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.
Instala pytest con:
python -m pip install pytest
Usamos python -m pip para instalar el paquete en el Python asociado al entorno activo.
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.
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.
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.
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.
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.
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.
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.
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)
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.
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.
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
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.
| 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 |
python -m pytest o revisa si el entorno virtual está activo.python -m pip install pytest con el entorno activo.test_: pytest puede no descubrir la prueba.test_: esa función no se ejecutará como prueba.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
pytest se instala como dependencia del proyecto.python -m pytest ejecuta pytest con el Python activo.assert.test_.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.