Fixtures y configuración/desmontaje
Utilice fixtures para compartir el estado de las pruebas y configurar recursos.
Fixtures y configuración/desmontaje es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.
¿Qué son los fixtures?
Los fixtures son funciones decoradas con @pytest.fixture que proporcionan dependencias para las pruebas. pytest las inyecta por nombre.
import pytest
@pytest.fixture
def user():
return {"name": "Alice", "age": 30}
def test_name(user):
assert user["name"] == "Alice"Configuración y desmontaje con yield
Devuelva el valor del fixture mediante yield dentro de un fixture para separar la configuración (antes de yield) del desmontaje (después de yield).
import pytest
@pytest.fixture
def db_connection():
conn = create_connection() # setup
yield conn
conn.close() # teardown
def test_query(db_connection):
result = db_connection.query("SELECT 1")
assert result is not NoneÁmbitos de los fixtures
Controle con qué frecuencia se crea un fixture mediante scope: function (predeterminado), class, module, session.
import pytest
@pytest.fixture(scope="module")
def expensive_resource():
print("\nSetup once per module")
yield object()
print("\nTeardown once per module")Compartir fixtures mediante conftest.py
Coloque los fixtures en conftest.py para compartirlos entre archivos de prueba sin importarlos.
# conftest.py
import pytest
@pytest.fixture
def config():
return {"env": "test", "debug": True}
# test_app.py
def test_env(config):
assert config["env"] == "test"Dependencias entre fixtures
Los fixtures pueden depender de otros fixtures si los incluyen como parámetros.
import pytest
@pytest.fixture
def base_url():
return "http://localhost:8000"
@pytest.fixture
def api_client(base_url):
return Client(base_url)
def test_get(api_client):
resp = api_client.get("/health")
assert resp.status_code == 200Fixtures autouse
Establezca autouse=True para aplicar un fixture a todas las pruebas de su ámbito sin incluirlo como parámetro.
import pytest
@pytest.fixture(autouse=True)
def reset_env(monkeypatch):
monkeypatch.setenv("ENVIRONMENT", "test")
def test_env():
import os
assert os.environ["ENVIRONMENT"] == "test"El fixture tmp_path
pytest proporciona tmp_path como un fixture integrado que ofrece un directorio temporal nuevo para cada prueba.
def test_write_file(tmp_path):
f = tmp_path / "hello.txt"
f.write_text("hello")
assert f.read_text() == "hello"El fixture monkeypatch
monkeypatch permite reemplazar temporalmente atributos, variables de entorno o entradas de diccionarios durante una prueba.
def get_env():
import os
return os.environ.get("MODE", "prod")
def test_mode(monkeypatch):
monkeypatch.setenv("MODE", "test")
assert get_env() == "test"El fixture capsys
capsys captura la salida de stdout y stderr durante las pruebas.
def greet(name):
print(f"Hello, {name}!")
def test_greet(capsys):
greet("Alice")
out, err = capsys.readouterr()
assert out == "Hello, Alice!\n"Finalizadores de fixtures con request.addfinalizer
Una alternativa a yield: registre la limpieza con request.addfinalizer.
import pytest
@pytest.fixture
def resource(request):
r = acquire_resource()
request.addfinalizer(r.release)
return rFixtures parametrizados
Use params en un fixture para ejecutar cada prueba dependiente una vez por cada valor del parámetro.
import pytest
@pytest.fixture(params=["sqlite", "postgres"])
def db(request):
return create_db(request.param)
def test_insert(db):
db.insert({"id": 1})
assert db.count() == 1Comprobación rápida
¿Qué ámbito de fixture crea el fixture una sola vez durante toda la sesión de pruebas?
Resumen
Los fixtures proporcionan configuración y desmontaje reutilizables mediante yield. Use scope para controlar su ciclo de vida, conftest.py para compartirlos y autouse=True para aplicarlos implícitamente.
Preguntas frecuentes
¿La lección «Fixtures y configuración/desmontaje» es gratis?
Sí — el texto completo de «Fixtures y configuración/desmontaje» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Fixtures y configuración/desmontaje»?
Utilice fixtures para compartir el estado de las pruebas y configurar recursos. Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Python Academy?
No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Fixtures y configuración/desmontaje»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Python Academy?
Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Escritura de sus primeras pruebas con pytest
- Fixtures y configuración/desmontaje
- Parametrización y cobertura de pruebas
- Simulación con unittest.mock