Café y Código

5. Fixtures

Fixture básica

Una función decorada con @pytest.fixture provee un valor a los tests que la declaran como argumento.

test_usuario.py
PYTHON
1 import pytest
2
3 @pytest.fixture
4 def usuario_demo():
5 return {"nombre": "Luis", "rol": "admin"}
6
7 def test_rol(usuario_demo):
8 assert usuario_demo["rol"] == "admin"

Yield y limpieza

Después de yield, el código corre como teardown (útil para archivos temporales, conexiones, etc.).

fixture con yield
PYTHON
1 @pytest.fixture
2 def contador():
3 estado = {"n": 0}
4 yield estado
5 # aquí podrías cerrar recursos
6 estado.clear()

Scope

  • scope="function" (default): una vez por test.
  • scope="module": compartida en el módulo.
  • scope="session": una vez por ejecución de pytest.

Ejercicio 1

Definí una fixture lista_vacia que devuelva [] y un test que haga append(1) y compruebe longitud 1.

Ver solución propuesta
PYTHON
1 import pytest
2
3 @pytest.fixture
4 def lista_vacia():
5 return []
6
7 def test_append(lista_vacia):
8 lista_vacia.append(1)
9 assert len(lista_vacia) == 1

Ejercicio 2

¿Cuándo elegirías scope="module" para una fixture costosa de crear?

Ver idea guía

Cuando el recurso es seguro de compartir entre tests del mismo archivo y crearlo en cada función sería lento (p. ej. cargar un modelo grande en memoria).

Ponte a prueba

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.