Дополнительные темы тестирования
Фабрика запросов
-
class RequestFactory
Класс RequestFactory разделяет тот же API, что и клиент тестирования. Однако вместо имитации работы браузера, RequestFactory предоставляет способ создания экземпляра запроса, который можно использовать в качестве первого аргумента для любого представления. Это означает, что вы можете протестировать функцию представления так же, как вы бы тестировали любую другую функцию — как «черный ящик», с точно известными входными данными, проверяя определённые выходные данные.
API для RequestFactory представляет собой несколько ограниченный подмножество API клиента тестирования:
- Он имеет доступ только к HTTP-методам
get(),post(),put(),delete(),head(),options()иtrace(). - Эти методы принимают все те же аргументы, кроме
follow. Поскольку это всего лишь фабрика для создания запросов, вам нужно самостоятельно обработать ответ. - Он не поддерживает middleware. Атрибуты сессии и аутентификации должны быть предоставлены самим тестом, если они необходимы для корректной работы представления.
Пример
Следующий пример демонстрирует юнит-тест с использованием фабрики запросов:
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
RequestFactory создает запросы по протоколу WSGI. Если вам нужно создать запросы по протоколу ASGI, включая правильный ASGI scope, вы можете использовать django.test.AsyncRequestFactory.
Этот класс напрямую совместим с API RequestFactory, с единственным отличием, заключающимся в том, что он возвращает экземпляры ASGIRequest, а не экземпляры WSGIRequest. Все его методы по-прежнему являются синхронными вызовами.
Тестирование представлений на основе классов
Для тестирования представлений на основе классов вне цикла запроса/ответа необходимо убедиться, что они настроенны корректно, вызвав setup() после создания экземпляра.
Например, предположим следующее представление на основе класса:
from 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(), перед продолжением кода вашего теста:
from 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/', HTTP_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 — но поскольку это фактически та же база данных, а не из-за репликации данных между двумя базами данных.
Управление порядком создания тестовых баз данных
По умолчанию 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
Давайте посмотрим внутрь нескольких из этих файлов:
#!/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. Вы можете добавить командные параметры для управления подробностью, передачи конкретных меток тестов для запуска и т. д.
SECRET_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, **kwargs) -
DiscoverRunnerбудет искать тесты в любом файле, соответствующемpattern.top_levelможно использовать для указания каталога, содержащего ваши модули Python верхнего уровня. Обычно Django может определить это автоматически, поэтому нет необходимости указывать этот параметр. Если указано, это, как правило, каталог, содержащий ваш файлmanage.py.verbosityопределяет количество уведомлений и отладочной информации, которые будут выведены в консоль;1— это стандартный вывод, а2— подробный вывод.Если
interactiveравноTrue, набор тестов имеет право запросить у пользователя инструкции при выполнении набора тестов. Пример такого поведения — запрос разрешения на удаление существующей тестовой базы данных. ЕслиinteractiveравноFalse, набор тестов должен быть способен выполняться без ручного вмешательства.Если
failfastравноTrue, набор тестов будет остановлен после обнаружения первого сбоя теста.Если
keepdbравноTrue, набор тестов будет использовать существующую базу данных или создать её при необходимости. ЕслиFalse, будет создана новая база данных, и пользователя попросят удалить существующую, если она присутствует.Если
reverseравноTrue, тестовые случаи будут выполняться в обратном порядке. Это может быть полезно для отладки тестов, которые не изолированы должным образом и имеют побочные эффекты. Группировка по классам тестов сохраняется при использовании этого параметра.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, будут показаны временные характеристики тестов, включая настройку базы данных и общее время выполнения.Django время от времени может расширять возможности исполнителя тестов, добавляя новые аргументы. Объявление
**kwargsпозволяет осуществлять это расширение. Если вы создаёте подклассDiscoverRunnerили пишете свой собственный исполните тест, убедитесь, что он принимает**kwargs.Ваш исполните тестов также может определять дополнительные параметры командной строки. Создайте или переопределите метод класса
add_arguments(cls, parser)и добавьте пользовательские аргументы, вызвавparser.add_argument()внутри метода, чтобы командаtestсмогла использовать эти аргументы.Добавлено в Django 3.1:Аргумент
bufferбыл добавлен.Добавлено в Django 3.2:Были добавлены аргументы
enable_faulthandlerиtiming.
Атрибуты
-
DiscoverRunner.test_suite -
Класс, используемый для построения набора тестов. По умолчанию он установлен в
unittest.TestSuite. Это можно переопределить, если вы хотите реализовать другую логику для сбора тестов.
-
DiscoverRunner.test_runner -
Это класс низкоуровневого исполнителя тестов, который используется для выполнения отдельных тестов и форматирования результатов. По умолчанию он установлен в
unittest.TextTestRunner. Несмотря на неудачное сходство в обозначениях, это не тот же тип класса, что иDiscoverRunner, который охватывает более широкий круг задач. Вы можете переопределить этот атрибут, чтобы изменить способ выполнения и отчета о результатах тестов.
-
DiscoverRunner.test_loader -
Это класс, который загружает тесты, будь то из TestCases, модулей или иным образом, и объединяет их в наборы тестов для выполнения исполнителем. По умолчанию он установлен в
unittest.defaultTestLoader. Вы можете переопределить этот атрибут, если ваши тесты будут загружаться необычным образом.
Методы
-
DiscoverRunner.run_tests(test_labels, extra_tests=None, **kwargs) -
Выполнить набор тестов.
test_labelsпозволяет указать, какие тесты нужно запускать, и поддерживает несколько форматов (см.DiscoverRunner.build_suite()для списка поддерживаемых форматов).extra_tests— список дополнительныхTestCaseэкземпляров для добавления в набор, который выполняется исполнителем тестов. Эти дополнительные тесты выполняются в дополнение к тем, которые обнаружены в модулях, перечисленных вtest_labels.Этот метод должен возвращать количество не пройденных тестов.
-
classmethod DiscoverRunner.add_arguments(parser) -
Переопределите этот метод класса для добавления пользовательских аргументов, принимаемых командой управления
test. См.argparse.ArgumentParser.add_argument()для получения подробностей о добавлении аргументов в анализатор.
-
DiscoverRunner.setup_test_environment(**kwargs) -
Настраивает тестовую среду, вызывая
setup_test_environment()и устанавливаяDEBUGнаself.debug_mode(по умолчаниюFalse).
-
DiscoverRunner.build_suite(test_labels=None, extra_tests=None, **kwargs) -
Строит набор тестов, соответствующий предоставленным меткам тестов.
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(см. выше).extra_tests— список дополнительныхTestCaseэкземпляров для добавления в набор, который выполняется исполнителем тестов. Эти дополнительные тесты выполняются в дополнение к тем, которые обнаружены в модулях, перечисленных вtest_labels.Возвращает экземпляр
TestSuite, готовый к запуску. -
-
DiscoverRunner.setup_databases(**kwargs) -
Создаёт тестовые базы данных, вызывая
setup_databases().
-
DiscoverRunner.run_checks(databases) -
Выполняет проверки системы системных проверок на тестовом
databases.Добавлено в Django 3.1:Параметр
databasesбыл добавлен.
-
DiscoverRunner.run_suite(suite, **kwargs) -
Выполняет набор тестов.
Возвращает результат, полученный в ходе выполнения набора тестов.
-
DiscoverRunner.get_test_runner_kwargs() -
Возвращает аргументы ключевых слов для инициализации
DiscoverRunner.test_runner.
-
DiscoverRunner.teardown_databases(old_config, **kwargs) -
Уничтожает тестовые базы данных, восстанавливая условия до запуска, вызывая
teardown_databases().
-
DiscoverRunner.teardown_test_environment(**kwargs) -
Восстанавливает среду до запуска.
-
DiscoverRunner.suite_result(suite, result, **kwargs) -
Вычисляет и возвращает код возврата на основе набора тестов и результата этого набора тестов.
Утилиты тестирования
django.test.utils
Для помощи в создании собственного тестового исполнителя Django предоставляет ряд служебных методов в модуле django.test.utils.
-
setup_test_environment(debug=None) -
Выполняет глобальную настройку перед запуском тестов, например, устанавливает инструменты для системы рендеринга шаблонов и настраивает буфер фиктивных писем.
Если
debugнеNone, настройкаDEBUGобновляется до её значения.
-
teardown_test_environment() -
Выполняет глобальную завершающую настройку после тестов, например, удаляет инструменты из системы шаблонов и восстанавливает стандартные службы электронной почты.
-
setup_databases(verbosity, interactive, *, time_keeper=None, keepdb=False, debug_sql=False, parallel=0, aliases=None, **kwargs) -
Создаёт тестовые базы данных.
Возвращает структуру данных, предоставляющую достаточную информацию для отмены внесённых изменений. Эти данные будут переданы функции
teardown_databases()по завершении тестирования.Аргумент
aliasesопределяет, для каких псевдонимовDATABASESдолжны быть настроены тестовые базы данных. Если он не указан, по умолчанию используются все псевдонимыDATABASES.Изменено в Django 3.2:Добавлен аргумент
time_keeper, и все аргументы стали только именованными.
-
teardown_databases(old_config, parallel=0, keepdb=False) -
Удаляет тестовые базы данных, восстанавливая состояние до начала тестирования.
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.Если вы используете стандартный тестовый исполнитель, вы можете контролировать это с помощью записи
SERIALIZEв словареTEST.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, подключение к базе данных будет закрыто, но база данных не будет удалена.
Интеграция с coverage.py
Покрытие кода описывает, сколько исходного кода было протестировано. Оно показывает, какие части вашего кода задействованы тестами, а какие нет. Это важная часть тестирования приложений, поэтому настоятельно рекомендуется проверить покрытие ваших тестов.
Django легко интегрируется с coverage.py, инструментом для измерения покрытия кода Python-программ. Сначала установите coverage.py. Далее выполните следующее из папки вашего проекта, содержащей 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/3.2/topics/testing/advanced/