Как проверить схему базы данных Django? - PullRequest
6 голосов
/ 26 сентября 2008

Я хочу написать тесты, которые могут показать, синхронизирована ли база данных с моим файлом models.py. На самом деле я их уже написал, только чтобы узнать, что django создает новую базу данных каждый раз, когда тесты запускаются на основе файла models.py. Есть ли способ заставить models.py test использовать существующую схему базы данных? Тот, который находится в mysql / postgresql, а не тот, который находится в /myapp/models.py?

Меня не волнуют данные, которые есть в базе данных, меня волнует только их схема т.е. я хочу, чтобы мои тесты замечали, если таблица в базе данных имеет меньше полей, чем схема в моих моделях .py файл.

Я использую фреймворк unittest (фактически расширение django), если это имеет какое-либо отношение.

спасибо

1 Ответ

9 голосов
/ 26 сентября 2008

Что мы сделали, так это переопределили стандартный test_runner, чтобы он не создавал новую базу данных для проверки. Таким образом, он запускает тест на то, как выглядит наша текущая локальная база данных. Но будьте очень осторожны, если вы используете этот метод, потому что любые изменения в данных, которые вы делаете в своих тестах, будут постоянными. Я позаботился о том, чтобы все наши тесты вернули все изменения в исходное состояние, и сохранили нашу первоначальную версию нашей базы данных на сервере и сделали резервную копию.

Так что для этого вам нужно скопировать метод run_test из django.test.simple в папку в вашем проекте - я поместил мой в myproject / test / test_runner.py

Затем внесите следующие изменения в этот метод:

// change
old_name = settings.DATABASE_NAME
from django.db import connection
connection.creation.create_test_db(verbosity, autoclobber=not interactive)
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
connection.creation.destroy_test_db(old_name, verbosity)

// to:
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)

Обязательно выполните все необходимые операции импорта вверху, а затем в файле настроек установите значение:

TEST_RUNNER = 'myproject.test.test_runner.run_tests'

Теперь при запуске теста ./manage.py Django будет запускать тесты в соответствии с текущим состоянием вашей базы данных, а не создавать новую версию на основе ваших текущих определений моделей.

Еще одна вещь, которую вы можете сделать, это создать копию вашей базы данных локально, а затем выполнить проверку в вашем новом методе run_test (), например:

if settings.DATABASE_NAME != 'my_test_db': 
    sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME) 

Таким образом, нет опасности запуска тестов для вашей основной базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...