【Python】globalで環境変数を呼ぶことの罪
環境変数をglobalで読むコードを書く人がいるが、私はそれに関して完全にアンチである
環境変数をglobalで読むことで生まれる被害
import
しただけで評価されるので使ってなくても要求される- 忘れがちで、2度手間を生む
- テストが冗長になる(環境変数にあることがテストできるわけではないのに環境変数を読むためのコードが必要になる)
- 書き換えると他のテストに影響を出す可能性がある
どれも小手先(環境でif分岐したり、環境変数を戻したり)でどうにかできる被害かもしれない。
でも塵が積もると山になって、単体テストのモチベーションを下げ、テストをやらなくなるのだ
じゃあどうするの?
ケースによるが僕ならたとえばこうする
class Hoge: def __init__(self, a, b): ... @staticmethod def from_env() -> Hoge: _a = os.environ[...] _b = os.environ[...] return Hoge(_a, _b)
from_envのようなメソッドを作成してその中で読む
こうすることで、単体テストの範囲では、環境変数が不要になる。
from_envをmockにしてしまうことも可能である
環境変数に入っているかという観点のテストは?
p.s. クラス変数の初期化で代入するのも同じ罪です。いつその環境変数を読むコードが評価されるのかを考えましょう