Movatterモバイル変換


[0]ホーム

URL:


Saltar a contenido
Join theFastAPI Cloud waiting list 🚀
Follow@fastapi onX (Twitter) to stay updated
FollowFastAPI onLinkedIn to stay updated
Subscribe to theFastAPI and friends newsletter 🎉
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor

Tests Asíncronos

🌐 Traducción por IA y humanos

Esta traducción fue hecha por IA guiada por humanos. 🤝

Podría tener errores al interpretar el significado original, o sonar poco natural, etc. 🤖

Puedes mejorar esta traducciónayudándonos a guiar mejor al LLM de IA.

Versión en inglés

Ya has visto cómo probar tus aplicaciones deFastAPI usando elTestClient proporcionado. Hasta ahora, solo has visto cómo escribir tests sincrónicos, sin usar funcionesasync.

Poder usar funciones asíncronas en tus tests puede ser útil, por ejemplo, cuando consultas tu base de datos de forma asíncrona. Imagina que quieres probar el envío de requests a tu aplicación FastAPI y luego verificar que tu backend escribió exitosamente los datos correctos en la base de datos, mientras usas un paquete de base de datos asíncrono.

Veamos cómo podemos hacer que esto funcione.

pytest.mark.anyio

Si queremos llamar funciones asíncronas en nuestros tests, nuestras funciones de test tienen que ser asíncronas. AnyIO proporciona un plugin útil para esto, que nos permite especificar que algunas funciones de test deben ser llamadas de manera asíncrona.

HTTPX

Incluso si tu aplicación deFastAPI usa funcionesdef normales en lugar deasync def, sigue siendo una aplicaciónasync por debajo.

ElTestClient hace algo de magia interna para llamar a la aplicación FastAPI asíncrona en tus funciones de testdef normales, usando pytest estándar. Pero esa magia ya no funciona cuando lo usamos dentro de funciones asíncronas. Al ejecutar nuestros tests de manera asíncrona, ya no podemos usar elTestClient dentro de nuestras funciones de test.

ElTestClient está basado enHTTPX, y afortunadamente, podemos usarlo directamente para probar la API.

Ejemplo

Para un ejemplo simple, consideremos una estructura de archivos similar a la descrita enAplicaciones Más Grandes yTesting:

.├── app│   ├── __init__.py│   ├── main.py│   └── test_main.py

El archivomain.py tendría:

fromfastapiimportFastAPIapp=FastAPI()@app.get("/")asyncdefroot():return{"message":"Tomato"}

El archivotest_main.py tendría los tests paramain.py, podría verse así ahora:

importpytestfromhttpximportASGITransport,AsyncClientfrom.mainimportapp@pytest.mark.anyioasyncdeftest_root():asyncwithAsyncClient(transport=ASGITransport(app=app),base_url="http://test")asac:response=awaitac.get("/")assertresponse.status_code==200assertresponse.json()=={"message":"Tomato"}

Ejecútalo

Puedes ejecutar tus tests como de costumbre vía:

$pytest---> 100%

En Detalle

El marcador@pytest.mark.anyio le dice a pytest que esta función de test debe ser llamada asíncronamente:

importpytestfromhttpximportASGITransport,AsyncClientfrom.mainimportapp@pytest.mark.anyioasyncdeftest_root():asyncwithAsyncClient(transport=ASGITransport(app=app),base_url="http://test")asac:response=awaitac.get("/")assertresponse.status_code==200assertresponse.json()=={"message":"Tomato"}

Consejo

Nota que la función de test ahora esasync def en lugar de solodef como antes al usar elTestClient.

Luego podemos crear unAsyncClient con la app y enviar requests asíncronos a ella, usandoawait.

importpytestfromhttpximportASGITransport,AsyncClientfrom.mainimportapp@pytest.mark.anyioasyncdeftest_root():asyncwithAsyncClient(transport=ASGITransport(app=app),base_url="http://test")asac:response=awaitac.get("/")assertresponse.status_code==200assertresponse.json()=={"message":"Tomato"}

Esto es equivalente a:

response=client.get('/')

...que usábamos para hacer nuestros requests con elTestClient.

Consejo

Nota que estamos usando async/await con el nuevoAsyncClient: el request es asíncrono.

Advertencia

Si tu aplicación depende de eventos de lifespan, elAsyncClient no activará estos eventos. Para asegurarte de que se activen, usaLifespanManager deflorimondmanca/asgi-lifespan.

Otras Llamadas a Funciones Asíncronas

Al ser la función de test asíncrona, ahora también puedes llamar (yawait) otras funcionesasync además de enviar requests a tu aplicación FastAPI en tus tests, exactamente como las llamarías en cualquier otro lugar de tu código.

Consejo

Si encuentras unRuntimeError: Task attached to a different loop al integrar llamadas a funciones asíncronas en tus tests (por ejemplo, cuando usasMotorClient de MongoDB), recuerda crear instances de objetos que necesiten un loop de eventos solo dentro de funciones async, por ejemplo, en un callback@app.on_event("startup").


[8]ページ先頭

©2009-2026 Movatter.jp