# ๐ฌ ๐ ๐, ๐ฌ **FastAPI** ๐ธ โฉ & ๐. โซ๏ธ โ๏ธ ๐ ๐ธ๐ฒ, โ ๐ ๐ โ๏ธ ๐ ๐จ, โซ๏ธ ๐ถ ๐ฐ & ๐๏ธ. โฎ๏ธ โซ๏ธ, ๐ ๐ช โ๏ธ โณ ๐ โฎ๏ธ **FastAPI**. ## โ๏ธ `TestClient` /// info โ๏ธ `TestClient`, ๐ฅ โ `httpx`. ๐คถ โ. `pip install httpx`. /// ๐ `TestClient`. โ `TestClient` ๐ถโโ๏ธ ๐ **FastAPI** ๐ธ โซ๏ธ. โ ๐ข โฎ๏ธ ๐ ๐ โถ๏ธ โฎ๏ธ `test_` (๐ ๐ฉ `pytest` ๐). โ๏ธ `TestClient` ๐ ๐ ๐ ๐ โฎ๏ธ `httpx`. โ ๐ `assert` ๐ โฎ๏ธ ๐ฉ ๐ ๐งฌ ๐ ๐ ๐ช โ (๐, ๐ฉ `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` ๐ช ๐, ๐ฉโ๐ป. โ๏ธ โซ๏ธ ๐ ๐ โช๏ธโก๏ธ ๐. /// /// tip ๐ฅ ๐ ๐ ๐ค `async` ๐ข ๐ ๐ฏ โ๏ธ โช๏ธโก๏ธ ๐จ ๐จ ๐ FastAPI ๐ธ (โ ๐ ๐ฝ ๐ข), โ๏ธ ๐ [๐ ๐ฏ](../advanced/async-tests.md){.internal-link target=_blank} ๐ง ๐ฐ. /// ## ๐ ๐ฏ ๐ฐ ๐ธ, ๐ ๐ฒ ๐ โ๏ธ ๐ ๐ฏ ๐ ๐. & ๐ **FastAPI** ๐ธ 5๏ธโฃ๐ โ ๐ ๐/๐น, โ๏ธ. ### **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` โฎ๏ธ ๐ ๐ฏ. โซ๏ธ ๐ช ๐ ๐ ๐ ๐ ๐ฆ (๐ ๐ โฎ๏ธ `__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** ๐ฑ โ๏ธ ๐ **โก ๐ ๏ธ**. โซ๏ธ โ๏ธ `GET` ๐ ๏ธ ๐ ๐ช ๐จ โ. โซ๏ธ โ๏ธ `POST` ๐ ๏ธ ๐ ๐ช ๐จ ๐ โ. ๐ฏโโ๏ธ *โก ๐ ๏ธ* ๐ `X-Token` ๐. {* ../../docs_src/app_testing/app_b/main.py *} ### โ ๐ฌ ๐ ๐ ๐ช โคด๏ธ โน `test_main.py` โฎ๏ธ โ ๐ฏ: {* ../../docs_src/app_testing/app_b/test_main.py *} ๐โ ๐ ๐ช ๐ฉโ๐ป ๐ถโโ๏ธ โน ๐จ & ๐ ๐ซ ๐ญ โ, ๐ ๐ช ๐ (๐บ๐ธ๐) โ โซ๏ธ `httpx`, โ๏ธ โ โซ๏ธ โฎ๏ธ `requests`, ๐ธ๐ฒ ๐ง โ๏ธ ๐ ๐จ' ๐ง. โคด๏ธ ๐ ๐ ๐ ๐ฏ. ๐คถ โ.: * ๐ถโโ๏ธ *โก* โ๏ธ *๐ข* ๐ข, ๐ฎ โซ๏ธ ๐ โซ๏ธ. * ๐ถโโ๏ธ ๐ป ๐ช, ๐ถโโ๏ธ ๐ ๐ (โ `dict`) ๐ข `json`. * ๐ฅ ๐ ๐ช ๐จ *๐จ ๐ฝ* โฉ๏ธ ๐ป, โ๏ธ `data` ๐ข โฉ๏ธ. * ๐ถโโ๏ธ *๐*, โ๏ธ `dict` `headers` ๐ข. * *๐ช*, `dict` `cookies` ๐ข. ๐ โน ๐ โ ๐ถโโ๏ธ ๐ฝ ๐ฉโ๐ป (โ๏ธ `httpx` โ๏ธ `TestClient`) โ ๐ธ๐ฒ ๐งพ. /// info ๐ ๐ `TestClient` ๐จ ๐ฝ ๐ ๐ช ๐ ๐ป, ๐ซ Pydantic ๐ท. ๐ฅ ๐ โ๏ธ Pydantic ๐ท ๐ ๐ฏ & ๐ ๐ ๐จ ๐ฎ ๐ฝ ๐ธ โฎ๏ธ ๐ฌ, ๐ ๐ช โ๏ธ `jsonable_encoder` ๐ฌ [๐ป ๐ ๐ข](encoder.md){.internal-link target=_blank}. /// ## ๐ โซ๏ธ โฎ๏ธ ๐, ๐ ๐ช โ `pytest`: