Djangoの設定を環境で分けたらPyCharmでテストが動かなくなったので直す

背景

DjangoアプリケーションをHerokuへデプロイするようにしたので、setting.pyを以下のようにローカル環境用とHeroku環境用に分割しました。

  • utalog/
    • settings/
      • __init__.py
        • デフォルトではローカル設定を読み込む
      • common.py
      • heroku.py
      • local.py

すると、python manage.py test では単体テストを実行できるのですが、エディターの左にある▶︎で単体テストが実行できなくなりました。

Testing started at 23:59 ...
 

Traceback (most recent call last):
  File "/Users/massakai/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/222.3345.131/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_manage.py", line 168, in <module>
    utility.execute()
  File "/Users/massakai/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/222.3345.131/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_manage.py", line 142, in execute
    _create_command().run_from_argv(self.argv)
  File "/Users/massakai/.virtualenvs/utalog/lib/python3.10/site-packages/django/core/management/commands/test.py", line 24, in run_from_argv
    super().run_from_argv(argv)
  File "/Users/massakai/.virtualenvs/utalog/lib/python3.10/site-packages/django/core/management/base.py", line 414, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/massakai/.virtualenvs/utalog/lib/python3.10/site-packages/django/core/management/base.py", line 460, in execute
    output = self.handle(*args, **options)
  File "/Users/massakai/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/222.3345.131/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_manage.py", line 104, in handle
    failures = TestRunner(test_labels, **options)
  File "/Users/massakai/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/222.3345.131/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_runner.py", line 254, in run_tests
    return DjangoTeamcityTestRunner(**options).run_tests(test_labels,
  File "/Users/massakai/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/222.3345.131/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_runner.py", line 156, in run_tests
    return super(DjangoTeamcityTestRunner, self).run_tests(test_labels, extra_tests, **kwargs)
  File "/Users/massakai/.virtualenvs/utalog/lib/python3.10/site-packages/django/test/runner.py", line 994, in run_tests
    suite = self.build_suite(test_labels, extra_tests)
  File "/Users/massakai/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/222.3345.131/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_test_runner.py", line 120, in build_suite
    suite = super(DjangoTeamcityTestRunner, self).build_suite(*args, **kwargs)
  File "/Users/massakai/.virtualenvs/utalog/lib/python3.10/site-packages/django/test/runner.py", line 847, in build_suite
    tests = self.load_tests_for_label(label, discover_kwargs)
  File "/Users/massakai/.virtualenvs/utalog/lib/python3.10/site-packages/django/test/runner.py", line 798, in load_tests_for_label
    tests = self.test_loader.loadTestsFromName(label)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/unittest/loader.py", line 154, in loadTestsFromName
    module = __import__(module_name)
  File "/Users/massakai/github/utalog/histories/tests/test_validation.py", line 9, in <module>
    from accounts.models import User
  File "/Users/massakai/github/utalog/accounts/models.py", line 4, in <module>
    from django.contrib.auth.models import AbstractUser
  File "/Users/massakai/.virtualenvs/utalog/lib/python3.10/site-packages/django/contrib/auth/models.py", line 5, in <module>
    from django.contrib.contenttypes.models import ContentType
  File "/Users/massakai/.virtualenvs/utalog/lib/python3.10/site-packages/django/contrib/contenttypes/models.py", line 131, in <module>
    class ContentType(models.Model):
  File "/Users/massakai/.virtualenvs/utalog/lib/python3.10/site-packages/django/db/models/base.py", line 132, in __new__
    raise RuntimeError(
RuntimeError: Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

環境

  • PyCharm 2022.2 (Professional Edition)
  • Python 3.10.0
  • Django 4.0.7

解決方法

2行目に There is no such settings files settings とあり、デフォルトで読み込まれる設定 utalog.settings がファイルでなくなったことが問題のようです。

実行 / デバッグ構成に環境変数 DJANGO_SETTINGS_MODULE=utalogs.settings.local を追加することで実行できるようになりました。

初めはターゲットごとに環境変数を設定していたのですが、実行 / デバッグ構成テンプレートを使ってDjango テストに環境変数を指定しておけば、都度環境変数を設定しなくてもよくなりました。

追記

Djangoの設定が問題だったようです。

「Preference」 → 「言語 & フレームワーク」 → 「Django」の「設定」にlocal.pyを指定してやってもテストが動くようになりました。

この設定を追加することで、ビューで出ていた Unresolved attribute reference 'user' for class 'WSGIRequest' の警告も消えたので、こちらの方法の方が良いです。

コメントする