Djangoやってると、settingsを本番環境用とか開発環境用とかローカル環境用とかそれぞれ分けて、そこに環境変数を定義する、というケースがあったりする。
んで、本番環境では DEBUG=False
にして、他の環境では DEBUG=True
にしていることが多いと思う。
大抵の場合、それで問題が起こることはないのだが、Djangoの仕様でテスト実行の際はDEBUG=False
を記述しているsettingsファイルを利用して実行したとしても、DEBUG=True
に切り替わってしまう。
これによって引き起こる問題とは
from django.conf import settings
hoge = 'hoge'
if settings.DEBUG:
hoge = 'fuga'
みたいなコードを書いている場合に想定外のことが発生してしまう。
例えば、環境によって外部APIにリクエストを送る際に、本番用と開発用でトークンとかエンドポイントを分けているケースでこのような条件分岐をしていると、テスト実行で本番用のAPIにリクエストを送ってしまうという事故が発生する。(そういう場合だとそもそも mock とか使えって話だが)
解決方法としては以下の3つがパッと思いつく。
1. setup()
でsettings.DEBUGをオーバーライドする
一番単純な方法
class HogehogeTestCase(TestCase):
def setUp(self):
settings.DEBUG = True
こうしておくと、テスト実行を DEBUG = True
で行うことができる
2.そもそも if settings.DEBUG
みたいなことを書かない
これが一番良いと思う。
わざわざ、settingsを環境用に分けているのであれば
HOGE = 'hoge'
HOGE = 'fuga'
のようにsettings内で環境変数を定義して以下のように呼び出せばいい
from django.conf import settings
hoge = settings.HOGE
3. --debug-mode
のオプションを付けてテスト実行する
[Django]DjangoのテストをDEBUG=Trueで実行するを参照
Django1.11以降はテスト実行の際に --debug-mode
のオプションを付けることによって DEBUG=True
で実行できるそうな
ただ、いちいちつけるの面倒であるし、オプションつけ忘れることによって事故るのが目に見えるので、個人的には使わないと思う