python - testrunner - test form django
Cliente de prueba Django vs. django-pytest (2)
Estoy usando django-pytest para probar una API de Django Rest Framework. Tengo un módulo de prueba que se ve así:
class TestClass:
def test_station_is_created(self, db, api_client):
StationFactory(name=''foo'')
response = api_client.get(reverse(''api:stations''))
assert response.status_code == 200
...
def test_no_stations(self, db, api_client):
response = api_client.get(reverse(''api:stations''))
assert response.data[''data''] == []
Cuando realizo las pruebas, obtengo:
________________________________ TestClass.test_no_stations________________________________
path/to/test/module.py:11: in test_no_stations
E assert [OrderedDict(...01251d92f'')])] == []
E Left contains more items, first extra item: OrderedDict([...])
Si inspecciono los datos devueltos con un depurador, veo que es la estación creada en la prueba anterior, aunque la base de datos parece estar vacía:
ipdb> response.data[''data''][0][''attributes''][''name'']
foo
ipdb> len(Station.objects.all())
0
No sé si Pytest está borrando la base de datos o no entre pruebas. Sospecho que hay varias bases de datos en uso, pero solo tengo una configurada en mi configuración. Pensé que tal vez había algo de almacenamiento en caché, pero leí la documentación del cliente de prueba de Django y no encontré mucho. ¿Qué podría estar perdiendo?
Descubrió cuál era el problema. También estábamos usando django-cacheops
y la respuesta estaba golpeando el caché en lugar de ejecutar la consulta nuevamente. La ironía es que ya había pensado que el problema podría estar relacionado con la memoria caché, pero mi intento de desactivarlo falló y me indujo a error para descartarla como la causa del problema. Eventualmente, descubrimos cómo deshabilitarlo correctamente.
Esta es una forma de desactivar el almacenamiento en caché de las pruebas si está utilizando cacheops y py.test:
from cacheops import invalidate_all
@pytest.fixture(scope=''function'', autouse=True)
def invalidate_cache():
invalidate_all()
pytest-django, de hecho, aísla las pruebas entre sí invirtiendo la transacción al final de cada prueba.
Si quiere asegurarse de que su base de datos no tenga ninguna estación antes de agregar la prueba al comienzo de test_no_stations
:
assert not Station.objects.all().exist()
Si se demuestra que esto es incorrecto, o te perdiste algo en tu configuración de Pytest o el problema está en tu código.