Testen
Aan de kant van de testclient kunt u de httpx-bibliotheek gebruiken om verzoeken in te dienen tegen uw ASGI-toepassing.
Uit starlette.reacties importeren HTMLResponse
Vanaf starlette.testclient importeren TestClient
Async def app (bereik, ontvangen, verzenden):
Toepassingsgebied ['type'] = = 'http'
Reactie = HTMLReactie ('<html><body>Hallo, wereld!</body></html>')
In afwachting van reactie (scope, ontvangen, verzenden)
Def test _ app ():
Opdrachtgever = TestClient (app)
Reactie = client.get ('/')
Antwoord. status _ code = = 200
De interface die wordt weergegeven door de kant van de testclient is hetzelfde als die van elke andere httpx-sessie. In het bijzonder is de aanroep die het verzoek doet slechts een standaardfunctieaanroep, geen wachtbaar object.
U kunt alle standaard API 's van httpx gebruiken, zoals authenticatie, verwerking van sessiecookies of het uploaden van bestanden.
Als u bijvoorbeeld headers op TestClient wilt instellen, kunt u het volgende doen:
Opdrachtgever = TestClient (app)
# Kopteksten op de client instellen voor toekomstige verzoeken
Client.headers = {"Authorization": "..."}
Reactie = client.get ("/")
# Kopteksten voor elk verzoek afzonderlijk instellen
Reactie = client.get ("/", headers ={"Authorization": "..."})
TestClient bijvoorbeeld gebruiken om een bestand te verzenden:
Opdrachtgever = TestClient (app)
# Stuur een enkel bestand
Met opening ("example.txt", "rb") als f:
Reactie = client.post ("/ form", bestanden ={"file": f})
# Meerdere bestanden verzenden
Met opening ("example.txt", "rb") als f1:
Met opening ("example.png", "rb") als f2:
Bestanden = {"file1": f1, "file2": ("filename", f2, "image/png")}
Reactie = client.post ("/ form", bestanden = bestanden)
Voor meer informatie kunt u de httpx documentatie bekijken.
Standaard gooit TestClient elke uitzondering die in uw toepassing voorkomt. Af en toe wilt u misschien de inhoud van een 500-foutreactie testen in plaats van de clientzijde toe te staan een serveruitzondering te maken. In dit geval moet u client = TestClient(app, raise_server_exceptions=False) gebruiken.
Aandacht
Als u wilt dat de TestClient de lifespan-handler uitvoert,
U moet de TestClient als context gebruiken manager.It
Niet worden geactiveerd wanneer de TestClient is instantiated.You er meer over kan leren
hier.
Selecteer asynchrone backend
TestClient accepteert argumenten backend(een string) en backend_options(een woordenboek). Deze opties worden doorgegeven aan anyio.start_blocking_portal(). Zie de anyio-documentatie voor meer informatie over acceptabele backend-opties. Standaard worden asyncio en de standaardopties gebruikt.
Sorry, de betekenis van "Trio" en "backend="trio"" in de originele tekst is onduidelijk en kan niet nauwkeurig worden vertaald. Als u meer informatie kunt geven over deze twee symbolen, zal ik mijn best doen om u een nauwkeurigere vertaling te geven.
Zeker testen _ app ()
Met TestClient (app, backend = "trio") als client:
...
Om asyncio met uvloop uit te voeren, geeft u backend_options={"use_uvloop": True} door. Bijvoorbeeld:
Zeker testen _ app ()
Met TestClient (app, backend _ options ={"use_uvloop": True}) als client:
...
Een WebSocket sessie testen
U kunt WebSocket-sessies ook testen met behulp van de testclient.
httpx De bibliotheek wordt gebruikt om de eerste handdruk te bouwen, wat betekent dat u dezelfde authenticatie-opties en extra headers kunt gebruiken tussen HTTP- en WebSocket-tests.
Vanaf starlette.testclient importeren TestClient
Vanaf starlette.websockets importeren WebSockets
Async def app (bereik, ontvangen, verzenden):
Toepassingsgebied ['type'] = = 'websocket'
WebSocket = WebSocket (bereik, ontvangen = ontvangen, verzenden = verzenden)
Wacht op websocket.accepteer ()
Wacht op websocket. send _ text ('Hallo, wereld!')
Wacht op websocket.close ()
Def test _ app ():
Opdrachtgever = TestClient (app)
Met client.websocket _ connect ('/') als websocket:
Data = websocket.ontvangen _ tekst ()
Beweren gegevens = = 'Hallo, wereld!'
Bewerkingen tijdens een sessie zijn standaardfunctieaanroepen, geen wachtende objecten.
Het is belangrijk om sessies te gebruiken binnen context-managed with-blokken. Dit zorgt ervoor dat de achtergrondthreads waar de ASGI-applicatie zich bevindt, correct worden beëindigd en dat eventuele uitzonderingen die zich voordoen binnen de applicatie altijd worden opgeworpen door de testclient-zijde.
Een testsessie opzetten
.websocket_connect(url, subprotocols=None, **options)- neemt dezelfde set parameters alshttpx.get().
Als de applicatie geen WebSocket-verbindingen accepteert, kan starlette.websockets.WebSocketDisconnect worden gegooid.
websocket_connect() moet worden gebruikt als contextmanager (in een with-blok).
!!! Merk op dat de parameter params niet wordt ondersteund door websocket_connect. Als u queryparameters moet doorgeven, moet u rechtstreeks in de URL hardcoderen.
```python
with client.websocket_connect('/path?foo=bar') as websocket:
...
```
gegevens sturen
.send_text(data)- Stuur de gegeven tekst naar de applicatie..send_bytes(data)- Stuur de gegeven bytes naar de applicatie..send_json(data, mode="text")- Stuur de gegeven gegevens naar de applicatie. Gebruikmode="binary"om JSON te verzenden via binaire gegevensframes.
gegevens ontvangen
.receive_text()Wacht op de inkomende tekst die door de applicatie is verzonden en stuur deze terug..receive_bytes()- Wacht op de inkomende bytestring die door de applicatie is verzonden en retourneer deze..receive_json(mode="text")- Wacht op inkomende JSON-gegevens die door de applicatie zijn verzonden en keert terug. Ontvangt JSON via binaire gegevensframes metmode="binary".
De tekst "Kan starlette.websockets.WebSocketDisconnect verhogen". lijkt niet in overeenstemming te zijn met de conventionele semantische uitdrukking, waardoor het moeilijk is om een nauwkeurige Chinese vertaling te maken. Als u meer contextuele informatie heeft of de nauwkeurigheid van de tekstinhoud bevestigt, zal ik mijn best doen om u een meer bevredigende vertaling te geven.
Op dit moment kan de letterlijke vertaling alleen worden vertaald als: "Kan starlette.websockets.WebSocketDisconnect verbeteren". Maar deze vertaling is misschien niet praktisch.
Verbinding sluiten
.close(code=1000)- Uitvoeren client side close operatie op WebSocket verbinding.
asynchroon testen
Soms wilt u asynchrone bewerkingen uitvoeren buiten uw toepassing. U kunt bijvoorbeeld de status van uw database controleren nadat u uw toepassing hebt aangeroepen met behulp van uw bestaande asynchrone database-clientzijde / infrastructuur.
In deze gevallen is het gebruik van TestClient moeilijk omdat het zijn eigen gebeurtenislus creëert en asynchrone bronnen, zoals databaseverbindingen, vaak niet worden gedeeld tussen gebeurtenislussen.
De eenvoudigste manier om dit probleem op te lossen, is door uw hele test asynchroon te maken en een asynchrone clientzijde te gebruiken, zoals Httpx. AsyncClient.
Hier is een voorbeeld van zo 'n test:
AsyncClient importeren vanuit htpx
Starlette.applicaties importeren vanuit Starlette
Van starlette. routing importeren Route
Van starlette. aanvragen import aanvragen
Vanaf starlette.reacties importeren PlainTextResponse
Zeker hallo (verzoek: verzoek) - > PlainTextResponse:
Retourneert PlainTextResponse ("Hallo wereld!")
App = Starlette (routes = [Route ("/", hallo)])
# als je pytest gebruikt, moet je een asynchrone marker toevoegen zoals:
# @ pytest.mark.anyio # https://github.com/agronholm/anyio
# of installeer en configureer pytest-asyncio (https://github.com/pytest-dev/pytest-asyncio)
Async def test _ app () - > Geen:
# opmerking: je_moet_`base_url` instellen voor relatieve urls zoals "/" om te werken
Async met AsyncClient (app = app, base _ url = "http: / / testserver") als client:
R = wacht op client.get ("/")
Bevestig r. status _ code = = 200
"Hallo wereld!"