From: 吴定焕 <108172295+wdh99@users.noreply.github.com> Date: Thu, 22 Jun 2023 16:16:06 +0000 (+0800) Subject: 🌐 Add Chinese translation for `docs/zh/docs/tutorial/testing.md` (#9641) X-Git-Tag: 0.98.0~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e17cacfee4fc039ad6f4524ac141fa55556f994d;p=thirdparty%2Ffastapi%2Ffastapi.git 🌐 Add Chinese translation for `docs/zh/docs/tutorial/testing.md` (#9641) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- diff --git a/docs/zh/docs/tutorial/testing.md b/docs/zh/docs/tutorial/testing.md new file mode 100644 index 0000000000..41f01f8d84 --- /dev/null +++ b/docs/zh/docs/tutorial/testing.md @@ -0,0 +1,212 @@ +# æµè¯ + +æè°¢ Starletteï¼æµè¯**FastAPI** åºç¨è½»æ¾åæå¿«ã + +å®åºäº HTTPXï¼ èHTTPX忝åºäºRequests设计çï¼æä»¥å¾ç¸ä¼¼ä¸ææã + +æäºå®ï¼ä½ å¯ä»¥ç´æ¥ä¸**FastAPI**ä¸èµ·ä½¿ç¨ pytestã + +## ä½¿ç¨ `TestClient` + +!!! ä¿¡æ¯ + è¦ä½¿ç¨ `TestClient`ï¼å è¦å®è£ `httpx`. + + ä¾ï¼`pip install httpx`. + +å¯¼å ¥ `TestClient`. + +éè¿ä¼ å ¥ä½ ç**FastAPI**åºç¨å建ä¸ä¸ª `TestClient` ã + +å建åå以 `test_` å¼å¤´ç彿°ï¼è¿æ¯æ åç `pytest` 约å®ï¼ã + +åä½¿ç¨ `httpx` 飿 ·ä½¿ç¨ `TestClient` 对象ã + +ä¸ºä½ éè¦æ£æ¥çå°æ¹ç¨æ åçPython表达å¼å个ç®åç `assert` è¯å¥ï¼éç³ï¼æ åç`pytest`ï¼ã + +```Python hl_lines="2 12 15-18" +{!../../../docs_src/app_testing/tutorial001.py!} +``` + +!!! æç¤º + æ³¨ææµè¯å½æ°æ¯æ®éç `def`ï¼ä¸æ¯ `async def`ã + + è¿æclientçè°ç¨ä¹æ¯æ®éçè°ç¨ï¼ä¸æ¯ç¨ `await`ã + + è¿è®©ä½ å¯ä»¥ç´æ¥ä½¿ç¨ `pytest` èä¸ä¼éå°éº»ç¦ã + +!!! note "ææ¯ç»è" + ä½ ä¹å¯ä»¥ç¨ `from starlette.testclient import TestClient`ã + + **FastAPI** æä¾äºå `starlette.testclient` 䏿 ·ç `fastapi.testclient`ï¼åªæ¯ä¸ºäºæ¹ä¾¿å¼åè ãä½å®ç´æ¥æ¥èªStarletteã + +!!! æç¤º + é¤äºåé请æ±ä¹å¤ï¼å¦æä½ è¿æ³æµè¯æ¶å¨FastAPIåºç¨ä¸è°ç¨ `async` 彿°ï¼ä¾å¦å¼æ¥æ°æ®åºå½æ°ï¼ï¼ å¯ä»¥å¨é«çº§æç¨ä¸çä¸ [Async Tests](../advanced/async-tests.md){.internal-link target=_blank} ã + +## å离æµè¯ + +å¨å®é åºç¨ä¸ï¼ä½ å¯è½ä¼æä½ çæµè¯æ¾å¨å¦ä¸ä¸ªæä»¶éã + +æ¨ç**FastAPI**åºç¨ç¨åºä¹å¯è½ç±ä¸äºæä»¶/模åç»æççã + +### **FastAPI** app æä»¶ + +åè®¾ä½ æä¸ä¸ªå [æ´å¤§çåºç¨](./bigger-applications.md){.internal-link target=_blank} 䏿æè¿°çæä»¶ç»æ: + +``` +. +âââ app +â  âââ __init__.py +â  âââ main.py +``` + +å¨ `main.py` æä»¶ä¸ä½ æä¸ä¸ª **FastAPI** app: + + +```Python +{!../../../docs_src/app_testing/main.py!} +``` + +### æµè¯æä»¶ + +ç¶åä½ ä¼æä¸ä¸ªå 嫿µè¯çæä»¶ `test_main.py` ãappå¯ä»¥åPythonå 飿 ·åå¨ï¼ä¸æ ·æ¯ç®å½ï¼ä½æä¸ª `__init__.py` æä»¶ï¼ï¼ + +``` hl_lines="5" +. +âââ app +â  âââ __init__.py +â  âââ main.py +â  âââ test_main.py +``` + +å ä¸ºè¿æä»¶å¨åä¸ä¸ªå ä¸ï¼æä»¥ä½ å¯ä»¥éè¿ç¸å¯¹å¯¼å ¥ä» `main` 模åï¼`main.py`ï¼å¯¼å ¥`app`å¯¹è±¡ï¼ + +```Python hl_lines="3" +{!../../../docs_src/app_testing/test_main.py!} +``` + +...ç¶åæµè¯ä»£ç åä¹å䏿 ·çã + +## æµè¯ï¼æ©å±ç¤ºä¾ + +ç°å¨è®©æä»¬æ©å±è¿ä¸ªä¾åï¼å¹¶æ·»å æ´å¤ç»èï¼çä¸å¦ä½æµè¯ä¸åé¨åã + +### æ©å±åç **FastAPI** app æä»¶ + +让æä»¬ç»§ç»ä¹åçæä»¶ç»æï¼ + +``` +. +âââ app +â  âââ __init__.py +â  âââ main.py +â  âââ test_main.py +``` + +å设ç°å¨å å«**FastAPI** appçæä»¶ `main.py` æäºå ¶ä»**è·¯å¾æä½**ã + +æä¸ª `GET` æä½ä¼è¿åé误ã + +æä¸ª `POST` æä½ä¼è¿åä¸äºé误ã + +ææ*è·¯å¾æä½* é½éè¦ä¸ä¸ª`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.6+" + + ```Python + {!> ../../../docs_src/app_testing/app_b_an/main.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python + {!> ../../../docs_src/app_testing/app_b_py310/main.py!} + ``` + +=== "Python 3.6+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python + {!> ../../../docs_src/app_testing/app_b/main.py!} + ``` + +### æ©å±åçæµè¯æä»¶ + +ç¶åæ¨å¯ä»¥ä½¿ç¨æ©å±åçæµè¯æ´æ°`test_main.py`ï¼ + +```Python +{!> ../../../docs_src/app_testing/app_b/test_main.py!} +``` + +æ¯å½ä½ éè¦å®¢æ·ç«¯å¨è¯·æ±ä¸ä¼ éä¿¡æ¯ï¼ä½ä½ ä¸ç¥éå¦ä½ä¼ éæ¶ï¼ä½ å¯ä»¥éè¿æç´¢ï¼è°·æï¼å¦ä½ç¨ `httpx`åï¼æè æ¯ç¨ `requests` åï¼æ¯ç«HTTPXç设计æ¯åºäºRequestsç设计çã + +æ¥çåªé卿µè¯ä¸åæ ·æä½ã + +示ä¾ï¼ + +* ä¼ ä¸ä¸ª*è·¯å¾* æ*æ¥è¯¢* åæ°ï¼æ·»å å°URLä¸ã +* ä¼ ä¸ä¸ªJSONä½ï¼ä¼ ä¸ä¸ªPython对象(ä¾å¦ä¸ä¸ª`dict`)å°åæ° `json`ã +* å¦æä½ éè¦åé *Form Data* è䏿¯ JSONï¼ä½¿ç¨ `data` åæ°ã +* è¦åé *headers*ï¼ä¼ `dict` ç» `headers` åæ°ã +* å¯¹äº *cookies*ï¼ä¼ `dict` ç» `cookies` åæ°ã + +å ³äºå¦ä½ä¼ æ°æ®ç»åç«¯çæ´å¤ä¿¡æ¯ (使ç¨`httpx` æ `TestClient`)ï¼è¯·æ¥é HTTPX ææ¡£. + +!!! ä¿¡æ¯ + 注æ `TestClient` æ¥æ¶å¯ä»¥è¢«è½¬å为JSONçæ°æ®ï¼è䏿¯Pydantic模åã + + å¦æä½ å¨æµè¯ä¸æä¸ä¸ªPydantic模åï¼å¹¶ä¸ä½ æ³å¨æµè¯æ¶åéå®çæ°æ®ç»åºç¨ï¼ä½ å¯ä»¥ä½¿ç¨å¨[JSON Compatible Encoder](encoder.md){.internal-link target=_blank}ä»ç»ç`jsonable_encoder` ã + +## è¿è¡èµ·æ¥ + +ä¹åï¼ä½ åªéè¦å®è£ `pytest`: + +