#django #django-testing #django-postgresql
#django #django-тестирование #django-postgresql
Вопрос:
Недавно я сменил движок db с SQLite
на PostgreSQL
. Я успешно перенес весь дизайн БД на PostgreSQL (просто внесите изменения, мигрируйте). После того, как я запустил тесты, некоторые из них завершились неудачей по какой-то неизвестной причине (ошибки предполагают, что некоторые объекты не были созданы). Сбой относится не ко всем тестам, а только к нескольким выбранным. Раньше все работало.
Я бы начал исследовать, что происходит, от теста к тесту, но появилось какое-то странное поведение. Допустим, мой тест находится в классе, MyTestClass
и вызывается test, test_do_something
и в MyTestClass
есть и другие тесты.
- Когда я запускаю,
python manage.py test MyTestClass
я получаю информацию, котораяtest_do_something
завершилась с ошибкой. - Когда я запускаю
python manage.py test MyTestClass.test_do_something
, все проходит. - На 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 при сбросе? Это выглядело бы так.