【问题标题】:LiveServerTestCase - settings.Database is improperly configuredLiveServerTestCase - settings.Database 配置不正确
【发布时间】:2015-12-12 15:20:44
【问题描述】:

我正在尝试设置 LiveServerTestCase。

为此,我在我的测试类中创建了一个用户

class ExampleTest(LiveServerTestCase):
    user = User.objects.create_superuser('Testuser','test@user.com','1234')
    user.save()
.
.
.(rest of the test)

没有此行,服务器和测试将启动,但显然它无法登录,因为之前没有创建用户。

但是有了这条线,我得到了一个

 django.core.exceptions.ImproperlyConfigured: settings.DATABASES
 is improperly configured. Please supply the NAME value.

错误。

我是否需要在 settings.py 中为 LiveServerTestCase 设置服务器,如果需要,使用哪些值或在哪里可以找到它们?

更新:

我正在运行这个测试

python manage.py test

所以它自己建立了一个数据库,我不必在 settings.py 中定义,或者我错了。

更新2:

我已经定义了一个“生产”数据库(在我问这个问题之前),它看起来像这样:

DATABASES = {
 'default': {
     'ENGINE': 'django.db.backends.postgresql_psycopg2',
     'HOST': 'localhost',  # 10.1.2.41
     'NAME': 'pim_testdatabase',
     'USER': 'postgres',
     'PASSWORD': '1234',
     'PORT': '5432',
     'HAS_HSTORE': True,
     'TEST':{
             'NAME': 'test_pim_testdatabase'
      },
  },
}

仍然出现异常。

【问题讨论】:

    标签: python django python-3.x selenium testing


    【解决方案1】:

    您需要在DATABASES 设置中设置数据库。

    Django 为每个数据库设置一个test database 在设置文件的DATABASES 定义中定义。

    默认情况下,测试数据库通过在前面加上 test_ 来获取它们的名称 DATABASES 中定义的数据库的 NAME 设置值。

    如果您想使用不同的数据库名称,请在TEST 字典中为DATABASES 中的任何给定数据库指定NAME

    测试数据库配置示例:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'USER': 'mydatabaseuser',
            'NAME': 'mydatabase',
            'TEST': { # test database settings
                'NAME': 'mytestdatabase', # test database name
            },
        },
    }
    

    【讨论】:

    • 忘了补充说我使用 python manage.py test 运行我的测试它正在为自己设置一个测试数据库,所以我不必在我的设置中定义一个数据库,或者我可以吗?将更新问题。
    • 是的,您需要在DATABASES 设置中定义一个数据库。
    • 我第二次更新了问题,请看一下。
    • 如果默认数据库名称为pim_testdatabase,Django 会自动创建一个名称为test_ + pim_testdatabase 的测试数据库,即。 test_pim_testdatabase。检查DEFAULT 中定义的数据库设置是否正确并且正在建立连接。另外,请确保定义的用户具有创建测试数据库的权限。
    • 我认为您的注意力集中在错误的事情上,或者我只是无法理解您的意思。正如我在我的问题中所写的,只要不存在create_superuser 的行,测试就会毫无问题地开始运行并启动服务器和数据库。我认为我的问题在于 create_superuser
    【解决方案2】:

    问题是您在类定义中创建用户。这在加载测试类时运行,在创建数据库之前。

    class ExampleTest(LiveServerTestCase):
        user = User.objects.create_superuser('Testuser','test@user.com','1234')
        user.save()  # This save isn't required -- it has been saved already
    

    您可以通过将用户创建移到单独的测试中来解决问题。然后在创建数据库后,在测试方法运行时创建用户。

    class ExampleTest(LiveServerTestCase):
        def test_user(self):
            self.user = User.objects.create_superuser('Testuser','test@user.com','1234')
            ...
    

    Django 1.8 有一个setUpTestData 方法,您可以在其中为整个测试用例设置一次初始数据。这样更快,重复性也更少。

    class ExampleTest(LiveServerTestCase):
        @classmethod
        def setUpTestData(cls):
            # Set up data for the whole TestCase
            self.user = User.objects.create_superuser('Testuser','test@user.com','1234')
    
        def test_user(self):
            # access the user with self.user
            ...
    

    在没有setUpTestData 的早期版本的Django 中,您可以在setUp 方法中创建用户。

    class ExampleTest(LiveServerTestCase):
        def setUp(self):
            self.user = User.objects.create_superuser('Testuser','test@user.com','1234')
    

    【讨论】:

    • 虽然我自己发现了这一点,只是想将其添加为答案,谢谢 Alasdair,您昨天和今天再次回答了我的问题。非常感谢。
    猜你喜欢
    • 2020-03-27
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2016-03-14
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多