Как подсчитать объекты модели в pytest-django?
Хотя у меня прекрасно получается получить количество объектов в python manage.py shell
, почему-то тест возвращает всегда 0.
Что я упускаю?
#myapp/test_.py
import pytest
from .models import Organization
@pytest.mark.django_db
def test_organization():
assert Organization.objects.count() == 10
$ pytest
:
E assert 0 == 10
E + where 0 = count()
E + where count = <django.db.models.manager.Manager object at 0x734e379b0790>.count
E + where <django.db.models.manager.Manager object at 0x734e379b0790> = Organization.objects
Тестовая база данных
Тесты, требующие наличия базы данных (а именно, тесты моделей), не будут использовать вашу "настоящую" (производственную) базу данных. Для тестов создаются отдельные пустые базы данных.
Независимо от того, прошли тесты или нет, тестовые базы данных уничтожаются после выполнения всех тестов.
Вы можете предотвратить уничтожение тестовых баз данных, используя опцию test --keepdb. Это позволит сохранить тестовую базу данных между запусками. Если база данных не существует, она сначала будет создана. Любые миграции также будут применены для поддержания ее в актуальном состоянии.
Как описано в предыдущем разделе, если прогон теста принудительно прерван, тестовая база данных может быть не уничтожена. При следующем запуске вам будет задан вопрос, хотите ли вы повторно использовать или уничтожить базу данных. Используйте опцию test --noinput, чтобы подавить этот запрос и автоматически уничтожить базу данных. Это может быть полезно при выполнении тестов на сервере непрерывной интеграции, где тесты могут быть прерваны, например, по таймауту.
Имена тестовых баз данных по умолчанию создаются путем добавления test_ к значению каждого NAME в DATABASES. При использовании SQLite тесты по умолчанию будут использовать базу данных in-memory (т.е. база данных будет создаваться в памяти, минуя файловую систему!). Словарь TEST в DATABASES предлагает ряд настроек для конфигурирования тестовой базы данных. Например, если вы хотите использовать другое имя базы данных, укажите NAME в словаре TEST для любой базы данных в DATABASES.
В PostgreSQL USER также потребуется доступ на чтение к встроенной базе данных postgres.
Кроме использования отдельной базы данных, тестовый прогон в остальном будет использовать все те же настройки базы данных, что и в вашем файле настроек: ENGINE, USER, HOST и т. д. Тестовая база данных создается пользователем, указанным в USER, поэтому вам необходимо убедиться, что данная учетная запись пользователя обладает достаточными привилегиями для создания новой базы данных в системе.
Для более тонкого контроля над кодировкой символов в тестовой базе данных используйте опцию CHARSET TEST. Если вы используете MySQL, вы также можете использовать опцию COLLATION для управления конкретной кодировкой, используемой тестовой базой данных. Подробности об этих и других дополнительных настройках см. в документации по настройкам.
При использовании базы данных in-memory с SQLite общий кэш включен, поэтому вы можете писать тесты с возможностью совместного использования базы данных между потоками.
https://docs.djangoproject.com/en/5.1/topics/testing/overview/#the-test-database