Django (1,2 беты) сбросит базу (базы) данных между каждым тестом, который работает, означая каждого тестовые прогоны на пустом DB. Однако база (базы) данных не сбрасывается. Один из эффектов сбрасывания базы данных auto_increment
счетчики сбрасываются.
Рассмотрите тест, который вытаскивает данные из базы данных первичным ключом:
class ChangeLogTest(django.test.TestCase):
def test_one(self):
do_something_which_creates_two_log_entries()
log = LogEntry.objects.get(id=1)
assert_log_entry_correct(log)
log = LogEntry.objects.get(id=2)
assert_log_entry_correct(log)
Это передаст, потому что только две записи в журнале когда-либо создавались. Однако, если другой тест добавляется к ChangeLogTest
и это, оказывается, работает прежде test_one
, первичные ключи записей в журнале больше не равняются 1 и 2, они могли бы быть 2 и 3. Теперь test_one
сбои.
Это - на самом деле два вопроса о части:
./manage.py test
сбросить базу данных между каждым тестовым сценарием?можно ли заставить тест ./manage.py очищать базу данных между каждым тестовым примером?
Посмотрите на реализацию команды django.core.management.commands.flush.py.
Вы можете вызвать команду flush изнутри вашего тестового вызова (возможно, из TestCase.setUp):
management.call_command('flush')
может быть, для этого есть веская причина. Кто-нибудь знает?
Да, есть: Ускорься. Очистка и перезагрузка большого количества данных из json занимает некоторое время ...
Возможно, вам стоит взглянуть на TransactionTestCase
Ответ на этот вопрос: не пишите тесты таким образом, поскольку они зависят от определенных значений ключей. Например, ваш тест лучше записать:
def test_one(self):
do_something_which_creates_two_log_entries()
logs = LogEntry.objects.all()
assert_log_entry_correct(log[0])
assert_log_entry_correct(log[1])