【问题标题】:Django test with different database user使用不同的数据库用户进行 Django 测试
【发布时间】:2020-06-19 15:42:53
【问题描述】:

我想让我的单元测试数据库与其他环境完全分开,包括使用不同的用户凭据。这主要是为了防止任何人无意中对开发数据库运行单元测试,并在未指定 --keepdb 选项的情况下破坏开发数据或将其完全清除。下面的代码检测到 sys args 中的“测试”,这似乎有效,但非常笨重。如果我错过了更好的方法,请告知。

我对每个环境都有单独的设置文件,所以这只会在自动运行单元测试的开发服务器上,不会在任何生产服务器上结束。

环境: 姜戈 1.11 Python 3.4.x 玛丽亚数据库

# this works but is clunky
import sys
if 'test' in sys.argv:
    DATABASES = { # test db and user
        'default': {
           'ENGINE': 'django.db.backends.mysql',
           'NAME': 'dev_db_test',
           'USER': 'test_user',
           'PASSWORD': 'secretpassword',
           'HOST': 'the-db-host',
           'PORT': '3306',
           'TEST': { # redundant but explicit!
                         'NAME':'dev_db_test',
                    },
           }
    }
else:
    DATABASES = {
        'default': {
           'ENGINE': 'django.db.backends.mysql',
           'NAME': 'dev_db',
           'USER': 'dev_db_user',
           'PASSWORD': 'dev_password',
           'HOST': 'the-db-host',
           'PORT': '3306',
           'TEST': { 
                         'NAME':'dev_db_test', # redundant but explicit!
                    },
           }
    }

我想这样做,但不幸的是 Django 不查看 TEST 凭据

# cleaner approach but doesn't work - don't do this!
DATABASES = {
    'default': {
       'ENGINE': 'django.db.backends.mysql',
       'NAME': 'dev_db',
       'USER': 'dev_db_user',
       'PASSWORD': 'dev_password',
       'HOST': 'the-db-host',
       'PORT': '3306',
       'TEST': { 
                 'NAME':'dev_db_test', # Django uses the test db NAME
                 'USER':'test_user_ignored',   # but ignores the USER and PASSWORD
                 'PASSWORD':'ignoredpassword',
                },
       }
}

【问题讨论】:

    标签: python django django-testing


    【解决方案1】:

    AFAIK,如果您想在其上运行单元测试,则无需创建单独的测试数据库。这里是the documentation link of test database

    它指出:

    Tests that require a database (namely, model tests) will not use your “real” (production) database. 
    Separate, blank databases are created for the tests.
    

    您可以关注this link 编写您的测试,它不会影响您的生产或开发数据库。

    【讨论】:

    • 这不是他想要的。
    【解决方案2】:

    这样的事情对你的情况有用吗?

    import sys
    
    if 'test' in sys.argv:
      NAME = 'dev_db_test'
      USER = 'test_user'
      PASSWORD ='secretpassword'
    else:
      NAME = 'dev_db'
      USER = 'dev_db_user'
      PASSWORD ='dev_password'
    
    DATABASES ={ # test db and user
      'default': 
      {
          'ENGINE': 'django.db.backends.mysql',
          'NAME': NAME,
          'USER': USER,
          'PASSWORD': PASSWORD,
          'HOST': 'the-db-host',
          'PORT': '3306',
          'TEST': 
          { # redundant but explicit!
            'NAME':'dev_db_test',
          },
      }
    }
    print(DATABASES)
    
    

    【讨论】:

    • 是的,这就是我现在正在做的事情(仅定义 USER 和 PASSWORD 而不是整个 DATABASES 字典)
    • 太棒了!好吧,我希望我的回答对这个过程有所帮助。祝您应用的其余部分好运!
    猜你喜欢
    • 2022-08-02
    • 2011-06-06
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    相关资源
    最近更新 更多