Django может сбросить его базу (базы) данных между каждым модульным тестом?

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 сбои.

Это - на самом деле два вопроса о части:

  1. Действительно ли возможно вызвать ./manage.py test сбросить базу данных между каждым тестовым сценарием?
  2. Так как Django не сбрасывает DB между каждым тестом по умолчанию, возможно, существует серьезное основание. Кто-либо знает?
8
задан Mike Mazur 5 May 2010 в 09:53
поделиться

2 ответа

можно ли заставить тест ./manage.py очищать базу данных между каждым тестовым примером?

Посмотрите на реализацию команды django.core.management.commands.flush.py.

Вы можете вызвать команду flush изнутри вашего тестового вызова (возможно, из TestCase.setUp):

management.call_command('flush')

может быть, для этого есть веская причина. Кто-нибудь знает?

Да, есть: Ускорься. Очистка и перезагрузка большого количества данных из json занимает некоторое время ...

Возможно, вам стоит взглянуть на TransactionTestCase

8
ответ дан 5 December 2019 в 10:01
поделиться

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

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])
8
ответ дан 5 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: