Содержание страницы
test – пакет регрессионных тестов для Python¶test – Regression tests package for Python
Примечание
Пакет test предназначен только для внутреннего использования Python. Он
dокументирован для разработчиков ядра Python. Использование этого пакета за
пределами стандартной библиотеки Python не рекомендуется, так как
упомянутый здесь код может быть изменён или удалён без уведомления
между выпусками Python.
Пакет test содержит все регрессионные тесты для Python, а также
модули test.support и test.regrtest.
test.support используется для расширения возможностей тестов, а
test.regrtest управляет набором тестов.
Каждый модуль в пакете test, имя которого начинается с test_, является
набором тестов для конкретного модуля или функции. Все новые тесты следует писать
с использованием модулей unittest или doctest. Некоторые старые тесты
написаны в «традиционном» стиле тестирования, сравнивающем вывод,
направленный в sys.stdout; такой стиль теста считается устаревшим.
См. также
Написание модульных тестов для пакета test¶Writing Unit Tests for the test package
Для тестов, использующих модуль unittest, рекомендуется следовать нескольким
правилам. Одно из них – называть модуль тестов, начиная его имя с test_ и заканчивая
названием тестируемого модуля. Методы тестов в модуле тестирования
должны начинаться с test_ и заканчиваться описанием того, что метод тестирует.
Это необходимо, чтобы тестовый драйвер распознавал методы как тестовые.
Кроме того, не следует включать строку документации для метода. Вместо этого
следует использовать комментарий (например, # Tests function returns only True or False)
для документирования тестовых методов. Это связано с тем, что строки документации
выводятся на печать, если они существуют, и таким образом не указывается, какой именно
тест выполняется.
Часто используется стандартная заготовка:
import unittest
from test import support
class MyTestCase1(unittest.TestCase):
# Используйте setUp() и tearDown() только при необходимости
def setUp(self):
... code to execute in preparation for tests ...
def tearDown(self):
... code to execute to clean up after tests ...
def test_feature_one(self):
# Тест первой возможности.
... testing code ...
def test_feature_two(self):
# Тест второй возможности.
... testing code ...
... more test methods ...
class MyTestCase2(unittest.TestCase):
... same structure as MyTestCase1 ...
... more test classes ...
if __name__ == '__main__':
unittest.main()
Этот шаблон кода позволяет запускать набор тестов с помощью test.regrtest,
самостоятельно как скрипт, поддерживающий CLI unittest, или через
CLI python -m unittest.
Цель регрессионного тестирования – попытаться сломать код. Это приводит к нескольким правилам, которым следует следовать:
Набор тестов должен задействовать все классы, функции и константы. Это включает не только внешний API, который будет представлен внешнему миру, но и «приватный» код.
Предпочтительно тестирование методом белого ящика (анализ тестируемого кода при написании тестов). Тестирование методом чёрного ящика (тестирование только опубликованного пользовательского интерфейса) недостаточно для проверки всех граничных и крайних случаев.
Убедитесь, что все возможные значения протестированы, включая недопустимые. Это гарантирует, что не только все допустимые значения принимаются, но и неправильные значения обрабатываются корректно.
Исчерпайте как можно больше путей выполнения кода. Тестируйте места ветвления и соответственно подбирайте входные данные, чтобы гарантировать, что проходит как можно больше различных путей.
Добавляйте явные тесты для любых ошибок, обнаруженных в тестируемом коде. Это гарантирует, что ошибка не возникнет снова, если код будет изменён в будущем.
Убедитесь, что после тестов выполнена очистка (например, закрыты и удалены все временные файлы).
Если тест зависит от конкретного условия операционной системы, то проверьте, что условие уже выполняется, прежде чем запускать тест.
Импортируйте как можно меньше модулей и делайте это как можно раньше. Это минимизирует внешние зависимости тестов, а также уменьшает возможные аномальные поведения из-за побочных эффектов импорта модуля.
Старайтесь максимально повторно использовать код. Иногда тесты могут различаться такой мелочью, как тип используемых входных данных. Минимизируйте дублирование кода, создавая подкласс базового тестового класса, который определяет входные данные:
class TestFuncAcceptsSequencesMixin: func = mySuperWhammyFunction def test_func(self): self.func(self.arg) class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase): arg = [1, 2, 3] class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase): arg = 'abc' class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase): arg = (1, 2, 3)
При использовании этого шаблона помните, что все классы, наследующие от
unittest.TestCase, запускаются как тесты. КлассTestFuncAcceptsSequencesMixinв приведённом выше примере не содержит никаких данных и поэтому не может быть запущен сам по себе, следовательно, он не наследует отunittest.TestCase.
См. также
- Разработка через тестирование
Книга Кента Бека о написании тестов до кода.
Запуск тестов с помощью интерфейса командной строки¶Running tests using the command-line interface
Пакет test может быть запущен как скрипт для выполнения набора регрессионных
тестов Python благодаря опции -m: python -m test. Под
капотом он использует test.regrtest; вызов python -m
test.regrtest, использовавшийся в предыдущих версиях Python, по-прежнему работает. При
самостоятельном запуске скрипт автоматически начинает выполнение всех регрессионных тестов
пакета test. Это делается путём поиска всех модулей в пакете, имена которых
начинаются с test_, их импорта и выполнения функции
test_main(), если она присутствует, или загрузки тестов через
unittest.TestLoader.loadTestsFromModule, если test_main не существует. Также
скрипту можно передать имена тестов для выполнения. Указание одного регрессионного
теста (python -m test test_spam) минимизирует вывод и
будет показано только, прошёл тест или нет.
Запуск test напрямую позволяет задать, какие ресурсы доступны для
использования тестами. Для этого используется опция командной строки
-u. Указание all в качестве значения опции -u включает все
возможные ресурсы: python -m test -uall.
Если нужны все ресурсы, кроме одного (более частый случай), после
all можно указать разделённый запятыми список ненужных ресурсов. Команда
python -m test -uall,-audio,-largefile
запустит test со всеми ресурсами, кроме audio и
largefile. Список всех ресурсов и дополнительные параметры командной строки можно
узнать, выполнив python -m test -h.
Некоторые другие способы выполнения регрессионных тестов зависят от платформы, на
которой они выполняются. В Unix можно выполнить make test в
корневом каталоге сборки Python. В Windows
выполнение rt.bat из каталога PCbuild запустит все
регрессионные тесты.
Добавлено в версии 3.14: Вывод по умолчанию раскрашивается, и это можно настроить с помощью переменных окружения.
test.support – Утилиты для набора тестов Python¶test.support – Utilities for the Python test suite
Модуль test.support предоставляет поддержку для набора регрессионных тестов Python.
Примечание
test.support не является публичным модулем. Он документирован здесь, чтобы помочь
разработчикам Python писать тесты. API этого модуля может измениться
без соблюдения обратной совместимости между выпусками.
В этом модуле определены следующие исключения:
- exception test.support.TestFailed¶
Исключение, которое вызывается при неудаче теста. Устарело в пользу тестов на основе
unittestи методов утвержденийunittest.TestCase.
- exception test.support.ResourceDenied¶
Подкласс
unittest.SkipTest. Возбуждается, когда ресурс (например, сетевое соединение) недоступен. Возбуждается функциейrequires().
Модуль test.support определяет следующие константы:
- test.support.verbose¶
True, если включен подробный вывод. Следует проверять, когда требуется более детальная информация о выполняющемся тесте. verbose устанавливаетсяtest.regrtest.
- test.support.is_jython¶
True, если запущенный интерпретатор – Jython.
- test.support.is_android¶
True, еслиsys.platform– этоandroid.
- test.support.is_emscripten¶
True, еслиsys.platform– этоemscripten.
- test.support.is_wasi¶
True, еслиsys.platform– этоwasi.
- test.support.is_apple_mobile¶
True, еслиsys.platform– этоios,tvosилиwatchos.
- test.support.is_apple¶
True, еслиsys.platform– этоdarwinилиis_apple_mobile– этоTrue.
- test.support.unix_shell¶
Путь к оболочке, если не в Windows; иначе
None.
- test.support.LOOPBACK_TIMEOUT¶
Тайм-аут (в секундах) для тестов, которые используют сетевой сервер, слушающий на локальном интерфейсе обратной петли, например
127.0.0.1.Тайм-аут достаточно велик, чтобы предотвратить сбой теста: он учитывает, что клиент и сервер могут работать в разных потоках или даже разных процессах.
Тайм-аут должен быть достаточно большим для методов
connect(),recv()иsend()вsocket.socket.Значение по умолчанию – 5 секунд.
См. также
INTERNET_TIMEOUT.
- test.support.INTERNET_TIMEOUT¶
Тайм-аут в секундах для сетевых запросов к интернету.
Тайм-аут достаточно мал, чтобы тест не ждал слишком долго, если интернет-запрос блокируется по какой-либо причине.
Обычно тайм-аут с использованием
INTERNET_TIMEOUTне должен помечать тест как проваленный, а вместо этого пропускать тест: см.transient_internet().Значение по умолчанию – 1 минута.
См. также
LOOPBACK_TIMEOUT.
- test.support.SHORT_TIMEOUT¶
Время ожидания в секундах, по истечении которого тест считается проваленным, если он выполняется «слишком долго».
Значение тайм-аута зависит от параметра командной строки
--timeoutregrtest.Если тест, использующий
SHORT_TIMEOUT, начинает случайно падать на медленных сборщиках, используйтеLONG_TIMEOUTвместо него.Значение по умолчанию – 30 секунд.
- test.support.LONG_TIMEOUT¶
Время ожидания в секундах для обнаружения зависания теста.
Оно достаточно велико, чтобы снизить риск падения теста на самых медленных сборщиках Python. Его не следует использовать для отметки теста как проваленного, если он выполняется «слишком долго». Значение тайм-аута зависит от параметра командной строки regrtest
--timeout.Значение по умолчанию – 5 минут.
См. также
LOOPBACK_TIMEOUT,INTERNET_TIMEOUTиSHORT_TIMEOUT.
- test.support.PGO¶
Устанавливается, когда тесты можно пропускать, если они не полезны для PGO.
- test.support.PIPE_MAX_SIZE¶
Константа, которая, вероятно, больше размера буфера системного канала (pipe), чтобы сделать запись блокирующей.
- test.support.Py_DEBUG¶
True, если Python был собран с макросомPy_DEBUG, то есть если Python был собран в режиме отладки.Добавлено в версии 3.12.
- test.support.SOCK_MAX_SIZE¶
Константа, которая, вероятно, больше размера буфера сокета операционной системы, чтобы сделать запись блокирующей.
- test.support.TEST_SUPPORT_DIR¶
Устанавливается в корневой каталог, содержащий
test.support.
- test.support.TEST_HOME_DIR¶
Устанавливается в корневой каталог тестового пакета.
- test.support.TEST_DATA_DIR¶
Устанавливается в каталог
dataвнутри тестового пакета.
- test.support.MAX_Py_ssize_t¶
Устанавливается в
sys.maxsizeдля тестов с большим потреблением памяти.
- test.support.max_memuse¶
Устанавливается
set_memlimit()как ограничение памяти для тестов с большим потреблением памяти. ОграниченоMAX_Py_ssize_t.
- test.support.real_max_memuse¶
Устанавливается
set_memlimit()как ограничение памяти для тестов с большим потреблением памяти. Не ограниченоMAX_Py_ssize_t.
- test.support.MISSING_C_DOCSTRINGS¶
Устанавливается в
True, если Python собран без строк документации (макросWITH_DOC_STRINGSне определён). См. опциюconfigure --without-doc-strings.См. также переменную
HAVE_DOCSTRINGS.
- test.support.HAVE_DOCSTRINGS¶
Устанавливается в
True, если доступны строки документации функций. См. опциюpython -OO, которая удаляет строки документации функций, реализованных на Python.См. также переменную
MISSING_C_DOCSTRINGS.
- test.support.TEST_HTTP_URL¶
Определяет URL выделенного HTTP-сервера для сетевых тестов.
- test.support.ALWAYS_EQ¶
Объект, который равен чему угодно. Используется для проверки сравнения смешанных типов.
- test.support.NEVER_EQ¶
Объект, который не равен ничему (даже
ALWAYS_EQ). Используется для проверки сравнения смешанных типов.
- test.support.LARGEST¶
Объект, который больше всего (кроме самого себя). Используется для проверки сравнения смешанных типов.
- test.support.SMALLEST¶
Объект, который меньше всего (кроме самого себя). Используется для проверки сравнения смешанных типов.
Модуль test.support определяет следующие функции:
- test.support.busy_retry(timeout, err_msg=None, /, *, error=True)¶
Выполнять тело цикла, пока
breakне остановит цикл.Через timeout секунд возбуждать
AssertionError, если error истинно, или просто останавливать цикл, если error ложно.Пример:
for _ in support.busy_retry(support.SHORT_TIMEOUT): if check(): break
Пример использования error=False:
for _ in support.busy_retry(support.SHORT_TIMEOUT, error=False): if check(): break else: raise RuntimeError('my custom error')
- test.support.sleeping_retry(timeout, err_msg=None, /, *, init_delay=0.010, max_delay=1.0, error=True)¶
Стратегия ожидания с экспоненциальной задержкой.
Выполнять тело цикла, пока
breakне остановит цикл. Ожидать на каждой итерации цикла, кроме первой. Задержка удваивается на каждой итерации (до max_delay секунд).См. документацию
busy_retry()для использования параметров.Пример возбуждения исключения через SHORT_TIMEOUT секунд:
for _ in support.sleeping_retry(support.SHORT_TIMEOUT): if check(): break
Пример использования error=False:
for _ in support.sleeping_retry(support.SHORT_TIMEOUT, error=False): if check(): break else: raise RuntimeError('my custom error')
- test.support.is_resource_enabled(resource)¶
Возвращает
True, если resource включён и доступен. Список доступных ресурсов задаётся только при выполнении тестовtest.regrtest.
- test.support.get_resource_value(resource)¶
Возвращает значение, указанное для resource (как
-u resource=value). ВозвращаетNone, если resource отключён или значение не указано.
- test.support.python_is_optimized()¶
Возвращает
True, если Python был собран без-O0или-Og.
- test.support.with_pymalloc()¶
Вернуть
_testcapi.WITH_PYMALLOC.
- test.support.requires(resource, msg=None)¶
Возбуждает
ResourceDenied, если resource недоступен. msg – это аргумент дляResourceDenied, если он возбуждается. Всегда возвращаетTrue, если вызвана из функции, чей__name__равен'__main__'. Используется при выполнении тестов с помощьюtest.regrtest.
- test.support.sortdict(dict)¶
Возвращает repr dict с отсортированными ключами.
- test.support.findfile(filename, subdir=None)¶
Возвращает путь к файлу с именем filename. Если совпадений не найдено, возвращается filename. Это не считается ошибкой, так как оно может быть путём к файлу.
Установка subdir задаёт относительный путь для поиска файла, а не прямой поиск в каталогах пути.
- test.support.get_pagesize()¶
Возвращает размер страницы в байтах.
Добавлено в версии 3.12.
- test.support.setswitchinterval(interval)¶
Устанавливает
sys.setswitchinterval()в заданное значение interval. Определяет минимальный интервал для систем Android, чтобы предотвратить зависание.
- test.support.check_impl_detail(**guards)¶
Используйте эту проверку, чтобы ограничить тесты, специфичные для реализации CPython, или запускать их только на реализациях, указанных в аргументах. Эта функция возвращает
TrueилиFalseв зависимости от платформы. Пример использования:check_impl_detail() # Только на CPython (по умолчанию). check_impl_detail(jython=True) # Только на Jython. check_impl_detail(cpython=False) # Везде, кроме CPython.
- test.support.set_memlimit(limit)¶
Устанавливает значения для
max_memuseиreal_max_memuseдля тестов с большим объёмом памяти.
- test.support.record_original_stdout(stdout)¶
Сохраняет значение из stdout. Предназначено для хранения stdout на момент начала regrtest.
- test.support.get_original_stdout()¶
Возвращает исходный stdout, установленный с помощью
record_original_stdout(), илиsys.stdout, если он не установлен.
- test.support.args_from_interpreter_flags()¶
Возвращает список аргументов командной строки, воспроизводящих текущие настройки в
sys.flagsиsys.warnoptions.
- test.support.optim_args_from_interpreter_flags()¶
Возвращает список аргументов командной строки, воспроизводящих текущие настройки оптимизации в
sys.flags.
- test.support.captured_stdin()¶
- test.support.captured_stdout()¶
- test.support.captured_stderr()¶
Менеджер контекста, который временно заменяет указанный поток данных объектом
io.StringIO.Пример использования с выходными потоками:
with captured_stdout() as stdout, captured_stderr() as stderr: print("hello") print("error", file=sys.stderr) assert stdout.getvalue() == "hello\n" assert stderr.getvalue() == "error\n"
Пример использования с входным потоком:
with captured_stdin() as stdin: stdin.write('hello\n') stdin.seek(0) # вызвать тестовый код, который читает из sys.stdin captured = input() self.assertEqual(captured, "hello")
- test.support.disable_faulthandler()¶
Менеджер контекста, который временно отключает
faulthandler.
- test.support.gc_collect()¶
Принудительно собирает как можно больше объектов. Это необходимо, потому что своевременное освобождение памяти не гарантируется сборщиком мусора. Это означает, что методы
__del__могут быть вызваны позже, чем ожидается, и слабые ссылки могут оставаться живыми дольше, чем ожидается.
- test.support.disable_gc()¶
Менеджер контекста, который отключает сборщик мусора при входе. При выходе сборщик мусора восстанавливается в предыдущее состояние.
- test.support.swap_attr(obj, attr, new_val)¶
Менеджер контекста для замены атрибута новым объектом.
Использование:
with swap_attr(obj, "attr", 5): ...
Устанавливает
obj.attrв 5 на время выполнения блокаwith, восстанавливая старое значение в конце блока. Еслиattrне существует вobj, он будет создан, а затем удалён в конце блока.Старое значение (или
None, если его не существует) будет присвоено целевому объекту предложения “as”, если таковой имеется.
- test.support.swap_item(obj, attr, new_val)¶
Менеджер контекста для замены элемента новым объектом.
Использование:
with swap_item(obj, "item", 5): ...
Устанавливает
obj["item"]в 5 на время выполнения блокаwith, восстанавливая старое значение в конце блока. Еслиitemне существует вobj, он будет создан, а затем удалён в конце блока.Старое значение (или
None, если его не существует) будет присвоено целевому объекту предложения “as”, если таковой имеется.
- test.support.flush_std_streams()¶
Вызвать метод
flush()уsys.stdout, а затем уsys.stderr. Можно использовать, чтобы убедиться, что порядок записей в логах согласован перед записью в stderr.Добавлено в версии 3.12.
- test.support.print_warning(msg)¶
Вывести предупреждение в
sys.__stderr__. Форматировать сообщение как:f"Warning -- {msg}". Если msg состоит из нескольких строк, добавить префикс"Warning -- "к каждой строке.Добавлено в версии 3.9.
- test.support.wait_process(pid, *, exitcode, timeout=None)¶
Дождаться завершения процесса pid и проверить, что код возврата процесса равен exitcode.
Возбудить
AssertionError, если код возврата процесса не равен exitcode.Если процесс выполняется дольше timeout секунд (по умолчанию
SHORT_TIMEOUT), убить процесс и возбудитьAssertionError. Возможность задания тайм-аута недоступна в Windows.Добавлено в версии 3.9.
- test.support.calcobjsize(fmt)¶
Возвращает размер
PyObject, члены структуры которого определены параметром fmt. Возвращаемое значение включает размер заголовка объекта Python и выравнивание.
- test.support.calcvobjsize(fmt)¶
Возвращает размер
PyVarObject, члены структуры которого определены параметром fmt. Возвращаемое значение включает размер заголовка объекта Python и выравнивание.
- test.support.checksizeof(test, o, size)¶
Для тестового случая test утверждать, что
sys.getsizeofдля o плюс размер заголовка GC равен size.
- @test.support.anticipate_failure(condition)¶
Декоратор для условной пометки тестов с помощью
unittest.expectedFailure(). Любое использование этого декоратора должно сопровождаться комментарием с указанием соответствующей проблемы в трекере.
- test.support.system_must_validate_cert(f)¶
Декоратор, который пропускает декорированный тест в случае ошибок проверки TLS-сертификата.
- @test.support.run_with_locale(catstr, *locales)¶
Декоратор для выполнения функции в другой локали, с корректным сбросом локали после завершения. catstr – это категория локали в виде строки (например,
"LC_ALL"). Переданные locales будут перебираться последовательно, и будет использована первая подходящая локаль.
- @test.support.run_with_tz(tz)¶
Декоратор для выполнения функции в определённом часовом поясе, с корректным сбросом часового пояса после завершения.
- @test.support.requires_freebsd_version(*min_version)¶
Декоратор для указания минимальной версии при запуске теста на FreeBSD. Если версия FreeBSD меньше минимальной, тест пропускается.
- @test.support.requires_linux_version(*min_version)¶
Декоратор для минимальной версии при запуске теста на Linux. Если версия Linux ниже минимальной, тест пропускается.
- @test.support.requires_mac_version(*min_version)¶
Декоратор для минимальной версии при запуске теста на macOS. Если версия macOS ниже минимальной, тест пропускается.
- @test.support.requires_gil_enabled¶
Декоратор для пропуска тестов в сборке со свободной многопоточностью (free-threaded). Если GIL отключён, тест пропускается.
- @test.support.requires_IEEE_754¶
Декоратор для пропуска тестов на платформах, не поддерживающих IEEE 754.
- @test.support.requires_resource(resource)¶
Декоратор для пропуска тестов, если resource недоступен.
- @test.support.requires_docstrings¶
Декоратор, запускающий тест только если
HAVE_DOCSTRINGS.
- @test.support.requires_limited_api¶
Декоратор для запуска теста только если Limited C API доступен.
- @test.support.cpython_only¶
Декоратор для тестов, применимых только к CPython.
- @test.support.impl_detail(msg=None, **guards)¶
Декоратор для вызова
check_impl_detail()на guards. Если он возвращаетFalse, то использует msg в качестве причины пропуска теста.
- @test.support.thread_unsafe(reason=None)¶
Декоратор для пометки тестов как небезопасных для потоков. Этот тест всегда выполняется в одном потоке, даже при вызове с
--parallel-threads.
- @test.support.no_tracing¶
Декоратор для временного отключения трассировки на время выполнения теста.
- @test.support.refcount_test¶
Декоратор для тестов, связанных с подсчётом ссылок. Декоратор не запускает тест, если он не выполняется в CPython. Любая функция трассировки отключается на время теста, чтобы предотвратить неожиданные изменения счётчика ссылок, вызванные функцией трассировки.
- @test.support.bigmemtest(size, memuse, dry_run=True)¶
Декоратор для тестов bigmem.
size – это запрошенный размер для теста (в произвольных единицах, интерпретируемых тестом). memuse – это количество байтов на единицу для теста, или хорошая оценка этого. Например, тест, которому нужны два буфера по 4 ГиБ каждый, может быть декорирован с помощью
@bigmemtest(size=_4G, memuse=2).Аргумент size обычно передаётся декорированному методу теста как дополнительный аргумент. Если dry_run равен
True, значение, передаваемое методу теста, может быть меньше запрошенного. Если dry_run равенFalse, это означает, что тест не поддерживает холостые прогоны, когда-Mне указан.
- @test.support.bigaddrspacetest¶
Декоратор для тестов, заполняющих адресное пространство.
- test.support.linked_to_musl()¶
Возвращает
False, если нет доказательств, что интерпретатор был скомпилирован сmusl, иначе возвращает тройку версии: либо(0, 0, 0), если версия неизвестна, либо фактическую версию, если она известна. Предназначен для использования в декораторахskip. Считается, чтоemscriptenиwasiскомпилированы сmusl; в противном случае проверяетсяplatform.libc_ver.
- test.support.check_syntax_error(testcase, statement, errtext='', *, lineno=None, offset=None)¶
Тестирует синтаксические ошибки в statement, пытаясь скомпилировать statement. testcase – это экземпляр
unittestдля теста. errtext – это регулярное выражение, которое должно соответствовать строковому представлению вызванногоSyntaxError. Если lineno не равенNone, сравнивается с строкой исключения. Если offset не равенNone, сравнивается со смещением исключения.
- test.support.open_urlresource(url, *args, **kw)¶
Открывает url. Если открытие не удалось, вызывает
TestFailed.
- test.support.reap_children()¶
Используйте это в конце
test_mainвсякий раз, когда запускаются подпроцессы. Это поможет гарантировать, что лишние дочерние процессы (зомби) не останутся, пожирая ресурсы и создавая проблемы при поиске утечек ссылок.
- test.support.get_attribute(obj, name)¶
Получает атрибут, вызывая
unittest.SkipTest, если возникаетAttributeError.
- test.support.catch_unraisable_exception()¶
Менеджер контекста, перехватывающий неперехватываемое исключение с помощью
sys.unraisablehook().Сохранение значения исключения (
cm.unraisable.exc_value) создаёт цикл ссылок. Цикл ссылок явно разрывается при выходе из менеджера контекста.Сохранение объекта (
cm.unraisable.object) может его воскресить, если он установлен на объект, который находится в процессе финализации. Выход из менеджера контекста очищает сохранённый объект.Использование:
with support.catch_unraisable_exception() as cm: # код, создающий «невызываемое исключение» ... # проверить невызываемое исключение: используйте cm.unraisable ... # атрибут cm.unraisable больше не существует на этом этапе # (чтобы разорвать цикл ссылок)
Добавлено в версии 3.8.
- test.support.load_package_tests(pkg_dir, loader, standard_tests, pattern)¶
Общая реализация протокола
unittestload_testsдля использования в тестовых пакетах. pkg_dir – это корневой каталог пакета; loader, standard_tests и pattern – аргументы, ожидаемыеload_tests. В простых случаях__init__.pyтестового пакета может быть следующим:import os from test.support import load_package_tests def load_tests(*args): return load_package_tests(os.path.dirname(__file__), *args)
- test.support.detect_api_mismatch(ref_api, other_api, *, ignore=())¶
Возвращает набор атрибутов, функций или методов ref_api, не найденных в other_api, за исключением определённого списка элементов, которые следует игнорировать в этой проверке, указанного в ignore.
По умолчанию пропускаются закрытые атрибуты, начинающиеся с '_', но включаются все магические методы, то есть начинающиеся и заканчивающиеся на '__'.
Добавлено в версии 3.5.
- test.support.patch(test_instance, object_to_patch, attr_name, new_value)¶
Переопределяет object_to_patch.attr_name значением new_value. Также добавляет процедуру очистки в test_instance, чтобы восстановить object_to_patch для attr_name. attr_name должен быть допустимым атрибутом для object_to_patch.
- test.support.run_in_subinterp(code)¶
Выполняет code в подынтерпретаторе. Вызывает
unittest.SkipTest, еслиtracemallocвключён.
- test.support.check_free_after_iterating(test, iter, cls, args=())¶
Утверждает, что экземпляры cls освобождаются после итерации.
- test.support.missing_compiler_executable(cmd_names=[])¶
Проверяет существование исполняемых файлов компилятора, имена которых перечислены в cmd_names, или всех исполняемых файлов компилятора, когда cmd_names пуст, и возвращает первый отсутствующий файл или
None, если ни один не отсутствует.
- test.support.check__all__(test_case, module, name_of_module=None, extra=(), not_exported=())¶
Утверждает, что переменная
__all__модуля module содержит все публичные имена.Публичные имена модуля (его API) определяются автоматически на основе того, соответствуют ли они соглашению об именовании публичных имён и были ли определены в module.
Аргумент name_of_module может указывать (в виде строки или кортежа строк), в каком модуле (или модулях) может быть определено API, чтобы оно было распознано как публичное API. Один из примеров – когда module импортирует часть своего публичного API из других модулей, возможно, C-бэкенда (например,
csvи его_csv).Аргумент extra может быть набором имён, которые в противном случае не были бы автоматически распознаны как «публичные», например объекты без соответствующего атрибута
__module__. Если он указан, то будет добавлен к автоматически обнаруженным.Аргумент not_exported может быть набором имён, которые не должны считаться частью публичного API, даже если их имена указывают на обратное.
Пример использования:
import bar import foo import unittest from test import support class MiscTestCase(unittest.TestCase): def test__all__(self): support.check__all__(self, foo) class OtherTestCase(unittest.TestCase): def test__all__(self): extra = {'BAR_CONST', 'FOO_CONST'} not_exported = {'baz'} # Недокументированное имя. # bar импортирует часть своего API из _bar. support.check__all__(self, bar, ('bar', '_bar'), extra=extra, not_exported=not_exported)
Добавлено в версии 3.6.
- test.support.skip_if_broken_multiprocessing_synchronize()¶
Пропускает тесты, если модуль
multiprocessing.synchronizeотсутствует, если нет доступной реализации семафора, или если создание блокировки вызывает исключениеOSError.Добавлено в версии 3.10.
- test.support.check_disallow_instantiation(test_case, tp, *args, **kwds)¶
Утверждает, что тип tp невозможно инстанцировать с помощью args и kwds.
Добавлено в версии 3.10.
- test.support.adjust_int_max_str_digits(max_digits)¶
Эта функция возвращает менеджер контекста, который изменяет глобальную настройку
sys.set_int_max_str_digits()на время действия контекста, чтобы разрешить выполнение тестового кода, которому требуется другой предел количества цифр при преобразовании между целым числом и строкой.Добавлено в версии 3.12.
Модуль test.support определяет следующие классы:
- class test.support.SuppressCrashReport¶
Менеджер контекста, используемый для предотвращения всплывающих диалоговых окон об аварийном завершении в тестах, которые ожидаемо завершаются аварийно в подпроцессе.
В Windows отключает диалоги отчётов об ошибках Windows с помощью SetErrorMode.
В UNIX
resource.setrlimit()используется для установки мягкого ограниченияresource.RLIMIT_COREв 0, чтобы предотвратить создание файлов coredump.На обеих платформах старое значение восстанавливается с помощью
__exit__().
test.support.socket_helper – Утилиты для тестирования сокетов¶test.support.socket_helper – Utilities for socket tests
Модуль test.support.socket_helper обеспечивает поддержку тестирования сокетов.
Добавлено в версии 3.9.
- test.support.socket_helper.IPV6_ENABLED¶
Устанавливается в
True, если на этом узле включён IPv6, иначеFalse.
- test.support.socket_helper.find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM)¶
Возвращает неиспользуемый порт, подходящий для привязки. Для этого создаётся временный сокет с тем же семейством и типом, что и у параметра
sock(по умолчаниюAF_INET,SOCK_STREAM), и выполняется его привязка к указанному адресу узла (по умолчанию0.0.0.0) с портом, установленным в 0, что заставляет ОС выделить неиспользуемый временный порт. Затем временный сокет закрывается и удаляется, а временный порт возвращается.Для любых тестов, где серверному сокету требуется привязка к определённому порту на время теста, следует использовать либо этот метод, либо
bind_port(). Какой из них выбрать, зависит от того, создаёт ли вызывающий код сокет Python, или же неиспользуемый порт нужно передать в конструктор или внешней программе (например, аргумент-acceptдля режима s_server в openssl). По возможности всегда отдавайте предпочтениеbind_port(), а неfind_unused_port(). Использовать жёстко заданный порт не рекомендуется, так как это может помешать одновременному выполнению нескольких экземпляров теста, что создаёт проблемы для buildbot-ов.
- test.support.socket_helper.bind_port(sock, host=HOST)¶
Привязывает сокет к свободному порту и возвращает номер порта. Полагается на временные порты, чтобы гарантировать использование непривязанного порта. Это важно, так как многие тесты могут выполняться одновременно, особенно в среде buildbot. Этот метод вызывает исключение, если
sock.familyравенAF_INET,sock.typeравенSOCK_STREAM, и на сокете установленыSO_REUSEADDRилиSO_REUSEPORT. Тесты никогда не должны устанавливать эти параметры сокета для TCP/IP-сокетов. Единственный случай для установки этих параметров – тестирование многоадресной рассылки через несколько UDP-сокетов.Кроме того, если доступен параметр сокета
SO_EXCLUSIVEADDRUSE(например, в Windows), он будет установлен на сокете. Это предотвратит привязку других процессов к нашему узлу/порту на время теста.
- test.support.socket_helper.bind_unix_socket(sock, addr)¶
Привязывает сокет Unix, вызывая
unittest.SkipTest, если возниклоPermissionError.
- @test.support.socket_helper.skip_unless_bind_unix_socket¶
Декоратор для запуска тестов, которым требуется функциональный
bind()для сокетов Unix.
- test.support.socket_helper.transient_internet(resource_name, *, timeout=30.0, errnos=())¶
Менеджер контекста, который вызывает
ResourceDenied, когда различные проблемы с интернет-соединением проявляются в виде исключений.
test.support.script_helper – Утилиты для тестов выполнения Python¶test.support.script_helper – Utilities for the Python execution tests
Модуль test.support.script_helper предоставляет поддержку для тестов выполнения скриптов Python.
- test.support.script_helper.interpreter_requires_environment()¶
Возвращает
True, еслиsys.executable interpreterдля запуска требуются переменные окружения.Предназначен для использования с
@unittest.skipIf()для аннотирования тестов, которым требуется использовать функциюassert_python*()для запуска подпроцесса интерпретатора в изолированном режиме (-I) или в режиме без окружения (-E).Обычная сборка и тестирование не сталкиваются с этой ситуацией, но это может произойти при попытке запустить набор тестов стандартной библиотеки из интерпретатора, который не имеет очевидного домашнего каталога с точки зрения текущей логики поиска home в Python.
Установка
PYTHONHOME– один из способов заставить большую часть тестового набора работать в такой ситуации.PYTHONPATHилиPYTHONUSERSITE– другие распространённые переменные окружения, которые могут повлиять на возможность запуска интерпретатора.
- test.support.script_helper.run_python_until_end(*args, **env_vars)¶
Настраивает окружение на основе env_vars для запуска интерпретатора в подпроцессе. Значения могут включать
__isolated,__cleanenv,__cwdиTERM.Изменено в версии 3.9: Функция больше не удаляет пробелы из stderr.
- test.support.script_helper.assert_python_ok(*args, **env_vars)¶
Проверяет, что запуск интерпретатора с args и необязательными переменными окружения env_vars завершается успешно (
rc == 0), и возвращает кортеж(return code, stdout, stderr).Если задан именованный параметр __cleanenv, то env_vars используется как «чистое» окружение.
Python запускается в изолированном режиме (опция командной строки
-I), за исключением случая, когда именованный параметр __isolated установлен вFalse.Изменено в версии 3.9: Функция больше не удаляет пробелы из stderr.
- test.support.script_helper.assert_python_failure(*args, **env_vars)¶
Проверяет, что запуск интерпретатора с args и необязательными переменными окружения env_vars завершается неудачей (
rc != 0), и возвращает кортеж(return code, stdout, stderr).Дополнительные параметры см. в
assert_python_ok().Изменено в версии 3.9: Функция больше не удаляет пробелы из stderr.
- test.support.script_helper.spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw)¶
Запускает подпроцесс Python с указанными аргументами.
kw – дополнительные ключевые аргументы для передачи в
subprocess.Popen(). Возвращает объектsubprocess.Popen.
- test.support.script_helper.kill_python(p)¶
Запускает указанный процесс
subprocess.Popenдо завершения и возвращает stdout.
- test.support.script_helper.make_script(script_dir, script_basename, source, omit_suffix=False)¶
Создаёт скрипт, содержащий source, по пути script_dir с именем script_basename. Если omit_suffix равно
False, к имени добавляется.py. Возвращает полный путь к скрипту.
- test.support.script_helper.make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None)¶
Создаёт zip-файл по пути zip_dir с именем zip_basename и расширением
zip, который содержит файлы из script_name. name_in_zip – это имя внутри архива. Возвращает кортеж, содержащий(full path, full path of archive name).
- test.support.script_helper.make_pkg(pkg_dir, init_source='')¶
Создаёт каталог с именем pkg_dir, содержащий файл
__init__с содержимым init_source.
- test.support.script_helper.make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, source, depth=1, compiled=False)¶
Создаёт zip-пакет (каталог) по пути zip_dir с именем zip_basename, содержащий пустой файл
__init__и файл script_basename с исходным кодом source. Если compiled равноTrue, оба исходных файла будут скомпилированы и добавлены в zip-пакет. Возвращает кортеж с полным путём к zip-файлу и именем внутри архива.
test.support.bytecode_helper – Вспомогательные инструменты для тестирования корректной генерации байт-кода¶test.support.bytecode_helper – Support tools for testing correct bytecode generation
Модуль test.support.bytecode_helper предоставляет средства для тестирования и инспекции генерации байт-кода.
Добавлено в версии 3.9.
Модуль определяет следующий класс:
- class test.support.bytecode_helper.BytecodeTestCase(unittest.TestCase)¶
Этот класс содержит пользовательские методы проверки для инспекции байт-кода.
- BytecodeTestCase.get_disassembly_as_string(co)¶
Возвращает дизассемблированный код co в виде строки.
- BytecodeTestCase.assertInBytecode(x, opname, argval=_UNSPECIFIED)¶
Возвращает instr, если opname найден, иначе выбрасывает
AssertionError.
- BytecodeTestCase.assertNotInBytecode(x, opname, argval=_UNSPECIFIED)¶
Выбрасывает
AssertionError, если opname найден.
test.support.threading_helper – Вспомогательные утилиты для тестирования многопоточности¶test.support.threading_helper – Utilities for threading tests
Модуль test.support.threading_helper предоставляет поддержку для тестирования многопоточности.
Добавлено в версии 3.10.
- test.support.threading_helper.join_thread(thread, timeout=None)¶
Ожидает завершения потока thread в течение timeout. Вызывает
AssertionError, если поток всё ещё активен спустя timeout секунд.
- @test.support.threading_helper.reap_threads¶
Декоратор для гарантии очистки потоков, даже если тест завершается неудачей.
- test.support.threading_helper.start_threads(threads, unlock=None)¶
Менеджер контекста для запуска threads (последовательности потоков). unlock – это функция, вызываемая после запуска потоков, даже если было вызвано исключение; примером может служить
threading.Event.set(). При выходеstart_threadsпопытается выполнить join для запущенных потоков.
- test.support.threading_helper.threading_cleanup(*original_values)¶
Очищает потоки, не указанные в original_values. Предназначено для выдачи предупреждения, если тест оставляет работающие потоки в фоновом режиме.
- test.support.threading_helper.threading_setup()¶
Возвращает текущее количество потоков и копию зависших потоков.
- test.support.threading_helper.wait_threads_exit(timeout=None)¶
Контекстный менеджер, который ожидает завершения всех потоков, созданных в операторе
with.
- test.support.threading_helper.catch_threading_exception()¶
Контекстный менеджер, перехватывающий исключение
threading.Threadс помощьюthreading.excepthook().Атрибуты, устанавливаемые при перехвате исключения:
exc_typeexc_valueexc_tracebackthread
См. документацию
threading.excepthook().Эти атрибуты удаляются при выходе из контекстного менеджера.
Использование:
with threading_helper.catch_threading_exception() as cm: # код, порождающий поток, который возбуждает исключение ... # проверить исключение потока: используйте атрибуты cm: # exc_type, exc_value, exc_traceback, поток ... # Атрибуты exc_type, exc_value, exc_traceback и потока объекта cm больше не # существуют на этом этапе # (чтобы избежать циклических ссылок)
Добавлено в версии 3.8.
- test.support.threading_helper.run_concurrently(worker_func, nthreads, args=(), kwargs={})¶
Запускает рабочую функцию параллельно в нескольких потоках. Повторно возбуждает исключение, если какой-либо поток его возбудил, после завершения всех потоков.
test.support.os_helper – Утилиты для тестов ОС¶test.support.os_helper – Utilities for os tests
Модуль test.support.os_helper предоставляет поддержку для тестов ОС.
Добавлено в версии 3.10.
- test.support.os_helper.FS_NONASCII¶
Не-ASCII символ, который может быть закодирован с помощью
os.fsencode().
- test.support.os_helper.SAVEDCWD¶
Устанавливается в
os.getcwd().
- test.support.os_helper.TESTFN¶
Устанавливается в имя, безопасное для использования в качестве имени временного файла. Любой созданный временный файл должен быть закрыт и удалён.
- test.support.os_helper.TESTFN_NONASCII¶
Устанавливается в имя файла, содержащее символ
FS_NONASCII, если такой существует. Это гарантирует, что если имя файла существует, его можно закодировать и декодировать с помощью кодировки файловой системы по умолчанию. Это позволяет легко пропускать тесты, требующие не-ASCII имя файла, на платформах, где они не работают.
- test.support.os_helper.TESTFN_UNENCODABLE¶
Устанавливается в имя файла (тип str), которое не должно поддаваться кодированию кодировкой файловой системы в строгом режиме. Может быть
None, если невозможно сгенерировать такое имя файла.
- test.support.os_helper.TESTFN_UNDECODABLE¶
Устанавливается в имя файла (тип bytes), которое не должно поддаваться декодированию кодировкой файловой системы в строгом режиме. Может быть
None, если невозможно сгенерировать такое имя файла.
- test.support.os_helper.TESTFN_UNICODE¶
Устанавливается в не-ASCII имя для временного файла.
- class test.support.os_helper.EnvironmentVarGuard¶
Класс, используемый для временной установки или отмены переменных окружения. Экземпляры можно использовать как контекстный менеджер, и они имеют полный интерфейс словаря для запроса/изменения базового
os.environ. После выхода из контекстного менеджера все изменения переменных окружения, сделанные через этот экземпляр, будут отменены.Изменено в версии 3.1: Добавлен интерфейс словаря.
- class test.support.os_helper.FakePath(path)¶
Простой объект, подобный пути. Он реализует метод
__fspath__(), который просто возвращает аргумент path. Если path является исключением, оно будет возбуждено в__fspath__().
- EnvironmentVarGuard.set(envvar, value)¶
Временно устанавливает переменную окружения
envvarв значениеvalue.
- EnvironmentVarGuard.unset(envvar, *others)¶
Временно сбрасывает одну или несколько переменных окружения.
Изменено в версии 3.14: Теперь можно сбросить более одной переменной окружения.
- test.support.os_helper.can_symlink()¶
Возвращает
True, если ОС поддерживает символические ссылки, иFalseв противном случае.
- test.support.os_helper.can_xattr()¶
Возвращает
True, если ОС поддерживает xattr, иFalseв противном случае.
- test.support.os_helper.change_cwd(path, quiet=False)¶
Менеджер контекста, который временно изменяет текущую рабочую директорию на path и возвращает эту директорию.
Если quiet равно
False, менеджер контекста возбуждает исключение при ошибке. В противном случае он только выводит предупреждение и оставляет текущую рабочую директорию неизменной.
- test.support.os_helper.create_empty_file(filename)¶
Создаёт пустой файл с именем filename. Если файл уже существует, усекает его.
- test.support.os_helper.fd_count()¶
Подсчитывает количество открытых файловых дескрипторов.
- test.support.os_helper.fs_is_case_insensitive(directory)¶
Возвращает
True, если файловая система для directory нечувствительна к регистру.
- test.support.os_helper.make_bad_fd()¶
Создаёт некорректный файловый дескриптор, открывая и закрывая временный файл, и возвращая его дескриптор.
- test.support.os_helper.rmdir(filename)¶
Вызывает
os.rmdir()для filename. На платформах Windows этот вызов обёрнут в цикл ожидания, который проверяет существование файла; это необходимо из-за антивирусных программ, которые могут удерживать файлы открытыми и препятствовать удалению.
- test.support.os_helper.rmtree(path)¶
Вызывает
shutil.rmtree()для path или вызываетos.lstat()иos.rmdir()для удаления пути и его содержимого. Как и в случае сrmdir(), на платформах Windows это обёрнуто в цикл ожидания, который проверяет существование файлов.
- @test.support.os_helper.skip_unless_symlink¶
Декоратор для запуска тестов, требующих поддержки символических ссылок.
- @test.support.os_helper.skip_unless_xattr¶
Декоратор для запуска тестов, требующих поддержки xattr.
- test.support.os_helper.temp_cwd(name='tempcwd', quiet=False)¶
Менеджер контекста, который временно создаёт новую директорию и изменяет текущую рабочую директорию (CWD).
Менеджер контекста создаёт временную директорию в текущей директории с именем name, прежде чем временно изменить текущую рабочую директорию. Если name равно
None, временная директория создаётся с помощьюtempfile.mkdtemp().Если quiet равен
Falseи не удаётся создать или изменить текущую рабочую директорию (CWD), возникает ошибка. В противном случае выдаётся только предупреждение и используется исходная CWD.
- test.support.os_helper.temp_dir(path=None, quiet=False)¶
Менеджер контекста, который создаёт временную директорию по path и возвращает эту директорию.
Если path равен
None, временная директория создаётся с помощьюtempfile.mkdtemp(). Если quiet равенFalse, менеджер контекста вызывает исключение при ошибке. В противном случае, если path указан и не может быть создан, выдаётся только предупреждение.
- test.support.os_helper.temp_umask(umask)¶
Менеджер контекста, который временно устанавливает umask процесса.
- test.support.os_helper.unlink(filename)¶
Вызывает
os.unlink()для filename. Как и в случаеrmdir(), на платформах Windows это обёрнуто в цикл ожидания, проверяющий существование файла.
test.support.import_helper – Утилиты для тестов импорта¶test.support.import_helper – Utilities for import tests
Модуль test.support.import_helper предоставляет поддержку для тестов импорта.
Добавлено в версии 3.10.
- test.support.import_helper.forget(module_name)¶
Удаляет модуль module_name из
sys.modulesи удаляет все скомпилированные в байт-код файлы этого модуля.
- test.support.import_helper.import_fresh_module(name, fresh=(), blocked=(), deprecated=False)¶
Эта функция импортирует и возвращает свежую копию указанного модуля Python, удаляя его из
sys.modulesперед импортом. Обратите внимание, что, в отличие отreload(), оригинальный модуль не затрагивается этой операцией.fresh – это итерируемый объект с дополнительными именами модулей, которые также удаляются из кеша
sys.modulesперед импортом.blocked – это итерируемый объект с именами модулей, которые заменяются на
Noneв кеше модулей во время импорта, чтобы попытки их импортировать вызывалиImportError.Указанный модуль и все модули, перечисленные в параметрах fresh и blocked, сохраняются перед началом импорта, а затем возвращаются обратно в
sys.modulesпосле завершения свежего импорта.Сообщения об устаревании модулей и пакетов подавляются во время этого импорта, если устарело равен
True.Эта функция вызовет
ImportError, если указанный модуль не удаётся импортировать.Пример использования:
# Получение копий модуля warnings для тестирования без влияния на # версию, используемую остальной частью тестового набора. Одна копия использует # реализацию на C, другая принудительно использует запасную реализацию на чистом # реализация py_warnings = import_fresh_module('warnings', blocked=['_warnings']) c_warnings = import_fresh_module('warnings', fresh=['_warnings'])
Добавлено в версии 3.1.
- test.support.import_helper.import_module(name, deprecated=False, *, required_on=())¶
Эта функция импортирует и возвращает указанный модуль. В отличие от обычного импорта, эта функция вызывает
unittest.SkipTest, если модуль не удаётся импортировать.Сообщения об устаревании модулей и пакетов подавляются во время этого импорта, если устарело равен
True. Если модуль обязателен на одной платформе, но необязателен на других, задайте required_on как итерируемый объект с префиксами платформ, которые будут сравниваться сsys.platform.Добавлено в версии 3.1.
- test.support.import_helper.modules_setup()¶
Возвращает копию
sys.modules.
- test.support.import_helper.modules_cleanup(oldmodules)¶
Удаляет модули, за исключением oldmodules и
encodings, чтобы сохранить внутренний кеш.
- test.support.import_helper.unload(name)¶
Удаляет name из
sys.modules.
- test.support.import_helper.make_legacy_pyc(source)¶
Перемещает PEP 3147/PEP 488 pyc-файл в его устаревшее (legacy) расположение pyc и возвращает путь в файловой системе к этому устаревшему pyc-файлу. Значение source – это путь в файловой системе к исходному файлу. Он может отсутствовать, но сам PEP 3147/488 pyc-файл должен существовать.
- class test.support.import_helper.CleanImport(*module_names)¶
Менеджер контекста, принуждающий импорт возвращать новую ссылку на модуль. Это полезно для тестирования поведения на уровне модуля, например, выдачи
DeprecationWarningпри импорте. Пример использования:with CleanImport('foo'): importlib.import_module('foo') # Новая ссылка.
- class test.support.import_helper.DirsOnSysPath(*paths)¶
Менеджер контекста для временного добавления каталогов в
sys.path.Создаёт копию
sys.path, добавляет все каталоги, переданные в качестве позиционных аргументов, а затем восстанавливаетsys.pathдо скопированных настроек при завершении контекста.Обратите внимание, что все изменения
sys.pathв теле менеджера контекста, включая замену объекта, будут отменены в конце блока.
test.support.warnings_helper – Вспомогательные средства для тестов предупреждений¶test.support.warnings_helper – Utilities for warnings tests
Модуль test.support.warnings_helper предоставляет поддержку для тестов предупреждений.
Добавлено в версии 3.10.
- test.support.warnings_helper.ignore_warnings(*, category)¶
Подавляет предупреждения, являющиеся экземплярами category, который должен быть
Warningили подклассом. Примерно эквивалентноwarnings.catch_warnings()сwarnings.simplefilter('ignore', category=category). Например:@warning_helper.ignore_warnings(category=DeprecationWarning) def test_suppress_warning(): # выполнить действие
Добавлено в версии 3.8.
- test.support.warnings_helper.check_no_resource_warning(testcase)¶
Менеджер контекста для проверки, что не было возбуждено
ResourceWarning. Необходимо удалить объект, который может испускатьResourceWarning, до завершения менеджера контекста.
- test.support.warnings_helper.check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=None)¶
Проверяет синтаксическое предупреждение в statement, пытаясь скомпилировать statement. Также проверяет, что
SyntaxWarningвыдаётся только один раз и что оно будет преобразовано вSyntaxErrorпри превращении в ошибку. testcase – это экземплярunittestдля теста. errtext – это регулярное выражение, которое должно соответствовать строковому представлению выданногоSyntaxWarningи возбуждённогоSyntaxError. Если lineno не равноNone, сравнивается со строкой предупреждения и исключения. Если offset не равноNone, сравнивается со смещением исключения.Добавлено в версии 3.8.
- test.support.warnings_helper.check_warnings(*filters, quiet=True)¶
Удобная обёртка для
warnings.catch_warnings(), упрощающая проверку того, что предупреждение было корректно возбуждено. Она примерно эквивалентна вызовуwarnings.catch_warnings(record=True)сwarnings.simplefilter(), установленным вalways, и с возможностью автоматической проверки записанных результатов.check_warningsпринимает кортежи из 2 элементов вида("message regexp", WarningCategory)в качестве позиционных аргументов. Если указан один или несколько filters, или если необязательный ключевой аргумент quiet равенFalse, он проверяет, что предупреждения соответствуют ожидаемым: каждый указанный фильтр должен совпадать хотя бы с одним предупреждением, вызванным вложенным кодом, иначе тест завершается неудачей; если возникают предупреждения, не совпадающие ни с одним из указанных фильтров, тест также завершается неудачей. Чтобы отключить первую из этих проверок, установите quiet вTrue.Если аргументы не указаны, по умолчанию используется:
check_warnings(("", Warning), quiet=True)
В этом случае перехватываются все предупреждения и исключения не возбуждаются.
При входе в менеджер контекста возвращается экземпляр
WarningRecorder. Базовый список предупреждений изcatch_warnings()доступен через атрибутwarningsобъекта recorder. Для удобства атрибуты объекта, представляющего последнее предупреждение, также можно получить напрямую через объект recorder (см. пример ниже). Если предупреждений не было, то любой из атрибутов, которые обычно ожидаются у объекта, представляющего предупреждение, вернётNone.Объект recorder также имеет метод
reset(), который очищает список предупреждений.Менеджер контекста предназначен для использования следующим образом:
with check_warnings(("assertion is always true", SyntaxWarning), ("", UserWarning)): exec('assert(False, "Hey!")') warnings.warn(UserWarning("Hide me!"))
В этом случае, если какое-либо из предупреждений не было возбуждено, или было возбуждено другое предупреждение,
check_warnings()возбудит исключение.Когда тесту требуется более глубоко изучить предупреждения, а не просто проверить, были ли они, можно использовать такой код:
with check_warnings(quiet=True) as w: warnings.warn("foo") assert str(w.args[0]) == "foo" warnings.warn("bar") assert str(w.args[0]) == "bar" assert str(w.warnings[0].args[0]) == "foo" assert str(w.warnings[1].args[0]) == "bar" w.reset() assert len(w.warnings) == 0
Здесь будут перехвачены все предупреждения, и тестовый код напрямую проверяет перехваченные предупреждения.
Изменено в версии 3.2: Новые необязательные аргументы filters и quiet.
- class test.support.warnings_helper.WarningsRecorder¶
Класс, используемый для записи предупреждений в модульных тестах. Подробнее см. документацию
check_warnings()выше.