Ejecuta cualquier ejemplo en nuestra consola interactiva: Abrir consola de Python →
Pytest avanzado en Python
Pytest es el framework de testing más potente y flexible en Python. En esta guía aprenderás técnicas avanzadas como fixtures parametrizadas, scopes, uso de monkeypatch, pytest.mark, tests asíncronos, plugins y buenas prácticas para proyectos profesionales.
Tabla de contenidos
- Fixtures avanzadas
- Scopes: function, class, module, session
- Fixtures parametrizadas
- pytest.mark
- monkeypatch
- Tests asíncronos
- Plugins útiles
- Ejercicios
- Mini‑proyecto
1. Fixtures avanzadas
import pytest
@pytest.fixture
def usuario():
return {"nombre": "Ana", "edad": 30}
def test_usuario(usuario):
assert usuario["edad"] == 30
2. Scopes: function, class, module, session
@pytest.fixture(scope="module")
def conexion():
print("Conectando...")
yield "OK"
print("Cerrando...")
3. Fixtures parametrizadas
@pytest.fixture(params=[1, 2, 3])
def numero(request):
return request.param
def test_numero(numero):
assert numero > 0
4. pytest.mark
@pytest.mark.slow
def test_lento():
import time
time.sleep(1)
assert True
5. monkeypatch
def obtener_usuario():
return "Ana"
def test_mock(monkeypatch):
monkeypatch.setattr("__main__.obtener_usuario", lambda: "Mock")
assert obtener_usuario() == "Mock"
6. Tests asíncronos
import pytest
import asyncio
@pytest.mark.asyncio
async def test_async():
await asyncio.sleep(0.1)
assert True
7. Plugins útiles
- pytest-cov — cobertura de código
- pytest-xdist — ejecución en paralelo
- pytest-mock — mocks avanzados
- pytest-asyncio — tests async
8. Ejercicios
- Crea una fixture con scope session.
- Usa monkeypatch para simular una API.
- Crea tests parametrizados para una función matemática.
- Usa pytest.mark para categorizar tests.
- Crea un test async que consulte una función simulada.
@pytest.fixture(scope="session")
def config():
return {"modo": "prod"}
monkeypatch.setattr("mod.api", lambda: {"ok": True})
9. Mini‑proyecto: Suite de tests profesional
import pytest
@pytest.fixture
def db():
return {"usuarios": ["Ana", "Luis"]}
def obtener(db, nombre):
return nombre in db["usuarios"]
@pytest.mark.parametrize("nombre,resultado", [
("Ana", True),
("Pedro", False),
])
def test_obtener(db, nombre, resultado):
assert obtener(db, nombre) == resultado