LoginSignup
3
7

More than 3 years have passed since last update.

[Django]settingsにDEBUG=Trueを定義してても、テスト実行するとDEBUG=Falseになってしまう罠

Last updated at Posted at 2019-06-08

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をオーバーライドする

一番単純な方法

hogehoge_test.py

class HogehogeTestCase(TestCase):
    def setUp(self):
        settings.DEBUG = True

こうしておくと、テスト実行を DEBUG = True で行うことができる

2.そもそも if settings.DEBUG みたいなことを書かない

これが一番良いと思う。
わざわざ、settingsを環境用に分けているのであれば

settings_prd.py
HOGE = 'hoge'
settings_dev.py
HOGE = 'fuga'

のようにsettings内で環境変数を定義して以下のように呼び出せばいい

from django.conf import settings

hoge = settings.HOGE

3. --debug-mode のオプションを付けてテスト実行する

[Django]DjangoのテストをDEBUG=Trueで実行するを参照
Django1.11以降はテスト実行の際に --debug-mode のオプションを付けることによって DEBUG=True で実行できるそうな
ただ、いちいちつけるの面倒であるし、オプションつけ忘れることによって事故るのが目に見えるので、個人的には使わないと思う

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7