AnyIOを使用しているテストで、意図せずにasyncio
とtrio
の2つで動いてしまったテストがあったので、asyncio
だけにした時のメモ。
環境
- Python
- 3.11
- AnyIO
- 3.7.1
- Pytest
- 7.4.3
実装
conftest.py
に次の処理を入れると、asyncio
だけが動きます。
@pytest.fixture def anyio_backend(): return 'asyncio'
テストをAnyIOで動かすには
次のどちらかで動きます。
# 先頭で宣言する pytestmark = pytest.mark.anyio # または、メソッドごとに定義する @pytest.mark.anyio
備考
最新のpytest-asyncio
のライブラリを入れるだけで非同期処理のテストができるようになっています。
昔は上のようにpytestmark
の宣言だったり、デコレータで@pytest.mark.anyio
または@pytest.mark.asyncio
と定義する必要がありました。
ソースコード
conftest.py
から上の定義を削除すると、test_task.py
のテストが失敗するようになっています。
- https://github.com/hirotoKirimaru/fastapi-practice/blob/abbd5545042ef0ed5e8c162215316b496e97eb05/tests/conftest.py#L57
- https://github.com/hirotoKirimaru/fastapi-practice/blob/abbd5545042ef0ed5e8c162215316b496e97eb05/tests/scenario/test_task.py#L4
終わりに
FastAPIでは非同期処理をする際に内部処理でAnyIO
を使用しているので、テスト時にAnyIO
を使用するチュートリアルがあります。
チュートリアルにしたがってテストをすると意図せずにテストケースが2倍動いてしまっていました。処理自体は高速に動いているのでそこまで苦労しないのですが、テストケースが失敗する時に2倍失敗してしまうのでTDDが地味に面倒になっていました。
また地味に面倒なことに、dependencies
はtrio
に依存したライブラリはなかったのですが、dev-dependencies
でtrio
に依存したライブラリがあってローカルだけテスト数が2倍になってしまうということも発生していました。
地味ながら修正をしたことで日々の開発が便利になっています。
参考文献
- FastAPIの非同期テスト
- AnyIOのテスト