![[Python] pytestで環境変数を設定するときはfixtureでpatchするのがいい](https://images.weserv.nl/?url=https%3A%2F%2Fimages.ctfassets.net%2Fct0aopd36mqt%2Fwp-thumbnail-a873a00568e5285b2051ff6c5aae2c3d%2Ffebef60aecfe576a837a7efcb96625eb%2Fpython_icatch.png&q=12&output=webp&max-age=110)
[Python] pytestで環境変数を設定するときはfixtureでpatchするのがいい
こんにちは。サービス開発室の武田です。
pytestを使用してユニットテストをする上で、環境変数が必要になる場合があります。しかし間違った方法では正しくテストができません。
正しくない方法
os.environ
を使用して環境変数に値を設定しています。一見シンプルな方法ですが、これ以降のテストケースにもこの環境変数が引き継がれます。つまりユニットテストの 順序に依存 してしまいます。
import os
import pytest
@pytest.fixture(autouse=True)
def setup():
os.environ["TEST_CODE"] = "PY_TEST"
def test_main():
assert os.environ["TEST_CODE"] == "PY_TEST"
正しい方法
テストが実行順序に依存しないよう、各テスト終了後は設定済みの環境変数をクリアする必要があります。これによってテストの独立性が高くなり、他のテストに影響を受けなくなります。これには次のようにpatch
とyield
を組み合わせれば実現できます。
import os
from unittest.mock import patch
import pytest
@pytest.fixture(autouse=True)
def setup():
with patch.dict("os.environ", {"TEST_CODE": "PY_TEST"}):
yield
def test_main():
assert os.environ["TEST_CODE"] == "PY_TEST"
まとめ
ユニットテストには特有にテクニックがたくさんありますね。使いこなすことでいいテストが書けるでしょう。少しずつでも身に付けていきたいですね。