Add files via upload

A possible translation in frensh of the doc file testing.md
This commit is contained in:
Mgcsuper 2024-04-12 14:57:58 +02:00 committed by GitHub
parent 3425c834cc
commit d37b2cfc75
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 216 additions and 0 deletions

View File

@ -0,0 +1,216 @@
# Test
Grace à <a href="https://www.starlette.io/testclient/" class="external-link" target="_blank">Starlette</a>, tester l'application **FastAPI** est facile et agréable.
Il repose sur <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>, ce dernier conçu sur la base de Requests, ce qui le rend intuitif et familier pour la plupart d'entre nous.
Ainsi, il vous est possible d'uiliser <a href="https://docs.pytest.org/" class="external-link" target="_blank">pytest</a> directement avec **FastAPI**.
## Utiliser `TestClient`
!!! info
Pour utiliser `TestClient`, commencez par installer <a href="https://www.python-httpx.org" class="external-link" target="_blank">`httpx`</a>.
ex. `pip install httpx`.
Importez `TestClient`.
Créez un `TestClient` en lui passant votre application **FastAPI**.
Créez des fonctions dont le nom commence par `test_` (c'est une convention standard de `pytest`).
Utilisez l'objet `TestClient` de la même manière que vous le feriez avec `httpx`.
Écrivez des instruction d'assertion `assert` simples avec les expressions Python standard qu'il est necessaire de vérifier (de nouveau, c'est une pratique standard de `pytest`)."
```Python hl_lines="2 12 15-18"
{!../../../docs_src/app_testing/tutorial001.py!}
```
!!! astuce
il est utile de remarquer que les fonction de test sont normal `def`, et non `async def`
Et les appel au client sont aussi normaux, pas besoin d'utiliser `await`
Cela permet d'utiliser `pytest` directement sans complication
!!! note "Details Technique"
il est aussi possible d'utiliser `from starlette.testclient import TestClient`.
**FastAPI** fournit la même `starlette.testclient` que `fastapi.testclient` pour une simple question de commodité pour vous, développeur. Mais provient directement de Starlette.
!!! astuce
Si vous chercher tout de même à utiliser la foncion `async` dans vos test, à l'exeption denvoyer des requêtes à votre application FastAPI (par exemple, des fonctions de base de données asynchrones), jetez un coup dœil aux [Tests asynchrones (en)](../advanced/async-tests.md) {.internal-link target=_blank} dans le tutoriel avancé.
## tests séparé
Dans une application réelle, vous auriez probablement vos tests dans un fichier différent.
Et votre application **FastAPI** peut également être composée de plusieurs fichiers/modules, etc.
### fichier app de **FastAPI**
disons que vous ayez une structure de fichier comme décrit dans [application de grande taille (en)](./bigger-applications.md) {.internal-link target=_blank}:
```
.
├── app
│   ├── __init__.py
│   └── main.py
```
dans le fichier `main.py` vous avez votre application **FastAPI** :
```Python
{!../../../docs_src/app_testing/main.py!}
```
### fichier de test
Ensuite, vous pourriez avoir un fichier `test_main.py` avec vos tests. Il pourrait se trouver sur le même paquet Python (le même dossier avec un fichier `__init__.py`):
```
.
├── app
│   ├── __init__.py
│   ├── main.py
│  └── test_main.py
```
Comme ce fichier se trouve dans le même package, vous pouvez utiliser des importations relatives pour importer lobjet `app` à partir du module `main` (`main.py`):
```Python
{!../../../docs_src/app_testing/test_main.py!}
```
...et obtenir le code pour les tests comme avant.
## Test: exemple supplémentaire
Allons plus loin dans cet exemple et ajoutons plus de détails pour voir comment tester différentes pièces.
### fichier app étendu de **FastAPI**
Continuons avec la même structure de fichier que tout à l'heure:
```
.
├── app
│   ├── __init__.py
│   ├── main.py
│   └── test_main.py
```
Supposons que maintenant le fichier `main.py` avec votre application **FastAPI** a dautres **opérations sur chemin d'accès**.
Il dispose dune opération `GET` qui pourrait renvoyer une erreur.
Et dispose dune opération `POST` qui peut renvoyer plusieurs erreurs.
Les deux *opérations sur chemin d'accès* nécessitent un en-tête `X-Token`.
=== "Python 3.10+"
```Python
{!> ../../../docs_src/app_testing/app_b_an_py310/main.py!}
```
=== "Python 3.9+"
```Python
{!> ../../../docs_src/app_testing/app_b_an_py39/main.py!}
```
=== "Python 3.8+"
```Python
{!> ../../../docs_src/app_testing/app_b_an/main.py!}
```
=== "Python 3.10+ non annoté"
!!! astuce
Favoriser l'utilisation de la version `Annoté` si possible.
```Python
{!> ../../../docs_src/app_testing/app_b_py310/main.py!}
```
=== "Python 3.8+ non annoté"
!!! astuce
Favoriser l'utilisation de la version `Annoté` si possible.
```Python
{!> ../../../docs_src/app_testing/app_b/main.py!}
```
### fichier de test étendu
Vous pouvez mettre à jour `test_main.py` avec les tests étendus :
```Python
{!> ../../../docs_src/app_testing/app_b/test_main.py!}
```
Chaque fois que vous avez besoin que le client transmette des informations dans la requête et que vous ne savez pas comment le faire, vous pouvez rechercher (Google) comment comment si prendre dans `httpx`, ou même comment le faire avec `requests`, car la conception de HTTPX est basée sur la conception de Requests.
il vous suffit de faire la même chose dans vos tests.
ex. :
* Pour passer un paramètre *path* ou *query*, ajoutez-le à lURL directement.
* Pour passer une instance JSON, passez un objet Python (ex. un `dict`) au paramètre `json`.
* Si vous avez besoin denvoyer *Form Data* au lieu de JSON, utilisez le paramètre `data` à la place.
* Pour passer des *headers*, utilisez un `dict` dans le paramètre `headers`.
* Pour les *cookies*, un `dict` dans le paramètre `cookies`.
Pour plus dinformations sur la façon de passer des données au backend (en utilisant `httpx` ou `TestClient`), consultez la <a href="https://www.python-httpx.org" class="external-link" target="_blank">documentation HTTPX</a>.
!!! information
à otez que le `TestClient` reçoit des données qui peuvent être converties en JSON, et non en modèles Pydantic.
Si vous avez un modèle Pydantic dans votre test et que vous souhaitez envoyer ses données à lapplication pendant le test, vous pouvez utiliser le `jsonable_encoder` décrit dans [Encodeur compatible avec JSON](encoder.md){:internal-link target=_blank}.
## exécuter les tests
Maintenant, il vous suffit d'installer `pytest`:
<div class="termy">
```console
$ pip install pytest
---> 100%
```
</div>
Cela détectera automatiquement les fichiers et les tests, les exécutera et vous rapportera les résultats.
Exécutez les tests avec :
<div class="termy">
```console
$ pytest
================ test session starts ================
platform linux -- Python 3.6.9, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
rootdir: /home/user/code/superawesome-cli/app
plugins: forked-1.1.3, xdist-1.31.0, cov-2.8.1
collected 6 items
---> 100%
test_main.py <span style="color: green; white-space: pre;">...... [100%]</span>
<span style="color: green;">================= 1 passed in 0.03s =================</span>
```
</div>