From: Vladislav Kramorenko <85196001+Xewus@users.noreply.github.com> Date: Mon, 8 May 2023 11:14:19 +0000 (+0300) Subject: 🌐 Add Russian translation for `docs/ru/docs/tutorial/testing.md` (#9403) X-Git-Tag: 0.95.2~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=928bb2e2ceee6722bf87d4f4e5b0b9ea3cd1f221;p=thirdparty%2Ffastapi%2Ffastapi.git 🌐 Add Russian translation for `docs/ru/docs/tutorial/testing.md` (#9403) Add Russian translation for docs/ru/docs/tutorial/testing.md --- diff --git a/docs/ru/docs/tutorial/testing.md b/docs/ru/docs/tutorial/testing.md new file mode 100644 index 0000000000..3f90051123 --- /dev/null +++ b/docs/ru/docs/tutorial/testing.md @@ -0,0 +1,212 @@ +# ТеÑÑиÑование + +ÐлагодаÑÑ Starlette, ÑеÑÑиÑоваÑÑ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ **FastAPI** легко и пÑиÑÑно. + +ТеÑÑиÑование оÑновано на библиоÑеке HTTPX, коÑоÑÐ°Ñ Ð² ÑÐ²Ð¾Ñ Ð¾ÑеÑÐµÐ´Ñ Ð¾Ñнована на библиоÑеке Requests, Ñак ÑÑо вÑе дейÑÑÐ²Ð¸Ñ Ð·Ð½Ð°ÐºÐ¾Ð¼Ñ Ð¸ инÑÑиÑивно понÑÑнÑ. + +ÐÑполÑзÑÑ ÑÑи инÑÑÑÑменÑÑ, ÐÑ Ð¼Ð¾Ð¶ÐµÑе напÑÑмÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвоваÑÑ pytest Ñ **FastAPI**. + +## ÐÑполÑзование клаÑÑа `TestClient` + +!!! info "ÐнÑоÑмаÑиÑ" + ÐÐ»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑа `TestClient` Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑÑÑановиÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ `httpx`. + + ÐапÑимеÑ, Ñак: `pip install httpx`. + +ÐмпоÑÑиÑÑйÑе `TestClient`. + +СоздайÑе обÑÐµÐºÑ `TestClient`, пеÑедав ÐµÐ¼Ñ Ð² каÑеÑÑве паÑамеÑÑа ÐаÑе пÑиложение **FastAPI**. + +СоздайÑе ÑÑнкÑиÑ, название коÑоÑой должно наÑинаÑÑÑÑ Ñ `test_` (ÑÑо ÑÑандаÑÑ Ð¸Ð· ÑоглаÑений `pytest`). + +ÐÑполÑзÑйÑе обÑÐµÐºÑ `TestClient` Ñак же, как ÐÑ Ð¸ÑполÑзÑеÑе `httpx`. + +ÐапиÑиÑе пÑоÑÑое ÑÑвеÑждение Ñ `assert` Ð´Ð°Ð±Ñ Ð¿ÑовеÑиÑÑ Ð¸ÑÑинноÑÑÑ Python-вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ (ÑÑо Ñоже ÑÑандаÑÑ `pytest`). + +```Python hl_lines="2 12 15-18" +{!../../../docs_src/app_testing/tutorial001.py!} +``` + +!!! tip "ÐодÑказка" + ÐбÑаÑиÑе внимание, ÑÑо ÑеÑÑиÑÑÑÑÐ°Ñ ÑÑнкÑÐ¸Ñ ÑвлÑеÑÑÑ Ð¾Ð±ÑÑной `def`, а не аÑÐ¸Ð½Ñ Ñонной `async def`. + + РвÑзов клиенÑа Ñакже оÑÑÑеÑÑвлÑеÑÑÑ Ð±ÐµÐ· `await`. + + ÐÑо позволÑÐµÑ Ð²Ð°Ð¼ иÑполÑзоваÑÑ `pytest` без лиÑÐ½Ð¸Ñ ÑÑложнений. + +!!! note "Ð¢ÐµÑ Ð½Ð¸ÑеÑкие деÑали" + Также можно напиÑаÑÑ `from starlette.testclient import TestClient`. + + **FastAPI** пÑедоÑÑавлÑÐµÑ ÑÐ¾Ñ Ð¶Ðµ ÑамÑй `starlette.testclient` как `fastapi.testclient`. ÐÑо вÑего лиÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑое ÑдобÑÑво Ð´Ð»Ñ ÐаÑ, как ÑазÑабоÑÑика. + +!!! tip "ÐодÑказка" + ÐÑли Ð´Ð»Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ðам, помимо запÑоÑов к пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ 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**: + + +```Python +{!../../../docs_src/app_testing/main.py!} +``` + +### Файл ÑеÑÑов + +Также Ñ ÐÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñайл `test_main.py` ÑодеÑжаÑий ÑеÑÑÑ. Ðожно ÑазмеÑÑиÑÑ ÑеÑÑовÑй Ñайл и Ñайл пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² одной диÑекÑоÑии (в диÑекÑоÑиÑÑ Ð´Ð»Ñ Python-кода желаÑелÑно ÑазмеÑаÑÑ Ð¸ Ñайл `__init__.py`): + +``` hl_lines="5" +. +âââ app +â  âââ __init__.py +â  âââ main.py +â  âââ test_main.py +``` + +Так как оба Ñайла Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð² одной диÑекÑоÑии, Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾ÑÑа обÑекÑа пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· Ñайла `main` в Ñайл `test_main` ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¾ÑноÑиÑелÑнÑй импоÑÑ: + +```Python hl_lines="3" +{!../../../docs_src/app_testing/test_main.py!} +``` + +...и пиÑаÑÑ Ð´Ð°Ð»ÑÑе ÑеÑÑÑ, как и ÑанÑÑе. + +## ТеÑÑиÑование: ÑаÑÑиÑеннÑй пÑÐ¸Ð¼ÐµÑ + +ТепеÑÑ Ð´Ð°Ð²Ð°Ð¹Ñе ÑаÑÑиÑим Ð½Ð°Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð¸ добавим деÑалей, ÑÑоб поÑмоÑÑеÑÑ, как ÑеÑÑиÑоваÑÑ ÑазлиÑнÑе ÑаÑÑи пÑиложениÑ. + +### РаÑÑиÑеннÑй Ñайл пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ **FastAPI** + +ÐÑ Ð¿Ñодолжим ÑабоÑÑ Ñ Ñой же Ñайловой ÑÑÑÑкÑÑÑой, ÑÑо и Ñанее: + +``` +. +âââ app +â  âââ __init__.py +â  âââ main.py +â  âââ test_main.py +``` + +ÐÑедположим, ÑÑо в Ñайле `main.py` Ñ Ð¿Ñиложением **FastAPI** еÑÑÑ Ð½ÐµÑколÑко **опеÑаÑий пÑÑи**. + +РнÑм опиÑана опеÑаÑÐ¸Ñ `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+ без Annotated" + + !!! tip "ÐодÑказка" + Ðо возможноÑÑи иÑполÑзÑйÑе веÑÑÐ¸Ñ Ñ `Annotated`. + + ```Python + {!> ../../../docs_src/app_testing/app_b_py310/main.py!} + ``` + +=== "Python 3.6+ без Annotated" + + !!! tip "ÐодÑказка" + Ðо возможноÑÑи иÑполÑзÑйÑе веÑÑÐ¸Ñ Ñ `Annotated`. + + ```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. + +ÐаÑем ÐÑ Ð¿ÑоÑÑо пÑименÑеÑе найденнÑе оÑвеÑÑ Ð² ÑеÑÑÐ°Ñ . + +ÐапÑимеÑ: + +* ÐеÑедаÑÑе *path*-паÑамеÑÑÑ Ð¸Ð»Ð¸ *query*-паÑамеÑÑÑ, впиÑав Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно в ÑÑÑÐ¾ÐºÑ URL. +* ÐеÑедаÑÑе JSON в Ñеле запÑоÑа, пеÑедав Python-обÑÐµÐºÑ (напÑимеÑ: `dict`) ÑеÑез именованнÑй паÑамеÑÑ `json`. +* ÐÑли же Ðам Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ оÑпÑавиÑÑ *ÑоÑÐ¼Ñ Ñ Ð´Ð°Ð½Ð½Ñми* вмеÑÑо JSON, Ñо иÑполÑзÑйÑе паÑамеÑÑ `data` вмеÑÑо `json`. +* ÐÐ»Ñ Ð¿ÐµÑедаÑи *заголовков*, пеÑедайÑе обÑÐµÐºÑ `dict` ÑеÑез паÑамеÑÑ `headers`. +* ÐÐ»Ñ Ð¿ÐµÑедаÑи *cookies* Ñакже пеÑедайÑе `dict`, но ÑеÑез паÑамеÑÑ `cookies`. + +ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии о пеÑедаÑе даннÑÑ Ð½Ð° бÑкенд Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ `httpx` или `TestClient` ознакомÑÑеÑÑ Ñ Ð´Ð¾ÐºÑменÑаÑией HTTPX. + +!!! info "ÐнÑоÑмаÑиÑ" + ÐбÑаÑиÑе внимание, ÑÑо `TestClient` пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñе, коÑоÑÑе можно конвеÑÑиÑоваÑÑ Ð² JSON, но не модели Pydantic. + + ÐÑли в ÐаÑÐ¸Ñ ÑеÑÑÐ°Ñ ÐµÑÑÑ Ð¼Ð¾Ð´ÐµÐ»Ð¸ Pydantic и ÐÑ Ñ Ð¾ÑиÑе оÑпÑавиÑÑ Ð¸Ñ Ð² ÑеÑÑиÑÑемое пÑиложение, Ñо можеÑе иÑполÑзоваÑÑ ÑÑнкÑÐ¸Ñ `jsonable_encoder`, опиÑаннÑÑ Ð½Ð° ÑÑÑаниÑе [ÐодиÑовÑик ÑовмеÑÑимÑй Ñ JSON](encoder.md){.internal-link target=_blank}. + +## ÐапÑÑк ÑеÑÑов + +Ðалее Ðам нÑжно ÑÑÑановиÑÑ `pytest`: + +