# ๐Ÿ”ฌ ๐Ÿ‘ ๐Ÿ’ƒ, ๐Ÿ”ฌ **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`:
```console $ pip install pytest ---> 100% ```
โšซ๏ธ ๐Ÿ”œ ๐Ÿ” ๐Ÿ“ & ๐Ÿ’ฏ ๐Ÿ”, ๐Ÿ› ๏ธ ๐Ÿ‘ซ, & ๐Ÿ“„ ๐Ÿ ๐Ÿ”™ ๐Ÿ‘†. ๐Ÿƒ ๐Ÿ’ฏ โฎ๏ธ:
```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 ...... [100%] ================= 1 passed in 0.03s ================= ```