**编辑-使用pycharm测试时引发错误

问题描述

编辑 这篇文章已被编辑,因为我已对该问题进行了归零,但尚未解决

你好

我遇到一个问题,当我通过pycharm运行测试时,会引发以下错误

django.core.exceptions.ImproperlyConfigured:请求的设置为INSTALLED_APPS,但未配置设置。在访问设置之前,您必须定义环境变量DJANGO_SETTINGS_MODULE或调用settings.configure()。

当我刚运行./manage.py test并成功执行测试时,pycharm似乎出现了问题。

我使用pycharm设置的配置是:

  • 脚本路径:/MainFolder/MainProjects/project1-backend/tests/test_models.py
  • 环境变量:PYTHONUNBUFFERED = 1; DJANGO_SETTINGS_MODULE = project1backend.settings 请注意该文件夹所属的文件夹,而不是project1-backend
  • Python解释器:Python 3.8 (MainFolder)〜/ MainFolder / MainProjects / bin / python
  • 工作目录:/ Users / myname / MainFolder / MainProjects / project1-backend
  • 内容添加到PYTHONPATH:未选中
  • 将源根添加到PYTHONPATH:已选中

Project hierarchy 编辑 测试文件应为__init__.py而不是__inity__.py我的.env文件位于project1-backend文件夹中。我正在做静脉手术以执行./manage.py测试。

#import from Model class
from django.test import SimpleTestCase
from django.db import models

#User model
class User(models.Model):

    email = models.CharField(max_length=256,primary_key=True)
    first_name = models.CharField(max_length=256)
    last_name = models.CharField(max_length=256)

    def __str__(self):
        return self.email # this defaults to the email address


from django.test import TestCase
from app.models import User

class TestModels(TestCase):

    def setUp(self):
      self.user1 = User.objects.create(
          email="m@gmail.com",first_name="misha",last_name="lee"
      )

    def test_app_user(self):
        self.setUp()
        self.assertTrue(isinstance(self,User)

编辑

     Traceback (most recent call last):
      File "/Users/myname/MainFolder/MainProjects/project1-backend/tests/test_models.py",line 4,in <module>
        from app.models import User
      File "/Users/myname/MainFolder/MainProjects/project1-backend/app/models.py",line 6,in <module>
        class User(models.Model):
      File "/Users/myname/MainFolder/MainProjects/lib/python3.8/site-packages/django/db/models/base.py",line 107,in __new__
        app_config = apps.get_containing_app_config(module)
      File "/Users/myname/MainFolder/MainProjects/lib/python3.8/site-packages/django/apps/registry.py",line 252,in get_containing_app_config
        self.check_apps_ready()
      File "/Users/myname/MainFolder/MainProjects/lib/python3.8/site-packages/django/apps/registry.py",line 134,in check_apps_ready
        settings.INSTALLED_APPS
      File "/Users/myname/MainFolder/MainProjects/lib/python3.8/site-packages/django/conf/__init__.py",line 76,in __getattr__
        self._setup(name)
      File "/Users/myname/MainFolder/MainProjects/lib/python3.8/site-packages/django/conf/__init__.py",line 57,in _setup
        raise ImproperlyConfigured(
    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

我也包括

INSTALLED_APPS = [
    'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','app.apps.AppConfig'
]

*请注意,我也尝试过“ app”本身,但无济于事。

提前感谢帮助!注意我已经查看了PYTHONPATH答案和__init__.py答案,发现它们没有帮助。但是,我确实认为这与路径有关。

我也查看了以下资源: Running Django tests in PyCharm 但发现答案无法解决我的问题。

解决方法

我一直在搜寻SO数天,因为我不知道为什么当我运行./manage.py test时一切正常并且执行了测试。似乎设置已正确配置(即DJANGO_SETTINGS_MODULE)。但是,当我开始调查错误,调试并找到可能的答案时,我发现Pycharm / pytest无法识别settings.py文件中的设置(或与此相关的任何文件)。即使在我尝试通过PyCharm中的测试的“编辑配置”添加环境变量(即DJANGO_SETTINGS_MODULE)之后。

解决方案 首先,我导航到PyCharm中的Run/Debug Configurations并使用左上角的“-”按钮删除测试,以删除所有先前的测试配置(Pycharm Professional 2020.1)。 我必须利用一个EnvFile插件,该插件会在运行测试之前通过导航到PyCharm --> Preferences --> Plugins并搜索EnvFile来启动。然后,我添加了用于存储所有环境变量的隐藏的.env文件。

然后这导致我进入:

 Error raise AppRegistryNotReady("Apps aren't loaded yet.")
              django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

我借助Django文档https://docs.djangoproject.com/en/3.0/ref/applications/并添加了Django.setup()来填充应用程序注册表,从而纠正了此问题。

此外,正如我发现的那样,这里没有很多文档,请特别注意您使用pytest,nosetest等的测试类型以及切线中使用的import语句。另外,请注意TestCase和SimpleTestCase之间的区别,因为后者不需要访问数据库。