IOKELU
Nivel: Avanzado – Guía 17
💡 Prueba el código:
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

8. Ejercicios

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

Siguiente guía

Arquitectura de proyectos →