Может ли Django очищать свою базу данных между каждым модульным тестом? - PullRequest
7 голосов
/ 05 мая 2010

Django (бета-версия 1.2) будет сбрасывать базы данных между каждым тестом, что означает, что каждый тест выполняется на пустой БД. Однако базы данных не сброшены . Одним из эффектов очистки базы данных является сброс счетчиков 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 по умолчанию не очищает БД между каждым тестом, возможно, есть веская причина. Кто-нибудь знает?

Ответы [ 3 ]

8 голосов
/ 05 мая 2010

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

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])
7 голосов
/ 05 мая 2010

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

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

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

management.call_command('flush')

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

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

Может быть, вам стоит взглянуть на TransactionTestCase

0 голосов
/ 09 октября 2018

Вы также можете использовать TransactionTestCase.reset_sequence :

Установка reset_sequence = True в TransactionTestCase гарантирует, что последовательности всегда будут сбрасываться до запуска теста:

class TestsThatDependsOnPrimaryKeySequences(TransactionTestCase):
    reset_sequences = True

    def test_animal_pk(self):
        lion = Animal.objects.create(name="lion", sound="roar")
        # lion.pk is guaranteed to always be 1
        self.assertEqual(lion.pk, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...