2008-09-26 4 views
6

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

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

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

благодаря

ответ

8

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

Так для этого вам нужно скопировать run_test метод из django.test.simple к месту в вашем проекте - я поставил мину в MyProject/тест/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) 

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

Смежные вопросы