]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🌐 Add Korean translation for `docs/ko/docs/tutorial/testing.md` (#12968)
authortimothy <53824764+jts8257@users.noreply.github.com>
Tue, 10 Dec 2024 11:24:48 +0000 (20:24 +0900)
committerGitHub <noreply@github.com>
Tue, 10 Dec 2024 11:24:48 +0000 (11:24 +0000)
docs/ko/docs/tutorial/testing.md [new file with mode: 0644]

diff --git a/docs/ko/docs/tutorial/testing.md b/docs/ko/docs/tutorial/testing.md
new file mode 100644 (file)
index 0000000..a483cbf
--- /dev/null
@@ -0,0 +1,243 @@
+# ν…ŒμŠ€νŒ…
+
+<a href="https://www.starlette.io/testclient/" class="external-link" target="_blank">Starlette</a> λ•뢄에 **FastAPI** λ₯Ό ν…ŒμŠ€νŠΈν•˜λŠ” μΌμ€ μ‰½κ³  μ¦κ±°μš΄ μΌμ΄ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
+
+StarletteλŠ” <a href="https://www.python-httpx.org\" class="external-link" target="_blank">HTTPX</a>λ₯Ό κΈ°λ°˜μœΌλ‘œ ν•˜λ©°, μ΄λŠ” Requestsλ₯Ό κΈ°λ°˜μœΌλ‘œ μ„€κ³„λ˜μ—ˆκΈ° λ•Œλ¬Έμ— λ§€μš° μΉœμˆ™ν•˜κ³  μ§κ΄€μ μž…λ‹ˆλ‹€.
+
+이λ₯Ό μ‚¬μš©ν•˜λ©΄ FastAPIμ—μ„œ <a href="https://docs.pytest.org/" class="external-link" target="_blank">pytest</a>λ₯Ό μ§μ ‘ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+## `TestClient` μ‚¬μš©ν•˜κΈ°
+
+/// info | μ •보
+
+`TestClient` μ‚¬μš©ν•˜λ €λ©΄, μš°μ„  <a href="https://www.python-httpx.org" class="external-link" target="_blank">`httpx`</a> λ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.
+
+[virtual environment](../virtual-environments.md){.internal-link target=_blank} λ₯Ό λ§Œλ“€κ³ , ν™œμ„±ν™” μ‹œν‚¨ λ’€μ— μ„€μΉ˜ν•˜μ„Έμš”. μ˜ˆμ‹œ:
+
+```console
+$ pip install httpx
+```
+
+///
+
+`TestClient` λ₯Ό μž„ν¬νŠΈν•˜μ„Έμš”.
+
+**FastAPI** μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ „λ‹¬ν•˜μ—¬ `TestClient` λ₯Ό λ§Œλ“œμ„Έμš”.
+
+이름이 `test_` λ‘œ μ‹œμž‘ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“œμ„Έμš”(`pytest` μ˜ ν‘œμ€€μ μΈ κ΄€λ‘€μž…λ‹ˆλ‹€).
+
+`httpx` λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒκ³Ό κ°™μ€ λ°©μ‹μœΌλ‘œ `TestClient` κ°μ²΄λ₯Ό μ‚¬μš©ν•˜μ„Έμš”.
+
+ν‘œμ€€μ μΈ νŒŒμ΄μ¬ λ¬Έλ²•을 μ΄μš©ν•˜μ—¬ ν™•인이 ν•„μš”ν•œ κ³³μ— κ°„λ‹¨ν•œ `assert` λ¬Έμž₯을 μž‘μ„±ν•˜μ„Έμš”(μ—­μ‹œ ν‘œμ€€μ μΈ `pytest` κ΄€λ‘€μž…λ‹ˆλ‹€).
+
+{* ../../docs_src/app_testing/tutorial001.py hl[2,12,15:18] *}
+
+/// tip | νŒ
+
+ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ ν•¨μˆ˜λŠ” `async def` κ°€ μ•„λ‹ˆλΌ `def` λ‘œ μž‘성됨에 μ£Όμ˜ν•˜μ„Έμš”.
+
+그리고 ν΄λΌμ΄μ–ΈνŠΈμ— λŒ€ν•œ ν˜ΈμΆœλ„ `await` λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μΌλ°˜ ν˜ΈμΆœμž…λ‹ˆλ‹€.
+
+μ΄λ ‡κ²Œ ν•˜μ—¬ λ³΅μž‘ν•œ κ³Όμ • μ—†μ΄ `pytest` λ₯Ό μ§μ ‘μ μœΌλ‘œ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+///
+
+/// note | κΈ°μˆ  μ„ΈλΆ€μ‚¬ν•­
+
+`from starlette.testclient import TestClient` μ—­μ‹œ μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+**FastAPI** λŠ” κ°œλ°œμžμ˜ νŽΈμ˜λ₯Ό μœ„ν•΄ `starlette.testclient` λ₯Ό `fastapi.testclient` λ‘œλ„ μ œκ³΅ν•  λΏμž…λ‹ˆλ‹€. μ΄λŠ” λ‹¨μ§€ `Starlette` μ—μ„œ μ§μ ‘ κ°€μ Έμ˜€λŠ”μ§€μ˜ μ°¨μ΄μΌ λΏμž…λ‹ˆλ‹€.
+
+///
+
+/// tip | νŒ
+
+FastAPI μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μš”청을 λ³΄λ‚΄λŠ” κ²ƒ μ™Έμ—λ„ ν…ŒμŠ€νŠΈμ—μ„œ `async` ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  μ‹Άλ‹€λ©΄ (예: λΉ„동기 λ°μ΄ν„°λ² μ΄μŠ€ ν•¨μˆ˜), μ‹¬ν™” νŠœν† λ¦¬μ–Όμ˜ [Async Tests](../advanced/async-tests.md){.internal-link target=_blank} λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.
+
+///
+
+## ν…ŒμŠ€νŠΈ λΆ„λ¦¬ν•˜κΈ°
+
+μ‹€μ œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” ν…ŒμŠ€νŠΈλ₯Ό λ³„λ„μ˜ νŒŒμΌλ‘œ λ‚˜λˆ„λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.
+
+
+그리고 **FastAPI** μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ„ μ—¬λŸ¬ νŒŒμΌμ΄λ‚˜ λͺ¨λ“ˆ λ“±μœΌλ‘œ κ΅¬μ„±λ  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+### **FastAPI** app νŒŒμΌ
+
+[Bigger Applications](bigger-applications.md){.internal-link target=_blank} μ— λ¬˜μ‚¬λœ νŒŒμΌ κ΅¬μ‘°λ₯Ό κ°€μ§€κ³  μžˆλŠ” κ²ƒμœΌλ‘œ κ°€μ •ν•΄λ΄…μ‹œλ‹€.
+
+```
+.
+β”œβ”€β”€ app
+β”‚Β Β  β”œβ”€β”€ __init__.py
+β”‚Β Β  β””── main.py
+```
+
+`main.py` νŒŒμΌ μ•ˆμ— **FastAPI** app μ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€:
+
+{* ../../docs_src/app_testing/main.py *}
+
+### ν…ŒμŠ€νŠΈ νŒŒμΌ
+
+ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ `test_main.py` λΌλŠ” νŒŒμΌμ„ μƒμ„±ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ΄ νŒŒμΌμ€ λ™μΌν•œ Python νŒ¨ν‚€μ§€(즉, `__init__.py` νŒŒμΌμ΄ μžˆλŠ” λ™μΌν•œ λ””렉터리)에 μœ„μΉ˜ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+``` hl_lines="5"
+.
+β”œβ”€β”€ app
+β”‚Β Β  β”œβ”€β”€ __init__.py
+β”‚Β Β  β”œβ”€β”€ main.py
+β”‚Β Β  β””── test_main.py
+```
+
+νŒŒμΌλ“€μ΄ λ™μΌν•œ νŒ¨ν‚€μ§€μ— μœ„μΉ˜ν•΄ μžˆμœΌλ―€λ‘œ, μƒλŒ€ μ°Έμ‘°λ₯Ό μ‚¬μš©ν•˜μ—¬ `main` μ—μ„œ `app` κ°μ²΄λ₯Ό μž„ν¬νŠΈ ν•΄μ˜¬ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+{* ../../docs_src/app_testing/test_main.py hl[3] *}
+
+
+...그리고 μ΄μ „에 μž‘μ„±ν–ˆλ˜ κ²ƒκ³Ό κ°™μ€ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+## ν…ŒμŠ€νŠΈ: ν™•μž₯된 μ˜ˆμ‹œ
+
+이제 μœ„μ˜ μ˜ˆμ‹œλ₯Ό ν™•μž₯ν•˜κ³  λ” λ§Žμ€ μ„ΈλΆ€ μ‚¬ν•­μ„ μΆ”κ°€ν•˜μ—¬ λ‹€μ–‘ν•œ λΆ€λΆ„을 μ–΄λ–»κ²Œ ν…ŒμŠ€νŠΈν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
+
+### ν™•μž₯된 FastAPI μ• ν”Œλ¦¬μΌ€μ΄μ…˜ νŒŒμΌ
+
+이전과 κ°™μ€ νŒŒμΌ κ΅¬μ‘°λ₯Ό κ³„속 μ‚¬μš©ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.
+
+```
+.
+β”œβ”€β”€ app
+β”‚Β Β  β”œβ”€β”€ __init__.py
+β”‚Β Β  β”œβ”€β”€ main.py
+β”‚Β Β  β””── test_main.py
+```
+
+이제 **FastAPI** μ•±μ΄ μžˆλŠ” `main.py` νŒŒμΌμ— λͺ‡ κ°€μ§€ λ‹€λ₯Έ **경둜 μž‘μ—…** μ΄ μΆ”κ°€λœ κ²½μš°λ₯Ό μƒκ°ν•΄λ΄…μ‹œλ‹€.
+
+단일 μ˜€λ₯˜λ₯Ό λ°˜ν™˜ν•  μˆ˜ μžˆλŠ” `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 *}
+
+
+ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”청에 μ •보λ₯Ό μ „달해야 ν•˜λŠ”λ° λ°©λ²•을 λͺ¨λ₯΄κ² λ‹€λ©΄, `httpx`μ—μ„œ ν•΄λ‹Ή μž‘업을 μˆ˜ν–‰ν•˜λŠ” λ°©λ²•을 κ²€μƒ‰(Google)ν•˜κ±°λ‚˜, `requests`μ—μ„œμ˜ λ°©λ²•을 κ²€μƒ‰ν•΄λ³΄μ„Έμš”. HTTPXλŠ” Requests의 λ””μžμΈμ„ κΈ°λ°˜μœΌλ‘œ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
+
+κ·Έ ν›„, ν…ŒμŠ€νŠΈμ—μ„œλ„ λ™μΌν•˜κ²Œ μ μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.
+
+μ˜ˆμ‹œ:
+
+* *경둜* ν˜Ήμ€ *쿼리* λ§€κ°œλ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜λ €λ©΄, URL μžμ²΄μ— μΆ”κ°€ν•œλ‹€.
+* JSON λ³Έλ¬Έμ„ μ „λ‹¬ν•˜λ €λ©΄, νŒŒμ΄μ¬ κ°μ²΄ (예λ₯Όλ“€λ©΄ `dict`) λ₯Ό `json` νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬ν•œλ‹€.
+* JSON λŒ€μ‹  *폼 λ°μ΄ν„°* λ₯Ό λ³΄λ‚΄μ•Όν•œλ‹€λ©΄, `data` νŒŒλΌλ―Έν„°λ₯Ό λŒ€μ‹  μ „λ‹¬ν•œλ‹€.
+* *헀더* λ₯Ό μ „λ‹¬ν•˜λ €λ©΄, `headers` νŒŒλΌλ―Έν„°μ— `dict` λ₯Ό μ „λ‹¬ν•œλ‹€.
+* *μΏ ν‚€* λ₯Ό μ „λ‹¬ν•˜λ €λ©΄, `cookies` νŒŒλΌλ―Έν„°μ— `dict` λ₯Ό μ „λ‹¬ν•œλ‹€.
+
+λ°±μ—”λ“œλ‘œ λ°μ΄ν„°λ₯Ό μ–΄λ–»κ²Œ λ³΄λ‚΄λŠ”μ§€ μ •보λ₯Ό λ” μ–»μœΌλ €λ©΄ (`httpx` ν˜Ήμ€ `TestClient` λ₯Ό μ΄μš©ν•΄μ„œ) <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX documentation</a> λ₯Ό ν™•μΈν•˜μ„Έμš”.
+
+/// info | μ •보
+
+`TestClient` λŠ” Pydantic λͺ¨λΈμ΄ μ•„λ‹ˆλΌ JSON μœΌλ‘œ λ³€ν™˜λ  μˆ˜ μžˆλŠ” λ°μ΄ν„°λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.
+
+λ§Œμ•½ ν…ŒμŠ€νŠΈμ€‘ Pydantic λͺ¨λΈμ„ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œμ— λ³΄λ‚΄κ³  μ‹Άλ‹€λ©΄, [JSON ν˜Έν™˜ κ°€λŠ₯ μΈμ½”더](encoder.md){.internal-link target=_blank} μ— μ„€λͺ…λ˜μ–΄ μžˆλŠ” `jsonable_encoder` λ₯Ό μ‚¬μš©ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.
+
+///
+
+## μ‹€ν–‰ν•˜κΈ°
+
+ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³ , `pytest` λ₯Ό μ„€μΉ˜ν•΄μ•Όν•©λ‹ˆλ‹€.
+
+[virtual environment](../virtual-environments.md){.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>