mirror of https://github.com/tiangolo/fastapi.git
🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/testing.md` (#13371)
Co-authored-by: Valentyn Druzhynin <v.druzhynin@zakaz.global> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Rostyslav <rostik1410@users.noreply.github.com> Co-authored-by: Sofie Van Landeghem <svlandeg@users.noreply.github.com>
This commit is contained in:
parent
b78887f3d3
commit
29d3739bcf
|
|
@ -0,0 +1,240 @@
|
|||
# Тестування
|
||||
|
||||
Тестування **FastAPI** додатків є простим та ефективним завдяки бібліотеці <a href="https://www.starlette.io/testclient/" class="external-link" target="_blank">Starlette</a>, яка базується на <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>.
|
||||
Оскільки HTTPX розроблений на основі Requests, його API є інтуїтивно зрозумілим для тих, хто вже знайомий з Requests.
|
||||
|
||||
З його допомогою Ви можете використовувати <a href="https://docs.pytest.org/" class="external-link" target="_blank">pytest</a> безпосередньо з **FastAPI**.
|
||||
|
||||
## Використання `TestClient`
|
||||
|
||||
/// info | Інформація
|
||||
|
||||
Щоб використовувати `TestClient`, спочатку встановіть <a href="https://www.python-httpx.org" class="external-link" target="_blank">`httpx`</a>.
|
||||
|
||||
Переконайтеся, що Ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили саму бібліотеку, наприклад:
|
||||
|
||||
```console
|
||||
$ pip install httpx
|
||||
```
|
||||
|
||||
///
|
||||
|
||||
Імпортуйте `TestClient`.
|
||||
|
||||
Створіть `TestClient`, передавши йому Ваш застосунок **FastAPI**.
|
||||
|
||||
Створюйте функції з іменами, що починаються з `test_` (це стандартна угода для `pytest`).
|
||||
|
||||
Використовуйте об'єкт `TestClient` так само як і `httpx`.
|
||||
|
||||
Записуйте прості `assert`-вирази зі стандартними виразами Python, які потрібно перевірити (це також стандарт для `pytest`).
|
||||
|
||||
{* ../../docs_src/app_testing/tutorial001.py hl[2,12,15:18] *}
|
||||
|
||||
|
||||
/// tip | Порада
|
||||
|
||||
Зверніть увагу, що тестові функції — це звичайні `def`, а не `async def`.
|
||||
|
||||
Виклики клієнта також звичайні, без використання `await`.
|
||||
|
||||
Це дозволяє використовувати `pytest` без зайвих ускладнень.
|
||||
|
||||
///
|
||||
|
||||
/// note | Технічні деталі
|
||||
|
||||
Ви також можете використовувати `from starlette.testclient import TestClient`.
|
||||
|
||||
**FastAPI** надає той самий `starlette.testclient` під назвою `fastapi.testclient` для зручності розробників, але він безпосередньо походить із Starlette.
|
||||
|
||||
///
|
||||
|
||||
/// tip | Порада
|
||||
|
||||
Якщо Вам потрібно викликати `async`-функції у ваших тестах, окрім відправлення запитів до FastAPI-застосунку (наприклад, асинхронні функції роботи з базою даних), перегляньте [Асинхронні тести](../advanced/async-tests.md){.internal-link target=_blank} у розширеному керівництві.
|
||||
|
||||
///
|
||||
|
||||
## Розділення тестів
|
||||
|
||||
У реальному застосунку Ваші тести, ймовірно, будуть в окремому файлі.
|
||||
|
||||
Також Ваш **FastAPI**-застосунок може складатися з кількох файлів або модулів тощо.
|
||||
|
||||
### Файл застосунку **FastAPI**
|
||||
|
||||
Припустимо, у Вас є структура файлів, описана в розділі [Більші застосунки](bigger-applications.md){.internal-link target=_blank}:
|
||||
|
||||
```
|
||||
.
|
||||
├── app
|
||||
│ ├── __init__.py
|
||||
│ └── main.py
|
||||
```
|
||||
У файлі `main.py` знаходиться Ваш застосунок **FastAPI** :
|
||||
|
||||
{* ../../docs_src/app_testing/main.py *}
|
||||
|
||||
### Файл тестування
|
||||
|
||||
Ви можете створити файл `test_main.py` з Вашими тестами. Він може знаходитися в тому ж пакеті Python (у тій самій директорії з файлом `__init__.py`):
|
||||
|
||||
|
||||
``` hl_lines="5"
|
||||
.
|
||||
├── app
|
||||
│ ├── __init__.py
|
||||
│ ├── main.py
|
||||
│ └── test_main.py
|
||||
```
|
||||
|
||||
Оскільки цей файл знаходиться в тому ж пакеті, Ви можете використовувати відносний імпорт, щоб імпортувати об'єкт `app` із модуля `main` (`main.py`):
|
||||
|
||||
{* ../../docs_src/app_testing/test_main.py hl[3] *}
|
||||
|
||||
|
||||
...і написати код для тестів так само як і раніше.
|
||||
|
||||
## Тестування: розширений приклад
|
||||
|
||||
Тепер розширимо цей приклад і додамо більше деталей, щоб побачити, як тестувати різні частини.
|
||||
|
||||
### Розширений файл застосунку **FastAPI**
|
||||
|
||||
Залишимо ту саму структуру файлів:
|
||||
|
||||
```
|
||||
.
|
||||
├── app
|
||||
│ ├── __init__.py
|
||||
│ ├── main.py
|
||||
│ └── test_main.py
|
||||
```
|
||||
|
||||
Припустимо, що тепер файл `main.py` із Вашим **FastAPI**-застосунком містить додаткові операції шляху (**path operations**).
|
||||
|
||||
Він має `GET`-операцію, яка може повертати помилку.
|
||||
|
||||
Він має `POST`-операцію, яка може повертати кілька помилок.
|
||||
|
||||
Обидві операції шляху вимагають заголовок `X-Token`.
|
||||
|
||||
//// tab | Python 3.10+
|
||||
|
||||
```Python
|
||||
{!> ../../docs_src/app_testing/app_b_an_py310/main.py!}
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
//// tab | Python 3.9+
|
||||
|
||||
```Python
|
||||
{!> ../../docs_src/app_testing/app_b_an_py39/main.py!}
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
//// tab | Python 3.8+
|
||||
|
||||
```Python
|
||||
{!> ../../docs_src/app_testing/app_b_an/main.py!}
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
//// tab | Python 3.10+ non-Annotated
|
||||
|
||||
/// tip | Порада
|
||||
|
||||
Бажано використовувати версію з `Annotated`, якщо це можливо
|
||||
|
||||
///
|
||||
|
||||
```Python
|
||||
{!> ../../docs_src/app_testing/app_b_py310/main.py!}
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
//// tab | Python 3.8+ non-Annotated
|
||||
|
||||
/// tip | Порада
|
||||
|
||||
Бажано використовувати версію з `Annotated`, якщо це можливо
|
||||
|
||||
///
|
||||
|
||||
```Python
|
||||
{!> ../../docs_src/app_testing/app_b/main.py!}
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
### Розширений тестовий файл
|
||||
|
||||
Потім Ви можете оновити `test_main.py`, додавши розширені тести:
|
||||
|
||||
{* ../../docs_src/app_testing/app_b/test_main.py *}
|
||||
|
||||
Коли Вам потрібно передати клієнту інформацію в запиті, але Ви не знаєте, як це зробити, Ви можете пошукати (наприклад, у Google) спосіб реалізації в `httpx`, або навіть у `requests`, оскільки HTTPX розроблений на основі дизайну Requests.
|
||||
|
||||
Далі Ви просто повторюєте ці ж дії у ваших тестах.
|
||||
|
||||
Наприклад:
|
||||
|
||||
* Щоб передати *path* або *query* параметр, додайте його безпосередньо до URL.
|
||||
* Щоб передати тіло JSON, передайте Python-об'єкт (наприклад, `dict`) у параметр `json`.
|
||||
* Якщо потрібно надіслати *Form Data* замість JSON, використовуйте параметр `data`.
|
||||
* Щоб передати заголовки *headers*, використовуйте `dict` у параметрі `headers`.
|
||||
* Для *cookies* використовуйте `dict` у параметрі `cookies`.
|
||||
|
||||
Докладніше про передачу даних у бекенд (за допомогою `httpx` або `TestClient`) можна знайти в <a href="https://www.python-httpx.org" class="external-link" target="_blank">документації HTTPX</a>.
|
||||
|
||||
/// info | Інформація
|
||||
|
||||
Зверніть увагу, що `TestClient` отримує дані, які можна конвертувати в JSON, а не Pydantic-моделі.
|
||||
Якщо у Вас є Pydantic-модель у тесті, і Ви хочете передати її дані в додаток під час тестування, Ви можете використати `jsonable_encoder`, описаний у розділі [JSON Compatible Encoder](encoder.md){.internal-link target=_blank}.
|
||||
|
||||
///
|
||||
|
||||
## Запуск тестів
|
||||
|
||||
Після цього вам потрібно встановити `pytest`.
|
||||
|
||||
Переконайтеся, що Ви створили [віртуальне середовище]{.internal-link target=_blank}, активували його і встановили необхідні пакети, наприклад:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ pip install pytest
|
||||
|
||||
---> 100%
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
`pytest` автоматично знайде файли з тестами, виконає їх і надасть вам результати.
|
||||
|
||||
Запустіть тести за допомогою:
|
||||
|
||||
<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>
|
||||
Loading…
Reference in New Issue