From f97160f95715c54248c461e3ca6bc5f7bd2a3d3f Mon Sep 17 00:00:00 2001 From: devil-works Date: Mon, 30 Jun 2025 18:36:37 +0900 Subject: [PATCH 1/3] Add Japanese translation for async-tests.md --- docs/ja/docs/advanced/async-tests.md | 101 +++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 docs/ja/docs/advanced/async-tests.md diff --git a/docs/ja/docs/advanced/async-tests.md b/docs/ja/docs/advanced/async-tests.md new file mode 100644 index 000000000..a15123ed2 --- /dev/null +++ b/docs/ja/docs/advanced/async-tests.md @@ -0,0 +1,101 @@ +# 非同期テスト + +前の章では`TestClient` を使ってFastAPIアプリをテストする方法を見てきたと思いますが、これまでは `async` を使わない同期的なテストのみでした。 + +しかし、テストで非同期関数を使えると便利なケースがあります。 +たとえば、データベースに非同期でクエリする場合を考えてみましょう。 +FastAPIアプリにリクエストを送り、非同期データベースライブラリを使って正しくデータが保存されたか確認したいときがあるかと思います。 + +さっそくですが、これを実現する方法を見ていきましょう。 + +## pytest.mark.anyio + +テストで非同期関数を呼び出したい場合、テスト関数自体も非同期である必要があります。 +AnyIO はそのための便利なプラグインを提供しており、特定のテスト関数を非同期で実行できるようにします。 + +## HTTPX + +FastAPIアプリケーションが`async def`ではなく通常の`def`関数を使用していても、内部的には非同期アプリケーションのままです。 + +`TestClient` は、標準の pytest を使用して通常の `def` テスト関数内で非同期 FastAPI アプリケーションを呼び出すために内部でマジックをしてくれますが、非同期関数内で使用する場合は、このマジックはもはや機能しません。 + +`TestClient` は HTTPX をベースとしており、幸い、これを直接使用して API をテストできます。 + +## 例 + +簡単な例として、[Bigger Applications](../tutorial/bigger-applications.md){.internal-link target=_blank} および [Testing](../ja/tutorial/testing.md){.internal-link target=_blank} で説明されているのと似たファイル構成で考えてみましょう。 + +``` +. +├── app +│   ├── __init__.py +│   ├── main.py +│   └── test_main.py +``` + +ファイル `main.py` には以下の内容が含まれます: + +{* ../../docs_src/async_tests/main.py *} + +ファイル `test_main.py` には `main.py` のテストが含まれ、現在は次のようになっています: + +{* ../../docs_src/async_tests/test_main.py *} + +## 実行方法 + +通常通り、以下のようにテストを実行できます: + +
+ +```console +$ pytest + +---> 100% +``` + +
+ +## 詳細 + +マーカー @pytest.mark.anyio は、このテスト関数を非同期で実行するよう pytest に指示します: + +{* ../../docs_src/async_tests/test_main.py hl[7] *} + +/// tip | 豆知識 + +テスト関数が、以前の TestClient 使用時の通常の `def` ではなく、`async def` で定義されていることに注意してください。 + +/// + +次に、アプリケーションとともに `AsyncClient` を作成し、`await` を使って非同期にリクエストを送信できます。 + +{* ../../docs_src/async_tests/test_main.py hl[9:12] *} + +上記のコードは、次のようなコードと同等です: + +```Python +response = client.get('/') +``` + +/// tip | 豆知識 + +新しい AsyncClient では async/await を使用していることに注意してください。リクエストは非同期で行われています。 + +/// + +/// warning | 注意 + +もしアプリケーションが Lifespan イベントに依存している場合、AsyncClient はこれらのイベントをトリガーしません。 +イベントを確実に発火させるには、`LifespanManager` の florimondmanca/asgi-lifespanを使用してください。 + +/// + +## その他の非同期関数の呼び出し + +テスト関数が非同期になったことで、FastAPIアプリへのリクエスト送信以外にも、テスト内で他の非同期関数を呼び出し(`await`)できるようになりました。これはコードの他の部分で非同期関数を呼び出すのと全く同じです。 + +/// tip | 豆知識 + +テストで非同期関数呼び出しを統合する際に `RuntimeError: Task attached to a different loop` に遭遇した場合(例:MongoDB の MotorClient を使用する場合)、イベントループが必要なオブジェクトは非同期関数内でのみインスタンス化する必要があることに注意してください。 例として、`@app.on_event("startup")` コールバック内でのインスタンス化が推奨されます。 + +/// From 6b46f717130528d32b2e7a6fdb0be164f1602348 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 30 Jun 2025 10:07:53 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20for?= =?UTF-8?q?mat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ja/docs/advanced/async-tests.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ja/docs/advanced/async-tests.md b/docs/ja/docs/advanced/async-tests.md index a15123ed2..99196d5e1 100644 --- a/docs/ja/docs/advanced/async-tests.md +++ b/docs/ja/docs/advanced/async-tests.md @@ -17,7 +17,7 @@ AnyIO はそのための便利なプラグインを提供しており、特定 FastAPIアプリケーションが`async def`ではなく通常の`def`関数を使用していても、内部的には非同期アプリケーションのままです。 -`TestClient` は、標準の pytest を使用して通常の `def` テスト関数内で非同期 FastAPI アプリケーションを呼び出すために内部でマジックをしてくれますが、非同期関数内で使用する場合は、このマジックはもはや機能しません。 +`TestClient` は、標準の pytest を使用して通常の `def` テスト関数内で非同期 FastAPI アプリケーションを呼び出すために内部でマジックをしてくれますが、非同期関数内で使用する場合は、このマジックはもはや機能しません。 `TestClient` は HTTPX をベースとしており、幸い、これを直接使用して API をテストできます。 From 695e8c7fa1e5d0f3f71093a4f0ed9ced08f1f978 Mon Sep 17 00:00:00 2001 From: devil-works Date: Wed, 2 Jul 2025 02:05:14 +0900 Subject: [PATCH 3/3] fix: Implemented review feedback fixes on PR branch docs/translate-advanced-async-tests-ja --- docs/ja/docs/advanced/async-tests.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ja/docs/advanced/async-tests.md b/docs/ja/docs/advanced/async-tests.md index 99196d5e1..839cf0ade 100644 --- a/docs/ja/docs/advanced/async-tests.md +++ b/docs/ja/docs/advanced/async-tests.md @@ -4,9 +4,9 @@ しかし、テストで非同期関数を使えると便利なケースがあります。 たとえば、データベースに非同期でクエリする場合を考えてみましょう。 -FastAPIアプリにリクエストを送り、非同期データベースライブラリを使って正しくデータが保存されたか確認したいときがあるかと思います。 +FastAPIアプリにリクエストを送り、非同期データベースライブラリを使って正しくデータが保存されたか確認したい場合があると思います。 -さっそくですが、これを実現する方法を見ていきましょう。 +早速ですが、これを実現する方法を見ていきましょう。 ## pytest.mark.anyio