Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 99 additions & 0 deletions docs/fr/docs/advanced/async-tests.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# Tests Asynchrones

Vous avez déjà vu comment tester vos applications **FastAPI** en utilisant le `TestClient` fourni. Jusqu'à présent, vous avez seulement vu comment écrire des tests synchrones, sans utiliser des fonctions `async`.

Être capable d'utiliser des fonctions asynchrones dans vos tests peut ĂȘtre utile, par exemple, lorsque vous requĂȘtez de maniĂšre asynchrone votre base de donnĂ©es. Imaginez que vous vouliez tester l'envoi de requĂȘte Ă  votre application FastAPI, puis vĂ©rifier que votre backend a bien Ă©crit la bonne donnĂ©e dans la base de donnĂ©es, tout en utilisant une librairie de base de donnĂ©es asynchrone.

Voyons comment faire.

## pytest.mark.anyio

Afin de permettre l'appel de fonctions asynchrones dans nos tests, il est essentiel que nos fonctions de tests soient asynchrones. AnyIO propose un plugin soigneusement conçu pour cela, qui nous permet de spĂ©cifier que certaines fonctions de test doivent ĂȘtre appelĂ©es de maniĂšre asynchrone.

## HTTPX

MĂȘme si votre application **FastAPI** utilise des fonctions `def` normales plutĂŽt que des `async def`, elle reste une application `async` application en dessous.

`TestClient` utilise de la magie Ă  l'intĂ©rieur pour appeler l'application FastAPI dans vos fonctions de test `def` normales, en utilisant un standard pytest. Mais cette magie ne marche plus lorsque vous l'utilisez dans une fonction asynchrone. En lançant nos tests de maniĂšre asynchrone, `TestClient` ne peut plus ĂȘtre utilisĂ© dans nos fonctions de tests.

`TestClient` repose <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>, et par chance, on peut l'utiliser directement pour tester l'API.

## Exemple

Prenons un exemple simple, on considÚre une structure de fichier similaire à celle décrite dans [Applications plus grandes](../tutorial/bigger-applications.md){.internal-link target=_blank} et [Testing](../tutorial/testing.md){.internal-link target=_blank}:

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

Dans le fichier `main.py` il y aurait:

{* ../../docs_src/async_tests/main.py *}

Le fichier `test_main.py` contiendrait les tests pour `main.py`, et pourrait désormais ressembler à :

{* ../../docs_src/async_tests/test_main.py *}

## Lancez les

Comme d'habitude, vous pouvez lancer vos tests en utilisant :

<div class="termy">

```console
$ pytest

---> 100%
```

</div>

## En Détail

Le marqueur `@pytest.mark.anyio` informe pytest que la fonction de test doit ĂȘtre appelĂ©e de maniĂšre asynchrone:

{* ../../docs_src/async_tests/test_main.py hl[7] *}

/// tip

Notez que la fonction de test est maintenant une `async def` plutÎt qu'une simple `def` comme précédemment lorsqu'on utilisait `TestClient`.

///

Puis on crĂ©e un `AsyncClient` avec l'application, et on lui envoie des requĂȘtes, en utilisant `await`.

{* ../../docs_src/async_tests/test_main.py hl[9:12] *}

C'est l'équivalent de:

```Python
response = client.get('/')
```

...que l'on utilisait pour faire nos requĂȘtes avec le `TestClient`.

/// tip

Notez que l'on utilise async/await avec le nouvel `AsyncClient` - la requĂȘte est asynchrone.

///

/// warning

Dans le cas oĂč votre application dĂ©pend des Ă©vĂ©nements de durĂ©e de vie, le `AsyncClient` ne dĂ©clenchera pas ces Ă©vĂ©nements. Pour vous assurer qu'ils soient dĂ©clenchĂ©s, utilisez `LifespanManager` de <a href="https://github.com/florimondmanca/asgi-lifespan#usage" class="external-link" target="_blank">florimondmanca/asgi-lifespan</a>.

///

## Autres appels de fonction asynchrone

Comme la fonction de test est maintenant asynchrone, vous pouvez dĂ©sormais aussi appeler (et `await`) d'autres fonctions `async` en plus d'envoyer des requĂȘtes Ă  votre application FastAPI dans vos tests, exactement de la mĂȘme maniĂšre dont vous les auriez appelĂ©es Ă  n'importe quel autre endroit de votre code.

/// tip

Si vous rencontrez une `RuntimeError: Task attached to a different loop` en intégrant des appels de fonctions asynchrones dans vos tests (par exemple en utilisant <a href="https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop" class="external-link" target="_blank">MongoDB's MotorClient</a>), n'oubliez pas d'instancier les objets ayant besoin d'une boucle d'événement seulement dans vos fonctions asynchrones, par exemple une fonction de rappel `'@app.on_event("startup")` callback.

///