きり丸の技術日記

技術検証したり、資格等をここに残していきます。

AnyIOのテストをasyncioだけで動かす(asyncioとtrioの2倍動かないようにする)

AnyIOを使用しているテストで、意図せずにasynciotrioの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のテストが失敗するようになっています。

終わりに

FastAPIでは非同期処理をする際に内部処理でAnyIOを使用しているので、テスト時にAnyIOを使用するチュートリアルがあります。

チュートリアルにしたがってテストをすると意図せずにテストケースが2倍動いてしまっていました。処理自体は高速に動いているのでそこまで苦労しないのですが、テストケースが失敗する時に2倍失敗してしまうのでTDDが地味に面倒になっていました。

また地味に面倒なことに、dependenciestrioに依存したライブラリはなかったのですが、dev-dependenciestrioに依存したライブラリがあってローカルだけテスト数が2倍になってしまうということも発生していました。

地味ながら修正をしたことで日々の開発が便利になっています。

参考文献