Django тест с другим пользователем базы данных - PullRequest
0 голосов
/ 07 марта 2020

Я хочу, чтобы моя база данных модульных тестов была полностью отделена от других сред, включая использование других учетных данных пользователя. Это в основном предотвращает непреднамеренный запуск модульных тестов для базы данных разработки и манипулирование данными разработчиков или их полное уничтожение, если не указана опция --keepdb. Приведенный ниже код обнаруживает «тест» в аргументах sys, и это, кажется, работает, но очень неуклюже. Если мне не хватает лучшего способа сделать это, пожалуйста, сообщите.

У меня есть отдельные файлы настроек для каждой среды, так что это будет только на сервере разработки, где модульные тесты запускаются автоматически и не заканчиваются на любых производственных серверах.

Среда: Django 1.11 Python 3.4.x MariaDB

# 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 не смотрит на учетные данные ТЕСТ

# 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',
                },
       }
}

Ответы [ 2 ]

0 голосов
/ 07 марта 2020

Хотелось бы что-нибудь подобное для вашей ситуации?

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)

0 голосов
/ 07 марта 2020

AFAIK, вам не нужно создавать отдельную тестовую базу данных, если вы хотите запускать модульные тесты над ней. Вот ссылка на документацию тестовой базы данных .

В нем говорится:

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

Вы можете перейти по по этой ссылке , чтобы написать свои тесты, и это не повлияет на вашу производственную базу данных или базу данных разработки.

...