Django 并行测试:测试进程错误地访问测试数据库

Django parallel testing: Test processes incorrectly accessing test databases

提问人:sunw 提问时间:8/6/2020 最后编辑:Paweł Pedrycsunw 更新时间:11/2/2022 访问量:1244

问:

我有一个在本地运行的 Django 3.0.8 项目,连接到本地 PostgreSQL 数据库 ()。当我运行 时,我的单元测试运行良好;将创建一个名为“自动”的测试数据库,并正确访问该数据库。postgres:///myapppython manage.py testtest_myapp

但是,当我运行时,测试失败。我看到 8 个克隆的数据库已正确生成 (, ,..., ),但我收到如下错误:python manage.py test --parallel 8test_myapp_1test_myapp_2test_myapp_8

psycopg2.OperationalError: FATAL:  database "myapp_3" does not exist

对于并行测试,数据库似乎访问不正确(尝试访问数据库而不是 )。我试图弄清楚我的本地配置是否有问题,但这就是我的基本配置中的全部内容:myapp_Ntest_myapp_N

DATABASES = {
    'default': env.db('DATABASE_URL', default='postgres:///myapp'),
}
DATABASES['default']['ATOMIC_REQUESTS'] = True

为什么我的并行测试进程无法正确访问其各自克隆的测试数据库?

Python Django 测试

评论

0赞 Amir Heshmati 8/20/2020
您能分享更多关于您如何配置数据库的信息吗?from django.conf import settings;print(settings.DATABASES)
0赞 sunw 8/20/2020
@AmirHeshmati这里是以下结果:print(settings.DATABASES)
0赞 sunw 8/20/2020
{ “default”:{ “NAME”:“skale”, “USER”:“”, “PASSWORD”:“”, “HOST”:“”, “PORT”:“”, “ENGINE”:“django.db.backends.postgresql”, “ATOMIC_REQUESTS”:True, “AUTOCOMMIT”:True, “CONN_MAX_AGE”:0, “OPTIONS”:{ “fallback_application_name”:“django_shell” }, “TIME_ZONE”:“None”, “TEST”:{ “CHARSET”:“None”, “COLLATION”:“None”, “NAME”:“None”, “MIRROR”:“None” } } }
0赞 TD1 2/16/2021
我有同样的问题。有什么建议吗?

答:

-1赞 Mohammadali Davarzani 11/3/2021 #1

要在 Django 项目上使用 PostgreSQL 数据库,您可以配置相同的数据库。

DATABASES = {
    'default': {
        "ENGINE": "django.db.backends.postgresql_psycopg2",
        "NAME": 'Table_name',
        "USER": 'user_name',
        "PASSWORD": 'password',
        "HOST": 'localhost', # or 127.0.0.1
        "PORT": '5432', #5432 is the default PostgreSQL port if you change it must change this port
    }
}

为了在你的 Django 项目上设置多个数据库,你可以查看这个页面并使用它。

0赞 Dipen Dadhaniya 2/9/2022 #2

对我有用的一个简单的解决方案是在 中显式指定测试数据库名称,例如,settings.py

DATABASES = {
    'default': {
        ...
        'TEST': {
            # Avoid naming it the same as your original database name. 
            # Otherwise, it will be used while testing (and even may get deleted).
            'NAME': 'name_of_your_choice',
        },
    },
    ...
}

如果使用多个数据库,则可能需要对所有数据库执行此操作。