Дополнительные темы тестирования
Фабрика запросов
-
class RequestFactory[source]
Класс RequestFactory имеет тот же API, что и клиент тестирования. Однако вместо имитации поведения браузера, RequestFactory предоставляет способ создания экземпляра запроса, который может быть использован в качестве первого аргумента для любого представления. Это означает, что вы можете протестировать функцию представления так же, как и любую другую функцию — как "черный ящик", с точно известными входными данными, проверяя конкретные выходные данные.
API RequestFactory представляет собой слегка ограниченный подмножество API клиента тестирования:
- Он имеет доступ только к HTTP-методам
get(),post(),put(),delete(),head(),options()иtrace(). - Эти методы принимают все те же аргументы, кроме
follow. Поскольку это всего лишь фабрика для создания запросов, обработка ответа остается на вашей стороне. - Он не поддерживает мидлварь. Атрибуты сессии и аутентификации должны быть предоставлены самим тестом, если они необходимы для корректной работы представления.
Был добавлен параметр query_params.
Пример
Ниже приведен пример модульного теста, использующего фабрику запросов:
from django.contrib.auth.models import AnonymousUser, User
from django.test import RequestFactory, TestCase
from .views import MyView, my_view
class SimpleTest(TestCase):
def setUp(self):
# Every test needs access to the request factory.
self.factory = RequestFactory()
self.user = User.objects.create_user(
username="jacob", email="jacob@…", password="top_secret"
)
def test_details(self):
# Create an instance of a GET request.
request = self.factory.get("/customer/details")
# Recall that middleware are not supported. You can simulate a
# logged-in user by setting request.user manually.
request.user = self.user
# Or you can simulate an anonymous user by setting request.user to
# an AnonymousUser instance.
request.user = AnonymousUser()
# Test my_view() as if it were deployed at /customer/details
response = my_view(request)
# Use this syntax for class-based views.
response = MyView.as_view()(request)
self.assertEqual(response.status_code, 200)
AsyncRequestFactory
-
class AsyncRequestFactory[source]
RequestFactory создаёт запросы в стиле WSGI. Если вы хотите создать запросы в стиле ASGI, включая правильный ASGI scope, вы можете использовать django.test.AsyncRequestFactory.
Этот класс полностью совместим по API с RequestFactory, с единственным отличием — он возвращает экземпляры ASGIRequest вместо экземпляров WSGIRequest. Все его методы по-прежнему являются синхронными вызовами.
Произвольные ключевые аргументы в defaults добавляются непосредственно в ASGI-scope.
Был добавлен параметр query_params.
Тестирование представлений на основе классов
Для тестирования представлений на основе классов вне цикла запроса/ответа необходимо убедиться, что они правильно настроены, вызвав setup() после их инициализации.
Например, предположим следующее представление на основе класса:
views.pyfrom django.views.generic import TemplateView
class HomeView(TemplateView):
template_name = "myapp/home.html"
def get_context_data(self, **kwargs):
kwargs["environment"] = "Production"
return super().get_context_data(**kwargs)
Вы можете напрямую протестировать метод get_context_data(), сначала инициализировав представление, а затем передав request в setup(), прежде чем продолжить код вашего теста:
tests.pyfrom django.test import RequestFactory, TestCase
from .views import HomeView
class HomePageTest(TestCase):
def test_environment_set_in_context(self):
request = RequestFactory().get("/")
view = HomeView()
view.setup(request)
context = view.get_context_data()
self.assertIn("environment", context)
Тесты и несколько имен хостов
Настройка ALLOWED_HOSTS проверяется во время выполнения тестов. Это позволяет клиенту тестов различать внутренние и внешние URL-адреса.
Проекты, поддерживающие многопользовательский доступ или иным образом изменяющие бизнес-логику на основе хоста запроса и использующие пользовательские имена хостов в тестах, должны включать эти хосты в ALLOWED_HOSTS.
Первый способ сделать это — добавить хосты в файл настроек. Например, набор тестов для docs.djangoproject.com включает следующее:
from django.test import TestCase
class SearchFormTestCase(TestCase):
def test_empty_get(self):
response = self.client.get(
"/en/dev/search/",
headers={"host": "docs.djangoproject.dev:8000"},
)
self.assertEqual(response.status_code, 200)
и файл настроек включает список доменов, поддерживаемых проектом:
ALLOWED_HOSTS = ["www.djangoproject.dev", "docs.djangoproject.dev", ...]
Другой вариант — добавить необходимые хосты в ALLOWED_HOSTS с помощью override_settings() или modify_settings(). Этот вариант может быть предпочтительнее в автономных приложениях, которые не могут упаковать свой собственный файл настроек, или для проектов, где список доменов не является статичным (например, поддомены для многопользовательского доступа). Например, вы могли бы написать тест для домена http://otherserver/ следующим образом:
from django.test import TestCase, override_settings
class MultiDomainTestCase(TestCase):
@override_settings(ALLOWED_HOSTS=["otherserver"])
def test_other_domain(self):
response = self.client.get("http://otherserver/foo/bar/")
Отключение проверки ALLOWED_HOSTS (ALLOWED_HOSTS = ['*']) при выполнении тестов предотвращает выдачу клиентом тестов полезного сообщения об ошибке, если вы выполняете переадресацию на внешний URL-адрес.
Тесты и несколько баз данных
Тестирование конфигураций мастер/раздача
Если вы тестируете конфигурацию с несколькими базами данных с репликацией мастер/раздача, эта стратегия создания тестовых баз данных создает проблему. Когда тестовые базы данных создаются, репликации не будет, и в результате данные, созданные на основном сервере, не будут видны на реплике.
Для компенсации этого Django позволяет определить базу данных как тестовое зеркало. Рассмотрим следующий (упрощенный) пример конфигурации базы данных:
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "myproject",
"HOST": "dbprimary",
# ... plus some other settings
},
"replica": {
"ENGINE": "django.db.backends.mysql",
"NAME": "myproject",
"HOST": "dbreplica",
"TEST": {
"MIRROR": "default",
},
# ... plus some other settings
},
}
В этой настройке у нас есть два сервера баз данных: dbprimary, описанный псевдонимом базы данных default, и dbreplica, описанный псевдонимом replica. Как можно предположить, dbreplica был настроен администратором базы данных как реплика чтения базы данных dbprimary, поэтому в обычной работе любые записи в default будут появляться в replica.
Если Django создаст две независимые тестовые базы данных, это нарушит любые тесты, которые ожидают репликации. Однако база данных replica была настроена как тестовое зеркало (используя настройку теста MIRROR), что указывает на то, что в тестовом режиме replica должна рассматриваться как зеркало default.
При настройке тестовой среды тестовая версия replica не будет создана. Вместо этого подключение к replica будет перенаправлено на default. В результате записи в default будут появляться в replica — но это происходит потому, что это фактически одна и та же база данных, а не потому, что между двумя базами данных существует репликация данных. Поскольку это зависит от транзакций, тесты должны использовать TransactionTestCase вместо TestCase.
Управление порядком создания тестовых баз данных
По умолчанию Django предполагает, что все базы данных зависят от базы данных default, и поэтому всегда создаёт базу данных default первой. Однако порядок создания других баз данных в вашей тестовой настройке не гарантируется.
Если ваша конфигурация базы данных требует определённого порядка создания, вы можете указать зависимости, используя настройку теста DEPENDENCIES. Рассмотрим следующий (упрощённый) пример конфигурации базы данных:
DATABASES = {
"default": {
# ... db settings
"TEST": {
"DEPENDENCIES": ["diamonds"],
},
},
"diamonds": {
# ... db settings
"TEST": {
"DEPENDENCIES": [],
},
},
"clubs": {
# ... db settings
"TEST": {
"DEPENDENCIES": ["diamonds"],
},
},
"spades": {
# ... db settings
"TEST": {
"DEPENDENCIES": ["diamonds", "hearts"],
},
},
"hearts": {
# ... db settings
"TEST": {
"DEPENDENCIES": ["diamonds", "clubs"],
},
},
}
В этой конфигурации база данных diamonds будет создана первой, так как она единственная без зависимостей. Базы данных с псевдонимами default и clubs будут созданы затем (хотя порядок их создания не гарантируется), затем hearts, и наконец spades.
Если в определении DEPENDENCIES существуют циклические зависимости, будет поднято исключение ImproperlyConfigured.
Дополнительные возможности класса TransactionTestCase
-
TransactionTestCase.available_apps -
Предупреждение
Этот атрибут является частью закрытого API. Он может быть изменён или удалён в будущем без периода устаревания, например, для адаптации к изменениям в загрузке приложений.
Он используется для оптимизации собственного набора тестов Django, который содержит сотни моделей, но без связей между моделями разных приложений.
По умолчанию,
available_appsустанавливается в значениеNone. После каждого теста Django вызываетflushдля сброса состояния базы данных. Это очищает все таблицы и генерирует сигналpost_migrate, который воссоздаёт один тип содержимого и четыре разрешения для каждой модели. Эта операция становится ресурсоёмкой пропорционально количеству моделей.Установка
available_appsв список приложений указывает Django вести себя так, как будто доступны только модели из этих приложений. ПоведениеTransactionTestCaseизменяется следующим образом:-
post_migrateсрабатывает перед каждым тестом для создания типов содержимого и разрешений для каждой модели в доступных приложениях, в случае их отсутствия. - После каждого теста Django очищает только таблицы, соответствующие моделям в доступных приложениях. Однако на уровне базы данных обрезание может распространяться на связанные модели в недоступных приложениях. Кроме того,
post_migrateне срабатывает; он будет вызван следующимTransactionTestCaseпосле выбора правильного набора приложений.
Поскольку база данных не полностью очищается, если тест создаёт экземпляры моделей, не включённых в
available_apps, они будут утечкой и могут привести к сбою не связанных тестов. Будьте осторожны с тестами, использующими сессии; движок сессий по умолчанию хранит их в базе данных.Поскольку
post_migrateне генерируется после очистки базы данных, её состояние послеTransactionTestCaseотличается от состояния послеTestCase: отсутствуют строки, созданные обработчиками сигналаpost_migrate. Учитывая порядок выполнения тестов, это не проблема, если всеTransactionTestCaseв наборе тестов объявляютavailable_appsили же ни один из них этого не делает.available_appsявляется обязательным в собственном наборе тестов Django. -
-
TransactionTestCase.reset_sequences -
Установка
reset_sequences = 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)Если вы не тестируете номера последовательностей первичных ключей, рекомендуется не жестко кодировать значения первичных ключей в тестах.
Использование
reset_sequences = Trueзамедлит выполнение теста, поскольку сброс первичного ключа — это относительно дорогостоящая операция для базы данных.
Принудительное последовательное выполнение классов тестов
Если у вас есть классы тестов, которые нельзя запускать параллельно (например, из-за совместного использования ресурса), вы можете использовать django.test.testcases.SerializeMixin для их последовательного выполнения. Этот миксин использует файловую систему lockfile.
Например, вы можете использовать __file__, чтобы гарантировать, что все классы тестов в одном файле, наследующие от SerializeMixin, будут выполняться последовательно:
import os
from django.test import TestCase
from django.test.testcases import SerializeMixin
class ImageTestCaseMixin(SerializeMixin):
lockfile = __file__
def setUp(self):
self.filename = os.path.join(temp_storage_dir, "my_file.png")
self.file = create_file(self.filename)
class RemoveImageTests(ImageTestCaseMixin, TestCase):
def test_remove_image(self):
os.remove(self.filename)
self.assertFalse(os.path.exists(self.filename))
class ResizeImageTests(ImageTestCaseMixin, TestCase):
def test_resize_image(self):
resize_image(self.file, (48, 48))
self.assertEqual(get_image_size(self.file), (48, 48))
Использование тестового запуска Django для тестирования повторно используемых приложений
Если вы пишете приложение, предназначенное для повторного использования, вы можете использовать тестовый запуск Django для выполнения собственного набора тестов и тем самым воспользоваться инфраструктурой тестирования Django.
Общая практика — создание директории tests рядом с кодом приложения со следующей структурой:
runtests.py
polls/
__init__.py
models.py
...
tests/
__init__.py
models.py
test_settings.py
tests.py
Давайте посмотрим внутрь нескольких из этих файлов:
runtests.py#!/usr/bin/env python
import os
import sys
import django
from django.conf import settings
from django.test.utils import get_runner
if __name__ == "__main__":
os.environ["DJANGO_SETTINGS_MODULE"] = "tests.test_settings"
django.setup()
TestRunner = get_runner(settings)
test_runner = TestRunner()
failures = test_runner.run_tests(["tests"])
sys.exit(bool(failures))
Это скрипт, который вы вызываете для выполнения набора тестов. Он настраивает среду Django, создаёт тестовую базу данных и запускает тесты.
Для большей ясности этот пример содержит только минимум, необходимый для использования тестового запуска Django. Вы можете добавить командно-строковые опции для управления детализацией, передачи конкретных меток тестов для запуска и т. д.
tests/test_settings.pySECRET_KEY = "fake-key"
INSTALLED_APPS = [
"tests",
]
Этот файл содержит настройки Django, необходимые для выполнения тестов вашего приложения.
Опять же, это минимальный пример; ваши тесты могут потребовать дополнительных настроек для выполнения.
Поскольку пакет tests включён в INSTALLED_APPS при выполнении ваших тестов, вы можете определять модели только для тестов в файле models.py.
Использование различных фреймворков тестирования
Очевидно, что unittest не является единственным фреймворком тестирования Python. Хотя Django не предоставляет явную поддержку альтернативных фреймворков, он предоставляет способ вызова тестов, созданных для альтернативного фреймворка, как если бы они были обычными тестами Django.
Когда вы запускаете ./manage.py test, Django обращается к настройке TEST_RUNNER, чтобы определить, что делать. По умолчанию TEST_RUNNER указывает на 'django.test.runner.DiscoverRunner'. Этот класс определяет стандартное поведение тестирования Django. Это поведение включает:
- Выполнение глобальной подготовки перед тестом.
- Поиск тестов в любом файле ниже текущего каталога, имя которого соответствует шаблону
test*.py. - Создание тестовых баз данных.
- Запуск
migrateдля установки моделей и начальных данных в тестовые базы данных. - Запуск системных проверок.
- Запуск найденных тестов.
- Удаление тестовых баз данных.
- Выполнение глобального завершения после теста.
Если вы определите свой собственный класс исполнителя тестов и укажете TEST_RUNNER на этот класс, Django выполнит ваш исполнитель тестов всякий раз, когда вы запустите ./manage.py test. Таким образом, можно использовать любой фреймворк тестирования, который может быть выполнен из кода Python, или изменить процесс выполнения тестов Django, чтобы удовлетворить любые ваши требования к тестированию.
Определение исполнителя тестов
Исполнитель тестов — это класс, определяющий метод run_tests(). Django поставляется с классом DiscoverRunner, который определяет стандартное поведение тестирования Django. Этот класс определяет run_tests() точку входа, а также набор других методов, используемых run_tests() для настройки, выполнения и завершения тестового набора.
-
class DiscoverRunner(pattern='test*.py', top_level=None, verbosity=1, interactive=True, failfast=False, keepdb=False, reverse=False, debug_mode=False, debug_sql=False, parallel=0, tags=None, exclude_tags=None, test_name_patterns=None, pdb=False, buffer=False, enable_faulthandler=True, timing=True, shuffle=False, logger=None, durations=None, **kwargs)[source] -
DiscoverRunnerбудет искать тесты в любом файле, соответствующем шаблонуpattern.top_levelможет быть использован для указания каталога, содержащего ваши основные модули Python. Обычно Django может определить это автоматически, поэтому указывать этот параметр не обязательно. Если указан, он, как правило, должен быть каталогом, содержащим ваш файлmanage.py.verbosityопределяет количество уведомлений и отладочной информации, которые будут выведены на консоль;1— отсутствие вывода,1— обычный вывод, а2— подробный вывод.Если
interactiveравноTrue, тестовый набор имеет право запросить у пользователя инструкции при выполнении тестового набора. Примером такого поведения может быть запрос разрешения на удаление существующей тестовой базы данных. ЕслиinteractiveравноFalse, тестовый набор должен работать без ручного вмешательства.Если
failfastравноTrue, тестовый набор остановит выполнение после обнаружения первой ошибки теста.Если
keepdbравноTrue, тестовый набор будет использовать существующую базу данных или создать её при необходимости. ЕслиFalse, новая база данных будет создана, и пользователя попросят удалить существующую, если она есть.Если
reverseравноTrue, тестовые случаи будут выполнены в обратном порядке. Это может быть полезно для отладки тестов, которые не изолированы должным образом и имеют побочные эффекты. Группировка по тестовому классу сохраняется при использовании этого параметра. Этот параметр можно использовать совместно с--shuffle, чтобы изменить порядок для определённого случайного зерна.debug_modeопределяет, каким должно быть значение настройкиDEBUGперед запуском тестов.parallelопределяет количество процессов. Еслиparallelбольше, чем1, тестовый набор будет выполняться вparallelпроцессах. Если количество тестовых классов меньше, чем заданное количество процессов, Django уменьшит количество процессов соответственно. Каждый процесс получает свою собственную базу данных. Этот параметр требует стороннего пакетаtblibдля корректного отображения отладочных сообщений.tagsможет использоваться для указания набора меток для фильтрации тестов. Может быть объединён сexclude_tags.exclude_tagsможет быть использован для указания набора меток для исключения тестов. Может быть объединён сtags.Если
debug_sqlравноTrue, неудачные тестовые случаи будут выводить SQL-запросы, записанные в журнал django.db.backends, а также трассировку стека. Еслиverbosityравно2, то запросы во всех тестах выводятся.test_name_patternsможет использоваться для указания набора шаблонов для фильтрации тестовых методов и классов по их именам.Если
pdbравноTrue, отладчик (pdbилиipdb) будет запущен при каждой ошибке или сбое теста.Если
bufferравноTrue, результаты прошедших тестов будут отброшены.Если
enable_faulthandlerравноTrue,faulthandlerбудет включено.Если
timingравноTrue, будут показаны временные метки тестов, включая настройку базы данных и общее время выполнения.Если
shuffle— целое число, тестовые случаи будут перемешаны в случайном порядке перед выполнением, используя целое число в качестве случайного зерна. ЕслиshuffleравноNone, зерно будет сгенерировано случайным образом. В обоих случаях зерно будет записано и установлено наself.shuffle_seedперед запуском тестов. Этот параметр может помочь выявить тесты, которые не изолированы должным образом. Группировка по тестовому классу сохраняется при использовании этого параметра.loggerможет быть использован для передачи объекта Python объекта логгера. Если он предоставлен, логгер будет использоваться для записи сообщений вместо вывода на консоль. Объект логгера будет учитывать свой уровень регистрации, а неverbosity.durationsпокажет список N самых медленных тестовых случаев. Установка этого параметра на0приведет к отображению продолжительности выполнения всех тестов. Требуется Python 3.12 и выше.Django время от времени может расширять возможности исполнителя тестов, добавляя новые аргументы. Объявление
**kwargsпозволяет это расширение. Если вы наследуете отDiscoverRunnerили создаёте свой собственный исполнитель тестов, убедитесь, что он принимает**kwargs.Ваш исполнитель тестов также может определять дополнительные параметры командной строки. Создайте или переопределите метод класса
add_arguments(cls, parser)и добавьте пользовательские аргументы, вызвавparser.add_argument()внутри метода, чтобы командаtestмогла использовать эти аргументы.
Атрибуты
-
DiscoverRunner.test_suite -
Класс, используемый для построения набора тестов. По умолчанию он установлен на
unittest.TestSuite. Это можно переопределить, если вы хотите реализовать другую логику для сбора тестов.
-
DiscoverRunner.test_runner -
Это класс низкоуровневого исполнителя тестов, который используется для выполнения отдельных тестов и форматирования результатов. По умолчанию он установлен на
unittest.TextTestRunner. Несмотря на неудачное сходство в обозначениях, это не тот же тип класса, что иDiscoverRunner, который охватывает более широкий круг обязанностей. Вы можете переопределить этот атрибут, чтобы изменить способ выполнения и отчёта о результатах тестов.
-
DiscoverRunner.test_loader -
Это класс, который загружает тесты, будь то TestCases, модули или другие, и объединяет их в наборы тестов для выполнения исполнителем. По умолчанию он установлен на
unittest.defaultTestLoader. Вы можете переопределить этот атрибут, если ваши тесты будут загружаться необычным способом.
Методы
-
DiscoverRunner.run_tests(test_labels, **kwargs)[source] -
Запустить набор тестов.
test_labelsпозволяет указать, какие тесты нужно запускать, и поддерживает несколько форматов (см.DiscoverRunner.build_suite()для списка поддерживаемых форматов).Этот метод должен возвращать количество завершившихся с ошибкой тестов.
-
classmethod DiscoverRunner.add_arguments(parser)[source] -
Переопределите этот метод класса, чтобы добавить настраиваемые аргументы, принимаемые командой управления
test. См.argparse.ArgumentParser.add_argument()для получения подробностей о добавлении аргументов в парсер.
-
DiscoverRunner.setup_test_environment(**kwargs)[source] -
Настраивает тестовую среду, вызывая
setup_test_environment()и устанавливаяDEBUGв значениеself.debug_mode(по умолчаниюFalse).
-
DiscoverRunner.build_suite(test_labels=None, **kwargs)[source] -
Создает набор тестов, соответствующий предоставленным меткам тестов.
test_labels— список строк, описывающих тесты, которые нужно запустить. Метка теста может иметь одну из четырёх форм:-
path.to.test_module.TestCase.test_method— Запустить один метод теста в классе тестового случая. -
path.to.test_module.TestCase— Запустить все методы теста в тестовом случае. -
path.to.module— Найти и запустить все тесты в указанном пакете или модуле Python. -
path/to/directory— Найти и запустить все тесты в указанной директории.
Если у
test_labelsесть значениеNone, тестовый запуск найдет тесты во всех файлах в текущей директории, имена которых соответствуют егоpattern(см. выше).Возвращает экземпляр
TestSuite, готовый к запуску. -
-
DiscoverRunner.setup_databases(**kwargs)[source] -
Создаёт тестовые базы данных, вызывая
setup_databases().
-
DiscoverRunner.run_checks(databases)[source] -
Запускает системные проверки на тестовом
databases.
-
DiscoverRunner.run_suite(suite, **kwargs)[source] -
Запускает набор тестов.
Возвращает результат, полученный в ходе запуска набора тестов.
-
DiscoverRunner.get_test_runner_kwargs()[source] -
Возвращает ключевые аргументы для создания экземпляра
DiscoverRunner.test_runner.
-
DiscoverRunner.teardown_databases(old_config, **kwargs)[source] -
Удаляет тестовые базы данных, восстанавливая условия до начала теста, вызывая
teardown_databases().
-
DiscoverRunner.teardown_test_environment(**kwargs)[source] -
Восстанавливает среду до состояния до начала теста.
-
DiscoverRunner.suite_result(suite, result, **kwargs)[source] -
Вычисляет и возвращает код возврата, основанный на наборе тестов и результате этого набора тестов.
-
DiscoverRunner.log(msg, level=None)[source] -
Если
loggerзадан, регистрирует сообщение с заданным целым числом уровня регистрации журнала (например,logging.DEBUG,logging.INFOилиlogging.WARNING). В противном случае сообщение выводится в консоль, учитывая текущийverbosity. Например, сообщение не будет выведено, еслиverbosityравно 0; сообщенияINFOи выше будут выведены, еслиverbosityне меньше 1; и сообщенияDEBUGбудут выведены, еслиlevelне меньше 2. По умолчаниюlogging.INFO.
Утилиты тестирования
django.test.utils
Для помощи в создании собственного запускателя тестов Django предоставляет ряд утилит в модуле django.test.utils.
-
setup_test_environment(debug=None)[source] -
Выполняет глобальную настройку перед запуском тестов, например, устанавливает инструменты для системы рендеринга шаблонов и настраивает тестовый ящик для отправки электронных писем.
Если
debugнеNone, то значение настройкиDEBUGобновляется.
-
teardown_test_environment()[source] -
Выполняет глобальную завершающую операцию после запуска тестов, например, удаляет инструменты из системы шаблонов и восстанавливает обычные службы электронной почты.
-
setup_databases(verbosity, interactive, *, time_keeper=None, keepdb=False, debug_sql=False, parallel=0, aliases=None, serialized_aliases=None, **kwargs)[source] -
Создает тестовые базы данных.
Возвращает структуру данных, которая содержит достаточно информации для отмены внесенных изменений. Эти данные будут переданы функции
teardown_databases()по завершении тестирования.Аргумент
aliasesопределяет, для каких псевдонимовDATABASESследует создавать тестовые базы данных. Если он не указан, используется всеDATABASESпсевдонимы.Аргумент
serialized_aliasesопределяет, какой подмножествоaliasesтестовых баз данных следует сериализовать, чтобы можно было использовать функцию serialized_rollback. Если он не указан, используется значение по умолчаниюaliases.
-
teardown_databases(old_config, parallel=0, keepdb=False)[source] -
Удаляет тестовые базы данных, восстанавливая первоначальные условия.
old_config— это структура данных, определяющая изменения в конфигурации базы данных, которые необходимо отменить. Это значение возвращается методомsetup_databases().
django.db.connection.creation
Модуль создания подключения к базе данных также предоставляет некоторые утилиты, которые могут быть полезны во время тестирования.
-
create_test_db(verbosity=1, autoclobber=False, serialize=True, keepdb=False) -
Создаёт новую тестовую базу данных и выполняет
migrateна ней.verbosityимеет такое же поведение, как и вrun_tests().autoclobberописывает поведение, которое произойдёт, если будет обнаружена база данных с тем же именем, что и тестовая база данных:- Если
autoclobberравноFalse, пользователю будет предложено подтвердить удаление существующей базы данных.sys.exitбудет вызвано, если пользователь не подтвердит. - Если
autoclobberравноTrue, база данных будет удалена без консультации с пользователем.
serializeопределяет, сериализует ли Django базу данных в строку JSON в оперативной памяти перед запуском тестов (используется для восстановления состояния базы данных между тестами, если у вас нет транзакций). Вы можете установить это вFalse, чтобы ускорить время создания, если у вас нет тестовых классов с serialized_rollback=True.keepdbопределяет, следует ли использовать существующую базу данных при запуске теста или создать новую. ЕслиTrue, будет использоваться существующая база данных, или она будет создана, если её нет. ЕслиFalse, будет создана новая база данных, запросив у пользователя удаление существующей, если она есть.Возвращает имя созданной тестовой базы данных.
create_test_db()имеет побочный эффект изменения значенияNAMEвDATABASESв соответствии с именем тестовой базы данных. - Если
-
destroy_test_db(old_database_name, verbosity=1, keepdb=False) -
Удаляет базу данных с именем, соответствующим значению
NAMEвDATABASESи устанавливаетNAMEв значениеold_database_name.Аргумент
verbosityимеет такое же поведение, как и дляDiscoverRunner.Если аргумент
keepdbравенTrue, то подключение к базе данных будет закрыто, но база данных не будет удалена.
-
serialize_db_to_string() -
Сериализует базу данных в строку JSON в оперативной памяти, которую можно использовать для восстановления состояния базы данных между тестами, если бэкенд не поддерживает транзакции или если ваш набор содержит тестовые классы с serialized_rollback=True.
Эта функция должна вызываться только после создания всех тестовых баз данных, так как процесс сериализации может привести к запросам к базам данных, не являющимся тестовыми, в зависимости от вашей конфигурации маршрутизации.
Интеграция с coverage.py
Покрытие кода описывает, какая часть исходного кода была протестирована. Оно показывает, какие части вашего кода используются тестами, а какие нет. Это важная часть тестирования приложений, поэтому настоятельно рекомендуется проверить покрытие ваших тестов.
Django можно легко интегрировать с coverage.py, инструментом для измерения покрытия кода Python-программ. Сначала установите coverage. Затем выполните следующее из вашей папки проекта, содержащей manage.py:
coverage run --source='.' manage.py test myapp
Это выполнит ваши тесты и соберет данные о покрытии исполненных файлов в вашем проекте. Вы можете увидеть отчёт об этих данных, набрав следующую команду:
coverage report
Обратите внимание, что некоторый код Django был выполнен во время запуска тестов, но он не отображается здесь из-за флага source, переданного предыдущей команде.
Для получения дополнительных опций, таких как аннотированные HTML-списки, показывающие пропущенные строки, см. документацию coverage.py.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/topics/testing/advanced/