Вспомогательная функция Django, выполняемая только в одном тесте при использовании PostgreSQL

#django #django-testing #django-postgresql

#django #django-тестирование #django-postgresql

Вопрос:

Недавно я сменил движок db с SQLite на PostgreSQL . Я успешно перенес весь дизайн БД на PostgreSQL (просто внесите изменения, мигрируйте). После того, как я запустил тесты, некоторые из них завершились неудачей по какой-то неизвестной причине (ошибки предполагают, что некоторые объекты не были созданы). Сбой относится не ко всем тестам, а только к нескольким выбранным. Раньше все работало.

Я бы начал исследовать, что происходит, от теста к тесту, но появилось какое-то странное поведение. Допустим, мой тест находится в классе, MyTestClass и вызывается test, test_do_something и в MyTestClass есть и другие тесты.

  1. Когда я запускаю, python manage.py test MyTestClass я получаю информацию, которая test_do_something завершилась с ошибкой.
  2. Когда я запускаю python manage.py test MyTestClass.test_do_something , все проходит.
  3. На SQLite выполняются оба способа.

Я предполагаю, что методы setUpTestData() и setUp() работают одинаково в SQLite и PostgreSQL. Или они этого не делают?

Есть какие-либо подсказки, почему может происходить такое несоответствие?

Редактировать

Я думаю, я заметил, что может быть не так, но я не понимаю, почему. Проблема в том, что моя функция, которую я использовал для вызова для создания объекта, который позже используется только один раз. Которая отличается от SQLite выполнения.

Что я имею в виду, в моем тесте у меня есть что-то вроде этого:

 def create_object(self):
    self.client.post(reverse('myurl'), kwargs={'myargs':arg})

def test_mytest1(self):
    # Do something
    self.create_object()
    # Do something

def test_mytest2(self):
    # Do something
    self.create_object()
    # Do something

def test_mytest3(self):
    # Do something
    self.create_object()
    # Do something
  

Будет выполнен только для одного теста create_object() .

Комментарии:

1. Вы уверены, что тестовая база данных создается во время каждого запуска?

2. @ArakkalAbu да, я рассматривал это. Но когда я запускаю, например, # 2, затем # 1, затем # 2 или любой другой порядок выполнения, схема всегда повторяется. Более того, я не использую —keepdb. Согласно документации между каждым запуском flush должно выполняться автоматически.

3. Я думаю, вам следует добавить больше информации о проблеме, например, какая у вас ошибка, воспроизводима ли она и т.д. Может быть, кто-то еще мог бы помочь, если вы это сделаете

4. @ArakkalAbu Я обновил вопрос с более подробной информацией.

Ответ №1:

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

Позвольте мне немного подробнее объяснить, с чем я столкнулся. Например. У меня был тест, в котором я ссылался на конкретный объект, передавая этот идентификатор объекта в URL kwargs. Перед этой операцией я создал object и передал id=1 как kwargs, потому что я предположил, что если это единственное место в этом тесте и setUp() оно будет 1. Похоже, что с PostgreSQL все не так однозначно. Кажется, что идентификаторы увеличиваются, несмотря на сброс базы данных. Поведение, полностью отличающееся от поведения, предоставляемого SQLite.

Я был бы очень признателен, если бы кто-нибудь мог предоставить более подробный ответ, почему это происходит. Счетчик идентификаторов не обнуляется в PostgreSQL при сбросе? Это выглядело бы так.