Open1

PyCharm CEでDjangoテストが走らない→「Python」構成 +「Python test」構成 それぞれでの解決方法

tech_mwtech_mw

業務では有料版の PyCharm を使っていたため、テスト実行の設定で困ることはありませんでした。
しかしプライベートでは古い PyCharm CE を利用していたこともあり、IDE からテストを実行する際に少しハマりました(CE と有料版では使える機能や UI に違いがあります)。
Terminal からはテストを実行できるものの、ブレークポイントを使った細かなデバッグができないため、PyCharm CE 側で Run/Debug 構成を見直す必要がありました。最終的には、Run/Debug 構成を「Python」にして Target をテストに明示することでひとまずテスト+ブレイクポイントでのデバッグができるようになりました。

そもそも有料版にしたいけど普段毎日使うわけでもないし、月々3600円前後はちょっとなぁ。。

追記:※PyCharm CE × Python test構成でもテスト+デバックできました。 Python test構成では manage.py が実行されません。詳しくは末尾の追記にまとめています。

Pycharm CEテスト/デバッグ周り
https://zenn.dev/tech_mw/scraps/ef75be3b446e03

環境

  • PC:MacBook Pro(2019)
  • OS:macOS Sequoia
  • PyCharm CE:2025.2.11
  • Python:3.13.1
  • Django:5.2.6

1. Default test runner を明示(Autodetect → unittest)

「Settings > Python Integrated Tools > Testing > Default test runner」を Autodetect から unittest に変更。
ポイントは次のとおりです。

  • Autodetect は環境次第で検出がブレることがあり、unittest に固定した方が安定しやすい。
  • 今回の環境では他のランナーは選べず、No ◯◯ runner found in the selected interpreter と表示され、事実上 unittest 一択でした(Autodetect(UnitTest)とあったので変更なしでも結果良かった)

この設定は「PyCharm がどの方式でテストを解釈するか」の方針を決めるもの。独自ランナー経由の不具合がある場合は、次の「Python 構成」で回避する。

2. Run/Debug Configurations を「Python」で新規作成

「Run/Debug Configurations > 左上の+ > Python」を選び、以下のように設定し直しました(以前は「Python tests」で作っていた記憶あり)

  • Name:任意
  • Run:プロジェクトで使用している Python インタプリタ
  • Script path:プロジェクトの manage.py へのパス
  • Script parameters:test [テストしたいメソッドまでのパス]
    test は Django の管理コマンド、続くパスはテスト対象メソッドまでのフル修飾ラベル)
  • Working directory:プロジェクトルート(manage.py がある場所)
  • Environment variables:PYTHONUNBUFFERED=1(任意。出力をリアルタイム表示したい場合に便利。必須ではない)

この「Python」構成で manage.py test を直接叩く形にしたところ、IDE 独自ランナーの影響を受けず、ブレークポイントデバッグも安定しました。

3. なぜ「Python tests」構成では不安定だったのか

  • 「Python tests」構成は PyCharm の独自ランナー(_jb_unittest_runner.py)を経由してテストを実行する。
  • CE 版+新しめの Python(3.13 系)といった組み合わせや、テスト検出条件(作業ディレクトリ、ソースルート、test_*.py の命名など)が絡むと、Django 設定が初期化されないまま実行されてしまうことがある。
  • その結果、モデル import の時点で ImproperlyConfigured が発生。
  • 一方「Python」構成で manage.py test を直接実行すれば、Django の初期化(DJANGO_SETTINGS_MODULE 設定や django.setup())が適切に走るため問題が起きにくい。

該当エラー(抜粋)

以下のように、manage.py が実行されず引数として渡されているため、Django 設定が未初期化のまま進んで落ちているようです。

    /Applications/PyCharm CE.app/.../_jb_unittest_runner.py --path .../manage.py -- test [テストしたいメソッドまでのパス]
    Launching unittests with arguments python -m unittest .../manage.py test [テストしたいメソッドまでのパス]
    ・
    ・
    django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured.
    You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
    ・
    ・
    Process finished with exit code 1
    Empty suite

※ このメッセージは「INSTALLED_APPS の中身が間違っている」意味ではなく、「Django の設定がまだロードされていない状態でモデル等に触れた」ために出ています。manage.py test を実行する構成に変えることで解決できます。

まとめ

  • PyCharm CE では「Python tests」構成より、「Python」構成で manage.py test を叩く**方が安定。
  • Default test runner は unittest が安心。
  • PYTHONUNBUFFERED=1 は出力をリアルタイムで確認したい場合に有効(必須ではない)。
  • 特定メソッドだけを高速に再現してブレークポイントデバッグしたいときは、上記のフル修飾ラベル指定が有効。

追記:Python 構成と Python tests 構成の違い(実行ログで確認)

Python test 構成でもテスト+デバッグできました

(1)初期化用ファイル(Python tests 構成では manage.py が経由されず、Django 初期化処理が実行されないため)
・runpyなどでmanage.pyのDJANGO_SETTINGS_MODULEを読むこともできるが今回は1番簡単な方法を採用
・「Python」構成と「Python test」構成でテスト実行時のログを確認すると前者はmanage.pyを実行されているのに対し後者は実行されていない事が確認できる
・これは CE だから発生する問題のようで、有料版(過去ずっと有料版だったので遭遇したことはありませんでした)なら Django 統合があるので Python tests 構成でもOK

tests/__init__.py
import os
import django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project.settings")
django.setup()

(2)setting/ALLOWED_HOSTSにtestserver許可

  • Djangoテストでは testserver がデフォルトのHostなので
settings.py
ALLOWED_HOSTS = ["testserver"]