Django项目单元测试报错:INSTALLED_APPS未配置,求解决方案
Django单元测试配置错误解决方案
问题场景
在PyCharm中编写Django项目的单元测试,测试代码导入了项目的models模块,运行测试时触发以下配置错误: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.
测试代码示例
from applicationapp import models ... class TestElastic(TestCase): def test_parse_request(self): # 预期正常通过 # self.fail() return
完整错误栈
/data/app-py3/venv3.7/bin/python /var/lib/snapd/snap/pycharm-professional/327/plugins/python/helpers/pycharm/_jb_unittest_runner.py --target test_elastic.TestElastic Testing started at 2:07 PM ... Launching unittests with arguments python -m unittest test_elastic.TestElastic in /data/app-py3/APPLICATION/tests Traceback (most recent call last): File "/var/lib/snapd/snap/pycharm-professional/327/plugins/python/helpers/pycharm/_jb_unittest_runner.py", line 35, in <module> sys.exit(main(argv=args, module=None, testRunner=unittestpy.TeamcityTestRunner, buffer=not JB_DISABLE_BUFFERING)) File "/usr/local/lib/python3.7/unittest/main.py", line 100, in __init__ self.parseArgs(argv) File "/usr/local/lib/python3.7/unittest/main.py", line 147, in parseArgs self.createTests() File "/usr/local/lib/python3.7/unittest/main.py", line 159, in createTests self.module) File "/usr/local/lib/python3.7/unittest/loader.py", line 220, in loadTestsFromNames suites = [self.loadTestsFromName(name, module) for name in names] File "/usr/local/lib/python3.7/unittest/loader.py", line 220, in <listcomp> suites = [self.loadTestsFromName(name, module) for name in names] File "/usr/local/lib/python3.7/unittest/loader.py", line 154, in loadTestsFromName module = __import__(module_name) File "/data/app-py3/APPLICATION/tests/test_elastic.py", line 6, in <module> from applicationapp.soap.elastic import Elastic File "/data/app-py3/APPLICATION/applicationapp/soap/elastic.py", line 7, in <module> from applicationapp import models File "/data/app-py3/APPLICATION/applicationapp/models.py", line 3, in <module> from django.contrib.auth.models import User File "/data/app-py3/venv3.7/lib/python3.7/site-packages/django/contrib/auth/models.py", line 2, in <module> from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager File "/data/app-py3/venv3.7/lib/python3.7/site-packages/django/contrib/auth/base_user.py", line 48, in <module> class AbstractBaseUser(models.Model): File "/data/app-py3/venv3.7/lib/python3.7/site-packages/django/db/models/base.py", line 108, in __new__ app_config = apps.get_containing_app_config(module) File "/data/app-py3/venv3.7/lib/python3.7/site-packages/django/apps/registry.py", line 253, in get_containing_app_config self.check_apps_ready() File "/data/app-py3/venv3.7/lib/python3.7/site-packages/django/apps/registry.py", line 135, in check_apps_ready settings.INSTALLED_APPS File "/data/app-py3/venv3.7/lib/python3.7/site-packages/django/conf/__init__.py", line 83, in __getattr__ self._setup(name) File "/data/app-py3/venv3.7/lib/python3.7/site-packages/django/conf/__init__.py", line 68, in _setup % (desc, ENVIRONMENT_VARIABLE)) 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
解决方案
方法1:使用Django自带测试运行器
直接通过Django的manage.py运行测试,它会自动初始化Django配置环境:
在项目根目录(包含manage.py的目录)执行命令:
python manage.py test tests.test_elastic.TestElastic
方法2:在测试文件中手动初始化Django环境
在测试文件的最开头添加以下代码,确保在导入models前完成Django配置:
import os import django # 替换为你的项目settings模块路径,示例中项目根为APPLICATION,settings在APPLICATION/APPLICATION/settings.py os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'APPLICATION.settings') django.setup() # 之后再导入models和其他模块 from applicationapp import models ...
方法3:配置PyCharm的测试运行环境
- 打开PyCharm的Run/Debug Configurations(右上角运行按钮旁的下拉菜单 → Edit Configurations)
- 点击左上角
+号,选择Django tests - 在配置页面:
- Target:选择测试类或方法(如
test_elastic.TestElastic) - Settings:指定项目的settings模块路径(如
APPLICATION.settings) - Working directory:设置为项目根目录(包含
manage.py的路径)
- Target:选择测试类或方法(如
- 保存配置后,直接运行该配置即可
原因说明
直接使用Python的unittest命令运行测试时,不会自动加载Django的配置环境。而导入Django models模块会触发框架对INSTALLED_APPS等配置项的检查,此时配置未初始化就会抛出错误。必须先完成Django环境的配置,才能正常导入和使用models。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

