Связь не существует при запуске модульных тестов Django

У меня возникли проблемы с запуском модульных тестов в моем приложении django, когда оно работает через Jenkins.

У меня есть конвейер CI/CD, который работает python manage.py test и в настоящее время дает сбой с ошибкой:

django.db.utils.ProgrammingError: relation "auth_user" does not exist.

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

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

Пользователь postgres имеет все привилегии и CREATEDB в базе данных, поэтому со стороны postgres все в порядке.

Это полное исключение:

Traceback (most recent call last):
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "auth_user" does not exist


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/agent/jenkins/workspace/INP-Backend/manage.py", line 22, in <module>
    main()
  File "/home/agent/jenkins/workspace/INP-Backend/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 440, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/commands/test.py", line 24, in run_from_argv
    super().run_from_argv(argv)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/base.py", line 402, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/base.py", line 448, in execute
    output = self.handle(*args, **options)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/commands/test.py", line 68, in handle
    failures = test_runner.run_tests(test_labels)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/test/runner.py", line 1045, in run_tests
    old_config = self.setup_databases(
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/test/runner.py", line 941, in setup_databases
    return _setup_databases(
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/test/utils.py", line 220, in setup_databases
    connection.creation.create_test_db(
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/base/creation.py", line 78, in create_test_db
    call_command(
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/__init__.py", line 198, in call_command
    return command.execute(*args, **defaults)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/base.py", line 448, in execute
    output = self.handle(*args, **options)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/base.py", line 96, in wrapped
    res = handle_func(*args, **kwargs)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/commands/migrate.py", line 314, in handle
    self.sync_apps(connection, executor.loader.unmigrated_apps)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/core/management/commands/migrate.py", line 480, in sync_apps
    self.stdout.write("    Running deferred SQL...")
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/base/schema.py", line 164, in __exit__
    self.execute(sql)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/base/schema.py", line 199, in execute
    cursor.execute(sql, params)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 103, in execute
    return super().execute(sql, params)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/agent/jenkins/workspace/INP-Backend/venv/lib/python3.9/site-packages/django/db/backends/utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "auth_user" does not exist

РЕДАКТИРОВАТЬ Я не считаю, что этот вопрос следует пометить как дубликат. У меня возникла очень специфическая проблема: миграция не была полностью выполнена из-за отсутствия каталога миграции/файла __init__.py. Это было особенно сложно отладить, поскольку таблицы взяты из установленного стороннего пакета.

ты пробовал бежать python manage.py migrate?

djvg 09.04.2024 09:30

Да, миграции – это нормально. Проверяя обычную базу данных, я вижу, что все таблицы, включая «auth_user», находятся там. Однако я не думаю, что это актуально, поскольку django создает новую тестовую базу данных и автоматически переносит ее.

tumpa02 09.04.2024 09:32

Это правда. Я подумал, что это может дать некоторые подсказки.

djvg 09.04.2024 09:33

Что касается подсказок, все файлы миграции примерно для 30 приложений созданы правильно, и миграция создает все таблицы без каких-либо ошибок.

tumpa02 09.04.2024 09:34

У вас в настройках одна конфигурация БД или несколько?

djvg 09.04.2024 09:45

и есть ли у вас модели без миграций, например. определено в ваших тестах?

djvg 09.04.2024 09:50

В настройках только одна конфигурация БД. Ни одна модель не обходится без миграций, я вручную зашел на свой промежуточный сервер, где находится еще один экземпляр того же приложения. Вытащил последнюю версию, без проблем запустил новые миграции и без проблем провел тесты. Кажется, все это указывает на некоторую проблему с созданием тестовой базы данных в среде jenkins. Однако я понятия не имею, с чего начать отладку, поскольку это выглядит как обычная ошибка отсутствия миграции.

tumpa02 09.04.2024 10:20

Давайте продолжим обсуждение в чате.

djvg 09.04.2024 10:28

Обратная трассировка предполагает, что Django еще даже не запускал тесты, произошла ошибка при выполнении миграции для тестовой базы данных. Можете ли вы выполнить миграцию для новой базы данных или произойдет аналогичная ошибка?

Abdul Aziz Barkat 09.04.2024 10:34

некоторые связанные вопросы: stackoverflow.com/q/56355516 , stackoverflow.com/q/50544714 , stackoverflow.com/q/69495933

djvg 09.04.2024 10:39

@AbdulAzizBarkat ИМХО, вопрос должен оставаться открытым, поскольку предоставленные ссылки не отвечают на этот конкретный вопрос: текущая проблема возникает только при запуске тестов, и ОП явно упоминает, что миграция прошла успешно.

djvg 09.04.2024 10:58

@djvg миграция на 100% завершится неудачно для новой базы данных в случае с ОП, а также это сработало только для них, потому что у них уже была существующая база данных. Проблема в принципе та же. Двойное закрытие не означает, что вопрос плохой, кстати, это может остаться указателем для этого вопроса :) (ИМО, ответы на этот вопрос гораздо более ясны, чем тот, который опубликован здесь)

Abdul Aziz Barkat 09.04.2024 11:01

@djvg, чтобы уточнить, ошибка здесь тоже только в миграции. Одним из этапов настройки тестовой базы данных является запуск в ней миграции.

Abdul Aziz Barkat 09.04.2024 11:03

Ниже я опубликовал ответ о том, что решило мою проблему. Однако я до сих пор не совсем понимаю, почему это решило проблему. Когда Django создает тестовую базу данных для модульного тестирования, он должен выполнить автоматическую миграцию этой базы данных. Если бы мне не хватало таблиц для модели, которая не используется в модульных тестах, почему бы это вызвало исключение?

tumpa02 09.04.2024 12:26

@AbdulAzizBarkat Я выполнил новую миграцию в новой базе данных. Чтобы уточнить, без предыдущих файлов миграции и в пустой базе данных. Все миграции прошли успешно. Таблицы из стороннего приложения не были созданы, но миграция не выдавала ошибку, как и все остальные части приложения. По сути все работает, за исключением стороннего приложения, которое является инструментом разработки.

tumpa02 09.04.2024 12:32

«без предыдущих файлов миграции и в пустой базе данных» отличается от «без ранее примененных миграций». Создание новых файлов миграции (вам не следует делать это в рабочей среде!) на самом деле не является эффективным сравнением (миграции похожи на дерево зависимостей), если вы работаете с теми же файлами миграции (те же установленные приложения и т. д.), что и вы. смогу воспроизвести ошибку. Опять же, ошибка на самом деле не связана с тестами, запуск тестов предполагает выполнение миграции в тестовую базу данных, что и является причиной ошибки.

Abdul Aziz Barkat 09.04.2024 12:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
16
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил проблему. После того, как @djvg упомянул модели без миграции, я углубился в тему. Оказывается, приложение не переносилось автоматически, и для него необходимо было выполнить миграцию вручную.

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

О, так приложение, в котором использовалась ваша пользовательская модель, не имело каталога migration или в каталоге отсутствовал файл __init__.py?

Abdul Aziz Barkat 09.04.2024 10:47

Правильно. На самом деле это был установленный сторонний пакет, в котором отсутствовал файл __init__.py, поэтому он не переносит его автоматически.

tumpa02 09.04.2024 12:24

Если это стороннее приложение, вам следует избегать создания для него миграции. Если дело в том, что файл __init__.py просто отсутствовал, и вы на самом деле не создавали для него никаких миграций, все должно быть в порядке. В любом случае вам следует сообщить об этом разработчику приложения. См.: stackoverflow.com/a/38277776

Abdul Aziz Barkat 09.04.2024 12:48

Другие вопросы по теме