Документация Python неофициальный перевод

test.md

1189 строк · 95.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.11/library/test.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`test`](https://python-all.ru/3.11/library/test.html#module-test) – пакет регрессионных тестов для Python89> **Примечание**10>11> Пакет [`test`](https://python-all.ru/3.11/library/test.html#module-test) предназначен только для внутреннего использования Python. Он dокументирован для разработчиков ядра Python. Использование этого пакета за пределами стандартной библиотеки Python не рекомендуется, так как упомянутый здесь код может быть изменён или удалён без уведомления между выпусками Python.1213---1415Пакет [`test`](https://python-all.ru/3.11/library/test.html#module-test) содержит все регрессионные тесты для Python, а также модули [`test.support`](https://python-all.ru/3.11/library/test.html#module-test.support) и [`test.regrtest`](https://python-all.ru/3.11/library/test.html#module-test.regrtest). [`test.support`](https://python-all.ru/3.11/library/test.html#module-test.support) используется для расширения возможностей тестов, а [`test.regrtest`](https://python-all.ru/3.11/library/test.html#module-test.regrtest) управляет набором тестов.1617Каждый модуль в пакете [`test`](https://python-all.ru/3.11/library/test.html#module-test), имя которого начинается с `test_`, является набором тестов для конкретного модуля или функции. Все новые тесты следует писать с использованием модулей [`unittest`](https://python-all.ru/3.11/library/unittest.html#module-unittest) или [`doctest`](https://python-all.ru/3.11/library/doctest.html#module-doctest). Некоторые старые тесты написаны в «традиционном» стиле тестирования, сравнивающем вывод, направленный в `sys.stdout`; такой стиль теста считается устаревшим.1819> **См. также**20>21> **Модуль [`unittest`](https://python-all.ru/3.11/library/unittest.html#module-unittest)**22>23> Написание регрессионных тестов PyUnit.24>25> **Модуль [`doctest`](https://python-all.ru/3.11/library/doctest.html#module-doctest)**26>27> Тесты, встроенные в строки документации.2829## Написание модульных тестов для пакета [`test`](https://python-all.ru/3.11/library/test.html#module-test)3031Для тестов, использующих модуль [`unittest`](https://python-all.ru/3.11/library/unittest.html#module-unittest), рекомендуется следовать нескольким правилам. Одно из них – называть модуль тестов, начиная его имя с `test_` и заканчивая названием тестируемого модуля. Методы тестов в модуле тестирования должны начинаться с `test_` и заканчиваться описанием того, что метод тестирует. Это необходимо, чтобы тестовый драйвер распознавал методы как тестовые. Кроме того, не следует включать строку документации для метода. Вместо этого следует использовать комментарий (например, `# Tests function returns only True or False`) для документирования тестовых методов. Это связано с тем, что строки документации выводятся на печать, если они существуют, и таким образом не указывается, какой именно тест выполняется.3233Часто используется стандартная заготовка:3435```python36import unittest37from test import support3839class MyTestCase1(unittest.TestCase):4041    # Используйте setUp() и tearDown() только при необходимости4243    def setUp(self):44        ... code to execute in preparation for tests ...4546    def tearDown(self):47        ... code to execute to clean up after tests ...4849    def test_feature_one(self):50        # Тест первой возможности.51        ... testing code ...5253    def test_feature_two(self):54        # Тест второй возможности.55        ... testing code ...5657    ... more test methods ...5859class MyTestCase2(unittest.TestCase):60    ... same structure as MyTestCase1 ...6162... more test classes ...6364if __name__ == '__main__':65    unittest.main()66```6768Этот шаблон кода позволяет запускать набор тестов с помощью [`test.regrtest`](https://python-all.ru/3.11/library/test.html#module-test.regrtest), самостоятельно как скрипт, поддерживающий CLI [`unittest`](https://python-all.ru/3.11/library/unittest.html#module-unittest), или через CLI `python -m unittest`.6970Цель регрессионного тестирования – попытаться сломать код. Это приводит к нескольким правилам, которым следует следовать:7172- Набор тестов должен задействовать все классы, функции и константы. Это включает не только внешний API, который будет представлен внешнему миру, но и «приватный» код.73- Предпочтительно тестирование методом белого ящика (анализ тестируемого кода при написании тестов). Тестирование методом чёрного ящика (тестирование только опубликованного пользовательского интерфейса) недостаточно для проверки всех граничных и крайних случаев.74- Убедитесь, что все возможные значения протестированы, включая недопустимые. Это гарантирует, что не только все допустимые значения принимаются, но и неправильные значения обрабатываются корректно.75- Исчерпайте как можно больше путей выполнения кода. Тестируйте места ветвления и соответственно подбирайте входные данные, чтобы гарантировать, что проходит как можно больше различных путей.76- Добавляйте явные тесты для любых ошибок, обнаруженных в тестируемом коде. Это гарантирует, что ошибка не возникнет снова, если код будет изменён в будущем.77- Убедитесь, что после тестов выполнена очистка (например, закрыты и удалены все временные файлы).78- Если тест зависит от конкретного условия операционной системы, то проверьте, что условие уже выполняется, прежде чем запускать тест.79- Импортируйте как можно меньше модулей и делайте это как можно раньше. Это минимизирует внешние зависимости тестов, а также уменьшает возможные аномальные поведения из-за побочных эффектов импорта модуля.80- Старайтесь максимально повторно использовать код. Иногда тесты могут различаться такой мелочью, как тип используемых входных данных. Минимизируйте дублирование кода, создавая подкласс базового тестового класса, который определяет входные данные:8182  ```python83  class TestFuncAcceptsSequencesMixin:8485      func = mySuperWhammyFunction8687      def test_func(self):88          self.func(self.arg)8990  class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):91      arg = [1, 2, 3]9293  class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):94      arg = 'abc'9596  class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):97      arg = (1, 2, 3)98  ```99100  При использовании этого шаблона помните, что все классы, наследующие от [`unittest.TestCase`](https://python-all.ru/3.11/library/unittest.html#unittest.TestCase), запускаются как тесты. Класс `TestFuncAcceptsSequencesMixin` в приведённом выше примере не содержит никаких данных и поэтому не может быть запущен сам по себе, следовательно, он не наследует от [`unittest.TestCase`](https://python-all.ru/3.11/library/unittest.html#unittest.TestCase).101102> **См. также**103>104> **Разработка через тестирование**105>106> Книга Кента Бека о написании тестов до кода.107108## Запуск тестов с помощью интерфейса командной строки109110Пакет [`test`](https://python-all.ru/3.11/library/test.html#module-test) может быть запущен как скрипт для выполнения набора регрессионных тестов Python благодаря опции [`-m`](https://python-all.ru/3.11/using/cmdline.html#cmdoption-m): **python -m test**. Под капотом он использует [`test.regrtest`](https://python-all.ru/3.11/library/test.html#module-test.regrtest); вызов **python -m test.regrtest**, использовавшийся в предыдущих версиях Python, по-прежнему работает. При самостоятельном запуске скрипт автоматически начинает выполнение всех регрессионных тестов пакета [`test`](https://python-all.ru/3.11/library/test.html#module-test). Это делается путём поиска всех модулей в пакете, имена которых начинаются с `test_`, их импорта и выполнения функции `test_main()`, если она присутствует, или загрузки тестов через unittest.TestLoader.loadTestsFromModule, если `test_main` не существует. Также скрипту можно передать имена тестов для выполнения. Указание одного регрессионного теста (**python -m test test\_spam**) минимизирует вывод и будет показано только, прошёл тест или нет.111112Запуск [`test`](https://python-all.ru/3.11/library/test.html#module-test) напрямую позволяет задать, какие ресурсы доступны для использования тестами. Для этого используется опция командной строки `-u`. Указание `all` в качестве значения опции `-u` включает все возможные ресурсы: **python -m test -uall**. Если нужны все ресурсы, кроме одного (более частый случай), после `all` можно указать разделённый запятыми список ненужных ресурсов. Команда **python -m test -uall,-audio,-largefile** запустит [`test`](https://python-all.ru/3.11/library/test.html#module-test) со всеми ресурсами, кроме `audio` и `largefile`. Список всех ресурсов и дополнительные параметры командной строки можно узнать, выполнив **python -m test -h**.113114Некоторые другие способы выполнения регрессионных тестов зависят от платформы, на которой они выполняются. В Unix можно выполнить **make test** в корневом каталоге сборки Python. В Windows выполнение **rt.bat** из каталога `PCbuild` запустит все регрессионные тесты.115116# [`test.support`](https://python-all.ru/3.11/library/test.html#module-test.support) – Утилиты для набора тестов Python117118Модуль [`test.support`](https://python-all.ru/3.11/library/test.html#module-test.support) предоставляет поддержку для набора регрессионных тестов Python.119120> **Примечание**121>122> [`test.support`](https://python-all.ru/3.11/library/test.html#module-test.support) не является публичным модулем. Он документирован здесь, чтобы помочь разработчикам Python писать тесты. API этого модуля может измениться без соблюдения обратной совместимости между выпусками.123124В этом модуле определены следующие исключения:125126#### `exception test.support.TestFailed`127128Исключение, которое вызывается при неудаче теста. Устарело в пользу тестов на основе [`unittest`](https://python-all.ru/3.11/library/unittest.html#module-unittest) и методов утверждений [`unittest.TestCase`](https://python-all.ru/3.11/library/unittest.html#unittest.TestCase).129130#### `exception test.support.ResourceDenied`131132Подкласс [`unittest.SkipTest`](https://python-all.ru/3.11/library/unittest.html#unittest.SkipTest). Возбуждается, когда ресурс (например, сетевое соединение) недоступен. Возбуждается функцией [`requires()`](https://python-all.ru/3.11/library/test.html#test.support.requires).133134Модуль [`test.support`](https://python-all.ru/3.11/library/test.html#module-test.support) определяет следующие константы:135136#### `test.support.verbose`137138`True`, если включен подробный вывод. Следует проверять, когда требуется более детальная информация о выполняющемся тесте. *verbose* устанавливается [`test.regrtest`](https://python-all.ru/3.11/library/test.html#module-test.regrtest).139140#### `test.support.is_jython`141142`True`, если запущенный интерпретатор – Jython.143144#### `test.support.is_android`145146`True` если система – Android.147148#### `test.support.unix_shell`149150Путь к оболочке, если не в Windows; иначе `None`.151152#### `test.support.LOOPBACK_TIMEOUT`153154Тайм-аут (в секундах) для тестов, которые используют сетевой сервер, слушающий на локальном интерфейсе обратной петли, например `127.0.0.1`.155156Тайм-аут достаточно велик, чтобы предотвратить сбой теста: он учитывает, что клиент и сервер могут работать в разных потоках или даже разных процессах.157158Тайм-аут должен быть достаточно большим для методов [`connect()`](https://python-all.ru/3.11/library/socket.html#socket.socket.connect), [`recv()`](https://python-all.ru/3.11/library/socket.html#socket.socket.recv) и [`send()`](https://python-all.ru/3.11/library/socket.html#socket.socket.send) в [`socket.socket`](https://python-all.ru/3.11/library/socket.html#socket.socket).159160Значение по умолчанию – 5 секунд.161162См. также [`INTERNET_TIMEOUT`](https://python-all.ru/3.11/library/test.html#test.support.INTERNET_TIMEOUT).163164#### `test.support.INTERNET_TIMEOUT`165166Тайм-аут в секундах для сетевых запросов к интернету.167168Тайм-аут достаточно мал, чтобы тест не ждал слишком долго, если интернет-запрос блокируется по какой-либо причине.169170Обычно тайм-аут с использованием [`INTERNET_TIMEOUT`](https://python-all.ru/3.11/library/test.html#test.support.INTERNET_TIMEOUT) не должен помечать тест как проваленный, а вместо этого пропускать тест: см. [`transient_internet()`](https://python-all.ru/3.11/library/test.html#test.support.socket_helper.transient_internet).171172Значение по умолчанию – 1 минута.173174См. также [`LOOPBACK_TIMEOUT`](https://python-all.ru/3.11/library/test.html#test.support.LOOPBACK_TIMEOUT).175176#### `test.support.SHORT_TIMEOUT`177178Время ожидания в секундах, по истечении которого тест считается проваленным, если он выполняется «слишком долго».179180Значение тайм-аута зависит от параметра командной строки `--timeout` regrtest.181182Если тест, использующий [`SHORT_TIMEOUT`](https://python-all.ru/3.11/library/test.html#test.support.SHORT_TIMEOUT), начинает случайно падать на медленных сборщиках, используйте [`LONG_TIMEOUT`](https://python-all.ru/3.11/library/test.html#test.support.LONG_TIMEOUT) вместо него.183184Значение по умолчанию – 30 секунд.185186#### `test.support.LONG_TIMEOUT`187188Время ожидания в секундах для обнаружения зависания теста.189190Оно достаточно велико, чтобы снизить риск падения теста на самых медленных сборщиках Python. Его не следует использовать для отметки теста как проваленного, если он выполняется «слишком долго». Значение тайм-аута зависит от параметра командной строки regrtest `--timeout`.191192Значение по умолчанию – 5 минут.193194См. также [`LOOPBACK_TIMEOUT`](https://python-all.ru/3.11/library/test.html#test.support.LOOPBACK_TIMEOUT), [`INTERNET_TIMEOUT`](https://python-all.ru/3.11/library/test.html#test.support.INTERNET_TIMEOUT) и [`SHORT_TIMEOUT`](https://python-all.ru/3.11/library/test.html#test.support.SHORT_TIMEOUT).195196#### `test.support.PGO`197198Устанавливается, когда тесты можно пропускать, если они не полезны для PGO.199200#### `test.support.PIPE_MAX_SIZE`201202Константа, которая, вероятно, больше размера буфера системного канала (pipe), чтобы сделать запись блокирующей.203204#### `test.support.SOCK_MAX_SIZE`205206Константа, которая, вероятно, больше размера буфера сокета операционной системы, чтобы сделать запись блокирующей.207208#### `test.support.TEST_SUPPORT_DIR`209210Устанавливается в корневой каталог, содержащий [`test.support`](https://python-all.ru/3.11/library/test.html#module-test.support).211212#### `test.support.TEST_HOME_DIR`213214Устанавливается в корневой каталог тестового пакета.215216#### `test.support.TEST_DATA_DIR`217218Устанавливается в каталог `data` внутри тестового пакета.219220#### `test.support.MAX_Py_ssize_t`221222Устанавливается в [`sys.maxsize`](https://python-all.ru/3.11/library/sys.html#sys.maxsize) для тестов с большим потреблением памяти.223224#### `test.support.max_memuse`225226Устанавливается [`set_memlimit()`](https://python-all.ru/3.11/library/test.html#test.support.set_memlimit) как ограничение памяти для тестов с большим потреблением памяти. Ограничено [`MAX_Py_ssize_t`](https://python-all.ru/3.11/library/test.html#test.support.MAX_Py_ssize_t).227228#### `test.support.real_max_memuse`229230Устанавливается [`set_memlimit()`](https://python-all.ru/3.11/library/test.html#test.support.set_memlimit) как ограничение памяти для тестов с большим потреблением памяти. Не ограничено [`MAX_Py_ssize_t`](https://python-all.ru/3.11/library/test.html#test.support.MAX_Py_ssize_t).231232#### `test.support.MISSING_C_DOCSTRINGS`233234Устанавливается в `True`, если Python собран без строк документации (макрос `WITH_DOC_STRINGS` не определён). См. опцию [`configure --without-doc-strings`](https://python-all.ru/3.11/using/configure.html#cmdoption-without-doc-strings).235236См. также переменную [`HAVE_DOCSTRINGS`](https://python-all.ru/3.11/library/test.html#test.support.HAVE_DOCSTRINGS).237238#### `test.support.HAVE_DOCSTRINGS`239240Устанавливается в `True`, если доступны строки документации функций. См. опцию [`python -OO`](https://python-all.ru/3.11/using/cmdline.html#cmdoption-O), которая удаляет строки документации функций, реализованных на Python.241242См. также переменную [`MISSING_C_DOCSTRINGS`](https://python-all.ru/3.11/library/test.html#test.support.MISSING_C_DOCSTRINGS).243244#### `test.support.TEST_HTTP_URL`245246Определяет URL выделенного HTTP-сервера для сетевых тестов.247248#### `test.support.ALWAYS_EQ`249250Объект, который равен чему угодно. Используется для проверки сравнения смешанных типов.251252#### `test.support.NEVER_EQ`253254Объект, который не равен ничему (даже [`ALWAYS_EQ`](https://python-all.ru/3.11/library/test.html#test.support.ALWAYS_EQ)). Используется для проверки сравнения смешанных типов.255256#### `test.support.LARGEST`257258Объект, который больше всего (кроме самого себя). Используется для проверки сравнения смешанных типов.259260#### `test.support.SMALLEST`261262Объект, который меньше всего (кроме самого себя). Используется для проверки сравнения смешанных типов.263264Модуль [`test.support`](https://python-all.ru/3.11/library/test.html#module-test.support) определяет следующие функции:265266#### `test.support.busy_retry(timeout, err_msg=None, /, *, error=True)`267268Выполнять тело цикла, пока `break` не остановит цикл.269270Через *timeout* секунд возбуждать [`AssertionError`](https://python-all.ru/3.11/library/exceptions.html#AssertionError), если *error* истинно, или просто останавливать цикл, если *error* ложно.271272Пример:273274```python275for _ in support.busy_retry(support.SHORT_TIMEOUT):276    if check():277        break278```279280Пример использования error=False:281282```python283for _ in support.busy_retry(support.SHORT_TIMEOUT, error=False):284    if check():285        break286else:287    raise RuntimeError('my custom error')288```289290#### `test.support.sleeping_retry(timeout, err_msg=None, /, *, init_delay=0.010, max_delay=1.0, error=True)`291292Стратегия ожидания с экспоненциальной задержкой.293294Выполнять тело цикла, пока `break` не остановит цикл. Ожидать на каждой итерации цикла, кроме первой. Задержка удваивается на каждой итерации (до *max\_delay* секунд).295296См. документацию [`busy_retry()`](https://python-all.ru/3.11/library/test.html#test.support.busy_retry) для использования параметров.297298Пример возбуждения исключения через SHORT\_TIMEOUT секунд:299300```python301for _ in support.sleeping_retry(support.SHORT_TIMEOUT):302    if check():303        break304```305306Пример использования error=False:307308```python309for _ in support.sleeping_retry(support.SHORT_TIMEOUT, error=False):310    if check():311        break312else:313    raise RuntimeError('my custom error')314```315316#### `test.support.is_resource_enabled(resource)`317318Возвращает `True`, если *resource* включён и доступен. Список доступных ресурсов задаётся только при выполнении тестов [`test.regrtest`](https://python-all.ru/3.11/library/test.html#module-test.regrtest).319320#### `test.support.python_is_optimized()`321322Возвращает `True`, если Python был собран без `-O0` или `-Og`.323324#### `test.support.with_pymalloc()`325326Вернуть `_testcapi.WITH_PYMALLOC`.327328#### `test.support.requires(resource, msg=None)`329330Возбуждает [`ResourceDenied`](https://python-all.ru/3.11/library/test.html#test.support.ResourceDenied), если *resource* недоступен. *msg* – это аргумент для [`ResourceDenied`](https://python-all.ru/3.11/library/test.html#test.support.ResourceDenied), если он возбуждается. Всегда возвращает `True`, если вызвана из функции, чей `__name__` равен `'__main__'`. Используется при выполнении тестов с помощью [`test.regrtest`](https://python-all.ru/3.11/library/test.html#module-test.regrtest).331332#### `test.support.sortdict(dict)`333334Возвращает repr *dict* с отсортированными ключами.335336#### `test.support.findfile(filename, subdir=None)`337338Возвращает путь к файлу с именем *filename*. Если совпадений не найдено, возвращается *filename*. Это не считается ошибкой, так как оно может быть путём к файлу.339340Установка *subdir* задаёт относительный путь для поиска файла, а не прямой поиск в каталогах пути.341342#### `test.support.setswitchinterval(interval)`343344Устанавливает [`sys.setswitchinterval()`](https://python-all.ru/3.11/library/sys.html#sys.setswitchinterval) в заданное значение *interval*. Определяет минимальный интервал для систем Android, чтобы предотвратить зависание.345346#### `test.support.check_impl_detail(**guards)`347348Используйте эту проверку, чтобы ограничить тесты, специфичные для реализации CPython, или запускать их только на реализациях, указанных в аргументах. Эта функция возвращает `True` или `False` в зависимости от платформы. Пример использования:349350```python351check_impl_detail()               # Только на CPython (по умолчанию).352check_impl_detail(jython=True)    # Только на Jython.353check_impl_detail(cpython=False)  # Везде, кроме CPython.354```355356#### `test.support.set_memlimit(limit)`357358Устанавливает значения для [`max_memuse`](https://python-all.ru/3.11/library/test.html#test.support.max_memuse) и [`real_max_memuse`](https://python-all.ru/3.11/library/test.html#test.support.real_max_memuse) для тестов с большим объёмом памяти.359360#### `test.support.record_original_stdout(stdout)`361362Сохраняет значение из *stdout*. Предназначено для хранения stdout на момент начала regrtest.363364#### `test.support.get_original_stdout()`365366Возвращает исходный stdout, установленный с помощью [`record_original_stdout()`](https://python-all.ru/3.11/library/test.html#test.support.record_original_stdout), или `sys.stdout`, если он не установлен.367368#### `test.support.args_from_interpreter_flags()`369370Возвращает список аргументов командной строки, воспроизводящих текущие настройки в `sys.flags` и `sys.warnoptions`.371372#### `test.support.optim_args_from_interpreter_flags()`373374Возвращает список аргументов командной строки, воспроизводящих текущие настройки оптимизации в `sys.flags`.375376#### `test.support.captured_stdin()`377378#### `test.support.captured_stdout()`379380#### `test.support.captured_stderr()`381382Менеджер контекста, который временно заменяет указанный поток данных объектом [`io.StringIO`](https://python-all.ru/3.11/library/io.html#io.StringIO).383384Пример использования с выходными потоками:385386```python387with captured_stdout() as stdout, captured_stderr() as stderr:388    print("hello")389    print("error", file=sys.stderr)390assert stdout.getvalue() == "hello\n"391assert stderr.getvalue() == "error\n"392```393394Пример использования с входным потоком:395396```python397with captured_stdin() as stdin:398    stdin.write('hello\n')399    stdin.seek(0)400    # вызвать тестовый код, который читает из sys.stdin401    captured = input()402self.assertEqual(captured, "hello")403```404405#### `test.support.disable_faulthandler()`406407Менеджер контекста, который временно отключает [`faulthandler`](https://python-all.ru/3.11/library/faulthandler.html#module-faulthandler).408409#### `test.support.gc_collect()`410411Принудительно собирает как можно больше объектов. Это необходимо, потому что своевременное освобождение памяти не гарантируется сборщиком мусора. Это означает, что методы `__del__` могут быть вызваны позже, чем ожидается, и слабые ссылки могут оставаться живыми дольше, чем ожидается.412413#### `test.support.disable_gc()`414415Менеджер контекста, который отключает сборщик мусора при входе. При выходе сборщик мусора восстанавливается в предыдущее состояние.416417#### `test.support.swap_attr(obj, attr, new_val)`418419Менеджер контекста для замены атрибута новым объектом.420421Использование:422423```python424with swap_attr(obj, "attr", 5):425    ...426```427428Устанавливает `obj.attr` в 5 на время выполнения блока `with`, восстанавливая старое значение в конце блока. Если `attr` не существует в `obj`, он будет создан, а затем удалён в конце блока.429430Старое значение (или `None`, если его не существует) будет присвоено целевому объекту предложения “as”, если таковой имеется.431432#### `test.support.swap_item(obj, attr, new_val)`433434Менеджер контекста для замены элемента новым объектом.435436Использование:437438```python439with swap_item(obj, "item", 5):440    ...441```442443Устанавливает `obj["item"]` в 5 на время выполнения блока `with`, восстанавливая старое значение в конце блока. Если `item` не существует в `obj`, он будет создан, а затем удалён в конце блока.444445Старое значение (или `None`, если его не существует) будет присвоено целевому объекту предложения “as”, если таковой имеется.446447#### `test.support.flush_std_streams()`448449Вызвать метод `flush()` у [`sys.stdout`](https://python-all.ru/3.11/library/sys.html#sys.stdout), а затем у [`sys.stderr`](https://python-all.ru/3.11/library/sys.html#sys.stderr). Можно использовать, чтобы убедиться, что порядок записей в логах согласован перед записью в stderr.450451Новое в версии 3.11.452453#### `test.support.print_warning(msg)`454455Вывести предупреждение в [`sys.__stderr__`](https://python-all.ru/3.11/library/sys.html#sys.__stderr__). Форматировать сообщение как: `f"Warning -- {msg}"`. Если *msg* состоит из нескольких строк, добавить префикс `"Warning -- "` к каждой строке.456457Новое в версии 3.9.458459#### `test.support.wait_process(pid, *, exitcode, timeout=None)`460461Дождаться завершения процесса *pid* и проверить, что код возврата процесса равен *exitcode*.462463Возбудить [`AssertionError`](https://python-all.ru/3.11/library/exceptions.html#AssertionError), если код возврата процесса не равен *exitcode*.464465Если процесс выполняется дольше *timeout* секунд (по умолчанию [`SHORT_TIMEOUT`](https://python-all.ru/3.11/library/test.html#test.support.SHORT_TIMEOUT)), убить процесс и возбудить [`AssertionError`](https://python-all.ru/3.11/library/exceptions.html#AssertionError). Возможность задания тайм-аута недоступна в Windows.466467Новое в версии 3.9.468469#### `test.support.calcobjsize(fmt)`470471Возвращает размер [`PyObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyObject), члены структуры которого определены параметром *fmt*. Возвращаемое значение включает размер заголовка объекта Python и выравнивание.472473#### `test.support.calcvobjsize(fmt)`474475Возвращает размер [`PyVarObject`](https://python-all.ru/3.11/c-api/structures.html#c.PyVarObject), члены структуры которого определены параметром *fmt*. Возвращаемое значение включает размер заголовка объекта Python и выравнивание.476477#### `test.support.checksizeof(test, o, size)`478479Для тестового случая *test* утверждать, что `sys.getsizeof` для *o* плюс размер заголовка GC равен *size*.480481#### `@test.support.anticipate_failure(condition)`482483Декоратор для условной пометки тестов с помощью [`unittest.expectedFailure()`](https://python-all.ru/3.11/library/unittest.html#unittest.expectedFailure). Любое использование этого декоратора должно сопровождаться комментарием с указанием соответствующей проблемы в трекере.484485#### `test.support.system_must_validate_cert(f)`486487Декоратор, который пропускает декорированный тест в случае ошибок проверки TLS-сертификата.488489#### `@test.support.run_with_locale(catstr, *locales)`490491Декоратор для выполнения функции в другой локали, с корректным сбросом локали после завершения. *catstr* – это категория локали в виде строки (например, `"LC_ALL"`). Переданные *locales* будут перебираться последовательно, и будет использована первая подходящая локаль.492493#### `@test.support.run_with_tz(tz)`494495Декоратор для выполнения функции в определённом часовом поясе, с корректным сбросом часового пояса после завершения.496497#### `@test.support.requires_freebsd_version(*min_version)`498499Декоратор для указания минимальной версии при запуске теста на FreeBSD. Если версия FreeBSD меньше минимальной, тест пропускается.500501#### `@test.support.requires_linux_version(*min_version)`502503Декоратор для минимальной версии при запуске теста на Linux. Если версия Linux ниже минимальной, тест пропускается.504505#### `@test.support.requires_mac_version(*min_version)`506507Декоратор для минимальной версии при запуске теста на macOS. Если версия macOS ниже минимальной, тест пропускается.508509#### `@test.support.requires_IEEE_754`510511Декоратор для пропуска тестов на платформах, не поддерживающих IEEE 754.512513#### `@test.support.requires_zlib`514515Декоратор для пропуска тестов, если [`zlib`](https://python-all.ru/3.11/library/zlib.html#module-zlib) не существует.516517#### `@test.support.requires_gzip`518519Декоратор для пропуска тестов, если [`gzip`](https://python-all.ru/3.11/library/gzip.html#module-gzip) не существует.520521#### `@test.support.requires_bz2`522523Декоратор для пропуска тестов, если [`bz2`](https://python-all.ru/3.11/library/bz2.html#module-bz2) не существует.524525#### `@test.support.requires_lzma`526527Декоратор для пропуска тестов, если [`lzma`](https://python-all.ru/3.11/library/lzma.html#module-lzma) не существует.528529#### `@test.support.requires_resource(resource)`530531Декоратор для пропуска тестов, если *resource* недоступен.532533#### `@test.support.requires_docstrings`534535Декоратор, запускающий тест только если [`HAVE_DOCSTRINGS`](https://python-all.ru/3.11/library/test.html#test.support.HAVE_DOCSTRINGS).536537#### `@test.support.cpython_only`538539Декоратор для тестов, применимых только к CPython.540541#### `@test.support.impl_detail(msg=None, **guards)`542543Декоратор для вызова [`check_impl_detail()`](https://python-all.ru/3.11/library/test.html#test.support.check_impl_detail) на *guards*. Если он возвращает `False`, то использует *msg* в качестве причины пропуска теста.544545#### `@test.support.no_tracing`546547Декоратор для временного отключения трассировки на время выполнения теста.548549#### `@test.support.refcount_test`550551Декоратор для тестов, связанных с подсчётом ссылок. Декоратор не запускает тест, если он не выполняется в CPython. Любая функция трассировки отключается на время теста, чтобы предотвратить неожиданные изменения счётчика ссылок, вызванные функцией трассировки.552553#### `@test.support.bigmemtest(size, memuse, dry_run=True)`554555Декоратор для тестов bigmem.556557*size* – это запрошенный размер для теста (в произвольных единицах, интерпретируемых тестом). *memuse* – это количество байтов на единицу для теста, или хорошая оценка этого. Например, тест, которому нужны два буфера по 4 ГиБ каждый, может быть декорирован с помощью `@bigmemtest(size=_4G, memuse=2)`.558559Аргумент *size* обычно передаётся декорированному методу теста как дополнительный аргумент. Если *dry\_run* равен `True`, значение, передаваемое методу теста, может быть меньше запрошенного. Если *dry\_run* равен `False`, это означает, что тест не поддерживает холостые прогоны, когда `-M` не указан.560561#### `@test.support.bigaddrspacetest`562563Декоратор для тестов, заполняющих адресное пространство.564565#### `test.support.check_syntax_error(testcase, statement, errtext='', *, lineno=None, offset=None)`566567Тестирует синтаксические ошибки в *statement*, пытаясь скомпилировать *statement*. *testcase* – это экземпляр [`unittest`](https://python-all.ru/3.11/library/unittest.html#module-unittest) для теста. *errtext* – это регулярное выражение, которое должно соответствовать строковому представлению вызванного [`SyntaxError`](https://python-all.ru/3.11/library/exceptions.html#SyntaxError). Если *lineno* не равен `None`, сравнивается с строкой исключения. Если *offset* не равен `None`, сравнивается со смещением исключения.568569#### `test.support.open_urlresource(url, *args, **kw)`570571Открывает *url*. Если открытие не удалось, вызывает [`TestFailed`](https://python-all.ru/3.11/library/test.html#test.support.TestFailed).572573#### `test.support.reap_children()`574575Используйте это в конце `test_main` всякий раз, когда запускаются подпроцессы. Это поможет гарантировать, что лишние дочерние процессы (зомби) не останутся, пожирая ресурсы и создавая проблемы при поиске утечек ссылок.576577#### `test.support.get_attribute(obj, name)`578579Получает атрибут, вызывая [`unittest.SkipTest`](https://python-all.ru/3.11/library/unittest.html#unittest.SkipTest), если возникает [`AttributeError`](https://python-all.ru/3.11/library/exceptions.html#AttributeError).580581#### `test.support.catch_unraisable_exception()`582583Менеджер контекста, перехватывающий неперехватываемое исключение с помощью [`sys.unraisablehook()`](https://python-all.ru/3.11/library/sys.html#sys.unraisablehook).584585Сохранение значения исключения (`cm.unraisable.exc_value`) создаёт цикл ссылок. Цикл ссылок явно разрывается при выходе из менеджера контекста.586587Сохранение объекта (`cm.unraisable.object`) может его воскресить, если он установлен на объект, который находится в процессе финализации. Выход из менеджера контекста очищает сохранённый объект.588589Использование:590591```python592with support.catch_unraisable_exception() as cm:593    # код, создающий «невызываемое исключение»594    ...595596    # проверить невызываемое исключение: используйте cm.unraisable597    ...598599# атрибут cm.unraisable больше не существует на этом этапе600# (чтобы разорвать цикл ссылок)601```602603Новое в версии 3.8.604605#### `test.support.load_package_tests(pkg_dir, loader, standard_tests, pattern)`606607Общая реализация протокола [`unittest`](https://python-all.ru/3.11/library/unittest.html#module-unittest) `load_tests` для использования в тестовых пакетах. *pkg\_dir* – это корневой каталог пакета; *loader*, *standard\_tests* и *pattern* – аргументы, ожидаемые `load_tests`. В простых случаях `__init__.py` тестового пакета может быть следующим:608609```python610import os611from test.support import load_package_tests612613def load_tests(*args):614    return load_package_tests(os.path.dirname(__file__), *args)615```616617#### `test.support.detect_api_mismatch(ref_api, other_api, *, ignore=())`618619Возвращает набор атрибутов, функций или методов *ref\_api*, не найденных в *other\_api*, за исключением определённого списка элементов, которые следует игнорировать в этой проверке, указанного в *ignore*.620621По умолчанию пропускаются закрытые атрибуты, начинающиеся с '\_', но включаются все магические методы, то есть начинающиеся и заканчивающиеся на '\_\_'.622623Новое в версии 3.5.624625#### `test.support.patch(test_instance, object_to_patch, attr_name, new_value)`626627Переопределяет *object\_to\_patch.attr\_name* значением *new\_value*. Также добавляет процедуру очистки в *test\_instance*, чтобы восстановить *object\_to\_patch* для *attr\_name*. *attr\_name* должен быть допустимым атрибутом для *object\_to\_patch*.628629#### `test.support.run_in_subinterp(code)`630631Выполняет *code* в подынтерпретаторе. Вызывает [`unittest.SkipTest`](https://python-all.ru/3.11/library/unittest.html#unittest.SkipTest), если [`tracemalloc`](https://python-all.ru/3.11/library/tracemalloc.html#module-tracemalloc) включён.632633#### `test.support.check_free_after_iterating(test, iter, cls, args=())`634635Утверждает, что экземпляры *cls* освобождаются после итерации.636637#### `test.support.missing_compiler_executable(cmd_names=[])`638639Проверяет существование исполняемых файлов компилятора, имена которых перечислены в *cmd\_names*, или всех исполняемых файлов компилятора, когда *cmd\_names* пуст, и возвращает первый отсутствующий файл или `None`, если ни один не отсутствует.640641#### `test.support.check__all__(test_case, module, name_of_module=None, extra=(), not_exported=())`642643Утверждает, что переменная `__all__` модуля *module* содержит все публичные имена.644645Публичные имена модуля (его API) определяются автоматически на основе того, соответствуют ли они соглашению об именовании публичных имён и были ли определены в *module*.646647Аргумент *name\_of\_module* может указывать (в виде строки или кортежа строк), в каком модуле (или модулях) может быть определено API, чтобы оно было распознано как публичное API. Один из примеров – когда *module* импортирует часть своего публичного API из других модулей, возможно, C-бэкенда (например, `csv` и его `_csv`).648649Аргумент *extra* может быть набором имён, которые в противном случае не были бы автоматически распознаны как «публичные», например объекты без соответствующего атрибута `__module__`. Если он указан, то будет добавлен к автоматически обнаруженным.650651Аргумент *not\_exported* может быть набором имён, которые не должны считаться частью публичного API, даже если их имена указывают на обратное.652653Пример использования:654655```python656import bar657import foo658import unittest659from test import support660661class MiscTestCase(unittest.TestCase):662    def test__all__(self):663        support.check__all__(self, foo)664665class OtherTestCase(unittest.TestCase):666    def test__all__(self):667        extra = {'BAR_CONST', 'FOO_CONST'}668        not_exported = {'baz'}  # Недокументированное имя.669        # bar импортирует часть своего API из _bar.670        support.check__all__(self, bar, ('bar', '_bar'),671                             extra=extra, not_exported=not_exported)672```673674Новое в версии 3.6.675676#### `test.support.skip_if_broken_multiprocessing_synchronize()`677678Пропускает тесты, если модуль `multiprocessing.synchronize` отсутствует, если нет доступной реализации семафора, или если создание блокировки вызывает исключение [`OSError`](https://python-all.ru/3.11/library/exceptions.html#OSError).679680Новое в версии 3.10.681682#### `test.support.check_disallow_instantiation(test_case, tp, *args, **kwds)`683684Утверждает, что тип *tp* невозможно инстанцировать с помощью *args* и *kwds*.685686Новое в версии 3.10.687688#### `test.support.adjust_int_max_str_digits(max_digits)`689690Эта функция возвращает менеджер контекста, который изменяет глобальную настройку [`sys.set_int_max_str_digits()`](https://python-all.ru/3.11/library/sys.html#sys.set_int_max_str_digits) на время действия контекста, чтобы разрешить выполнение тестового кода, которому требуется другой предел количества цифр при преобразовании между целым числом и строкой.691692Новое в версии 3.11.693694Модуль [`test.support`](https://python-all.ru/3.11/library/test.html#module-test.support) определяет следующие классы:695696#### `class test.support.SuppressCrashReport`697698Менеджер контекста, используемый для предотвращения всплывающих диалоговых окон об аварийном завершении в тестах, которые ожидаемо завершаются аварийно в подпроцессе.699700В Windows отключает диалоги отчётов об ошибках Windows с помощью [SetErrorMode](https://python-all.ru/3.11/library/test.html).701702В UNIX [`resource.setrlimit()`](https://python-all.ru/3.11/library/resource.html#resource.setrlimit) используется для установки мягкого ограничения [`resource.RLIMIT_CORE`](https://python-all.ru/3.11/library/resource.html#resource.RLIMIT_CORE) в 0, чтобы предотвратить создание файлов coredump.703704На обеих платформах старое значение восстанавливается с помощью [`__exit__()`](https://python-all.ru/3.11/reference/datamodel.html#object.__exit__).705706#### `class test.support.SaveSignals`707708Класс для сохранения и восстановления обработчиков сигналов, зарегистрированных обработчиком сигналов Python.709710#### `save(self)`711712Сохраняет обработчики сигналов в словарь, отображающий номера сигналов на текущий обработчик сигналов.713714#### `restore(self)`715716Устанавливает номера сигналов из словаря [`save()`](https://python-all.ru/3.11/library/test.html#test.support.SaveSignals.save) в сохранённый обработчик.717718#### `class test.support.Matcher`719720#### `matches(self, d, **kwargs)`721722Пытается сопоставить один словарь с переданными аргументами.723724#### `match_value(self, k, dv, v)`725726Пытается сопоставить одно сохранённое значение (*dv*) с переданным значением (*v*).727728# [`test.support.socket_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.socket_helper) – Утилиты для тестирования сокетов729730Модуль [`test.support.socket_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.socket_helper) обеспечивает поддержку тестирования сокетов.731732Новое в версии 3.9.733734#### `test.support.socket_helper.IPV6_ENABLED`735736Устанавливается в `True`, если на этом узле включён IPv6, иначе `False`.737738#### `test.support.socket_helper.find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM)`739740Возвращает неиспользуемый порт, подходящий для привязки. Для этого создаётся временный сокет с тем же семейством и типом, что и у параметра `sock` (по умолчанию [`AF_INET`](https://python-all.ru/3.11/library/socket.html#socket.AF_INET), [`SOCK_STREAM`](https://python-all.ru/3.11/library/socket.html#socket.SOCK_STREAM)), и выполняется его привязка к указанному адресу узла (по умолчанию `0.0.0.0`) с портом, установленным в 0, что заставляет ОС выделить неиспользуемый временный порт. Затем временный сокет закрывается и удаляется, а временный порт возвращается.741742Для любых тестов, где серверному сокету требуется привязка к определённому порту на время теста, следует использовать либо этот метод, либо [`bind_port()`](https://python-all.ru/3.11/library/test.html#test.support.socket_helper.bind_port). Какой из них выбрать, зависит от того, создаёт ли вызывающий код сокет Python, или же неиспользуемый порт нужно передать в конструктор или внешней программе (например, аргумент `-accept` для режима s\_server в openssl). По возможности всегда отдавайте предпочтение [`bind_port()`](https://python-all.ru/3.11/library/test.html#test.support.socket_helper.bind_port), а не [`find_unused_port()`](https://python-all.ru/3.11/library/test.html#test.support.socket_helper.find_unused_port). Использовать жёстко заданный порт не рекомендуется, так как это может помешать одновременному выполнению нескольких экземпляров теста, что создаёт проблемы для buildbot-ов.743744#### `test.support.socket_helper.bind_port(sock, host=HOST)`745746Привязывает сокет к свободному порту и возвращает номер порта. Полагается на временные порты, чтобы гарантировать использование непривязанного порта. Это важно, так как многие тесты могут выполняться одновременно, особенно в среде buildbot. Этот метод вызывает исключение, если `sock.family` равен [`AF_INET`](https://python-all.ru/3.11/library/socket.html#socket.AF_INET), `sock.type` равен [`SOCK_STREAM`](https://python-all.ru/3.11/library/socket.html#socket.SOCK_STREAM), и на сокете установлены `SO_REUSEADDR` или `SO_REUSEPORT`. Тесты никогда не должны устанавливать эти параметры сокета для TCP/IP-сокетов. Единственный случай для установки этих параметров – тестирование многоадресной рассылки через несколько UDP-сокетов.747748Кроме того, если доступен параметр сокета `SO_EXCLUSIVEADDRUSE` (например, в Windows), он будет установлен на сокете. Это предотвратит привязку других процессов к нашему узлу/порту на время теста.749750#### `test.support.socket_helper.bind_unix_socket(sock, addr)`751752Привязывает сокет Unix, вызывая [`unittest.SkipTest`](https://python-all.ru/3.11/library/unittest.html#unittest.SkipTest), если возникло [`PermissionError`](https://python-all.ru/3.11/library/exceptions.html#PermissionError).753754#### `@test.support.socket_helper.skip_unless_bind_unix_socket`755756Декоратор для запуска тестов, которым требуется функциональный `bind()` для сокетов Unix.757758#### `test.support.socket_helper.transient_internet(resource_name, *, timeout=30.0, errnos=())`759760Менеджер контекста, который вызывает [`ResourceDenied`](https://python-all.ru/3.11/library/test.html#test.support.ResourceDenied), когда различные проблемы с интернет-соединением проявляются в виде исключений.761762# [`test.support.script_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.script_helper) – Утилиты для тестов выполнения Python763764Модуль [`test.support.script_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.script_helper) предоставляет поддержку для тестов выполнения скриптов Python.765766#### `test.support.script_helper.interpreter_requires_environment()`767768Возвращает `True`, если `sys.executable interpreter` для запуска требуются переменные окружения.769770Предназначен для использования с `@unittest.skipIf()` для аннотирования тестов, которым требуется использовать функцию `assert_python*()` для запуска подпроцесса интерпретатора в изолированном режиме (`-I`) или в режиме без окружения (`-E`).771772Обычная сборка и тестирование не сталкиваются с этой ситуацией, но это может произойти при попытке запустить набор тестов стандартной библиотеки из интерпретатора, который не имеет очевидного домашнего каталога с точки зрения текущей логики поиска home в Python.773774Установка [`PYTHONHOME`](https://python-all.ru/3.11/using/cmdline.html#envvar-PYTHONHOME) – один из способов заставить большую часть тестового набора работать в такой ситуации. [`PYTHONPATH`](https://python-all.ru/3.11/using/cmdline.html#envvar-PYTHONPATH) или `PYTHONUSERSITE` – другие распространённые переменные окружения, которые могут повлиять на возможность запуска интерпретатора.775776#### `test.support.script_helper.run_python_until_end(*args, **env_vars)`777778Настраивает окружение на основе *env\_vars* для запуска интерпретатора в подпроцессе. Значения могут включать `__isolated`, `__cleanenv`, `__cwd` и `TERM`.779780Изменено в версии 3.9: Функция больше не удаляет пробелы из *stderr*.781782#### `test.support.script_helper.assert_python_ok(*args, **env_vars)`783784Проверяет, что запуск интерпретатора с *args* и необязательными переменными окружения *env\_vars* завершается успешно (`rc == 0`), и возвращает кортеж `(return code, stdout, stderr)`.785786Если задан именованный параметр *\_\_cleanenv*, то *env\_vars* используется как «чистое» окружение.787788Python запускается в изолированном режиме (опция командной строки `-I`), за исключением случая, когда именованный параметр *\_\_isolated* установлен в `False`.789790Изменено в версии 3.9: Функция больше не удаляет пробелы из *stderr*.791792#### `test.support.script_helper.assert_python_failure(*args, **env_vars)`793794Проверяет, что запуск интерпретатора с *args* и необязательными переменными окружения *env\_vars* завершается неудачей (`rc != 0`), и возвращает кортеж `(return code, stdout, stderr)`.795796Дополнительные параметры см. в [`assert_python_ok()`](https://python-all.ru/3.11/library/test.html#test.support.script_helper.assert_python_ok).797798Изменено в версии 3.9: Функция больше не удаляет пробелы из *stderr*.799800#### `test.support.script_helper.spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw)`801802Запускает подпроцесс Python с указанными аргументами.803804*kw* – дополнительные ключевые аргументы для передачи в [`subprocess.Popen()`](https://python-all.ru/3.11/library/subprocess.html#subprocess.Popen). Возвращает объект [`subprocess.Popen`](https://python-all.ru/3.11/library/subprocess.html#subprocess.Popen).805806#### `test.support.script_helper.kill_python(p)`807808Запускает указанный процесс [`subprocess.Popen`](https://python-all.ru/3.11/library/subprocess.html#subprocess.Popen) до завершения и возвращает stdout.809810#### `test.support.script_helper.make_script(script_dir, script_basename, source, omit_suffix=False)`811812Создаёт скрипт, содержащий *source*, по пути *script\_dir* с именем *script\_basename*. Если *omit\_suffix* равно `False`, к имени добавляется `.py`. Возвращает полный путь к скрипту.813814#### `test.support.script_helper.make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None)`815816Создаёт zip-файл по пути *zip\_dir* с именем *zip\_basename* и расширением `zip`, который содержит файлы из *script\_name*. *name\_in\_zip* – это имя внутри архива. Возвращает кортеж, содержащий `(full path, full path of archive name)`.817818#### `test.support.script_helper.make_pkg(pkg_dir, init_source='')`819820Создаёт каталог с именем *pkg\_dir*, содержащий файл `__init__` с содержимым *init\_source*.821822#### `test.support.script_helper.make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, source, depth=1, compiled=False)`823824Создаёт zip-пакет (каталог) по пути *zip\_dir* с именем *zip\_basename*, содержащий пустой файл `__init__` и файл *script\_basename* с исходным кодом *source*. Если *compiled* равно `True`, оба исходных файла будут скомпилированы и добавлены в zip-пакет. Возвращает кортеж с полным путём к zip-файлу и именем внутри архива.825826# [`test.support.bytecode_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.bytecode_helper) – Вспомогательные инструменты для тестирования корректной генерации байт-кода827828Модуль [`test.support.bytecode_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.bytecode_helper) предоставляет средства для тестирования и инспекции генерации байт-кода.829830Новое в версии 3.9.831832Модуль определяет следующий класс:833834#### `class test.support.bytecode_helper.BytecodeTestCase(unittest.TestCase)`835836Этот класс содержит пользовательские методы проверки для инспекции байт-кода.837838#### `BytecodeTestCase.get_disassembly_as_string(co)`839840Возвращает дизассемблированный код *co* в виде строки.841842#### `BytecodeTestCase.assertInBytecode(x, opname, argval=_UNSPECIFIED)`843844Возвращает instr, если *opname* найден, иначе выбрасывает [`AssertionError`](https://python-all.ru/3.11/library/exceptions.html#AssertionError).845846#### `BytecodeTestCase.assertNotInBytecode(x, opname, argval=_UNSPECIFIED)`847848Выбрасывает [`AssertionError`](https://python-all.ru/3.11/library/exceptions.html#AssertionError), если *opname* найден.849850# [`test.support.threading_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.threading_helper) – Вспомогательные утилиты для тестирования многопоточности851852Модуль [`test.support.threading_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.threading_helper) предоставляет поддержку для тестирования многопоточности.853854Новое в версии 3.10.855856#### `test.support.threading_helper.join_thread(thread, timeout=None)`857858Ожидает завершения потока *thread* в течение *timeout*. Вызывает [`AssertionError`](https://python-all.ru/3.11/library/exceptions.html#AssertionError), если поток всё ещё активен спустя *timeout* секунд.859860#### `@test.support.threading_helper.reap_threads`861862Декоратор для гарантии очистки потоков, даже если тест завершается неудачей.863864#### `test.support.threading_helper.start_threads(threads, unlock=None)`865866Менеджер контекста для запуска *threads* (последовательности потоков). *unlock* – это функция, вызываемая после запуска потоков, даже если было вызвано исключение; примером может служить [`threading.Event.set()`](https://python-all.ru/3.11/library/threading.html#threading.Event.set). При выходе `start_threads` попытается выполнить join для запущенных потоков.867868#### `test.support.threading_helper.threading_cleanup(*original_values)`869870Очищает потоки, не указанные в *original\_values*. Предназначено для выдачи предупреждения, если тест оставляет работающие потоки в фоновом режиме.871872#### `test.support.threading_helper.threading_setup()`873874Возвращает текущее количество потоков и копию зависших потоков.875876#### `test.support.threading_helper.wait_threads_exit(timeout=None)`877878Контекстный менеджер, который ожидает завершения всех потоков, созданных в операторе `with`.879880#### `test.support.threading_helper.catch_threading_exception()`881882Контекстный менеджер, перехватывающий исключение [`threading.Thread`](https://python-all.ru/3.11/library/threading.html#threading.Thread) с помощью [`threading.excepthook()`](https://python-all.ru/3.11/library/threading.html#threading.excepthook).883884Атрибуты, устанавливаемые при перехвате исключения:885886- `exc_type`887- `exc_value`888- `exc_traceback`889- `thread`890891См. документацию [`threading.excepthook()`](https://python-all.ru/3.11/library/threading.html#threading.excepthook).892893Эти атрибуты удаляются при выходе из контекстного менеджера.894895Использование:896897```python898with threading_helper.catch_threading_exception() as cm:899    # код, порождающий поток, который возбуждает исключение900    ...901902    # проверить исключение потока: используйте атрибуты cm:903    # exc_type, exc_value, exc_traceback, поток904    ...905906# Атрибуты exc_type, exc_value, exc_traceback и потока объекта cm больше не907# существуют на этом этапе908# (чтобы избежать циклических ссылок)909```910911Новое в версии 3.8.912913# [`test.support.os_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.os_helper) – Утилиты для тестов ОС914915Модуль [`test.support.os_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.os_helper) предоставляет поддержку для тестов ОС.916917Новое в версии 3.10.918919#### `test.support.os_helper.FS_NONASCII`920921Не-ASCII символ, который может быть закодирован с помощью [`os.fsencode()`](https://python-all.ru/3.11/library/os.html#os.fsencode).922923#### `test.support.os_helper.SAVEDCWD`924925Устанавливается в [`os.getcwd()`](https://python-all.ru/3.11/library/os.html#os.getcwd).926927#### `test.support.os_helper.TESTFN`928929Устанавливается в имя, безопасное для использования в качестве имени временного файла. Любой созданный временный файл должен быть закрыт и удалён.930931#### `test.support.os_helper.TESTFN_NONASCII`932933Устанавливается в имя файла, содержащее символ [`FS_NONASCII`](https://python-all.ru/3.11/library/test.html#test.support.os_helper.FS_NONASCII), если такой существует. Это гарантирует, что если имя файла существует, его можно закодировать и декодировать с помощью кодировки файловой системы по умолчанию. Это позволяет легко пропускать тесты, требующие не-ASCII имя файла, на платформах, где они не работают.934935#### `test.support.os_helper.TESTFN_UNENCODABLE`936937Устанавливается в имя файла (тип str), которое не должно поддаваться кодированию кодировкой файловой системы в строгом режиме. Может быть `None`, если невозможно сгенерировать такое имя файла.938939#### `test.support.os_helper.TESTFN_UNDECODABLE`940941Устанавливается в имя файла (тип bytes), которое не должно поддаваться декодированию кодировкой файловой системы в строгом режиме. Может быть `None`, если невозможно сгенерировать такое имя файла.942943#### `test.support.os_helper.TESTFN_UNICODE`944945Устанавливается в не-ASCII имя для временного файла.946947#### `class test.support.os_helper.EnvironmentVarGuard`948949Класс, используемый для временной установки или отмены переменных окружения. Экземпляры можно использовать как контекстный менеджер, и они имеют полный интерфейс словаря для запроса/изменения базового `os.environ`. После выхода из контекстного менеджера все изменения переменных окружения, сделанные через этот экземпляр, будут отменены.950951Изменено в версии 3.1: Добавлен интерфейс словаря.952953#### `class test.support.os_helper.FakePath(path)`954955Простой [объект, подобный пути](https://python-all.ru/3.11/glossary.html#term-path-like-object). Он реализует метод [`__fspath__()`](https://python-all.ru/3.11/library/os.html#os.PathLike.__fspath__) , который просто возвращает аргумент *path*. Если *path* является исключением, оно будет возбуждено в `__fspath__()`.956957#### `EnvironmentVarGuard.set(envvar, value)`958959Временно устанавливает переменную окружения `envvar` в значение `value`.960961#### `EnvironmentVarGuard.unset(envvar)`962963Временно удаляет переменную окружения `envvar`.964965#### `test.support.os_helper.can_symlink()`966967Возвращает `True`, если ОС поддерживает символические ссылки, и `False` в противном случае.968969#### `test.support.os_helper.can_xattr()`970971Возвращает `True`, если ОС поддерживает xattr, и `False` в противном случае.972973#### `test.support.os_helper.change_cwd(path, quiet=False)`974975Менеджер контекста, который временно изменяет текущую рабочую директорию на *path* и возвращает эту директорию.976977Если *quiet* равно `False`, менеджер контекста возбуждает исключение при ошибке. В противном случае он только выводит предупреждение и оставляет текущую рабочую директорию неизменной.978979#### `test.support.os_helper.create_empty_file(filename)`980981Создаёт пустой файл с именем *filename*. Если файл уже существует, усекает его.982983#### `test.support.os_helper.fd_count()`984985Подсчитывает количество открытых файловых дескрипторов.986987#### `test.support.os_helper.fs_is_case_insensitive(directory)`988989Возвращает `True`, если файловая система для *directory* нечувствительна к регистру.990991#### `test.support.os_helper.make_bad_fd()`992993Создаёт некорректный файловый дескриптор, открывая и закрывая временный файл, и возвращая его дескриптор.994995#### `test.support.os_helper.rmdir(filename)`996997Вызывает [`os.rmdir()`](https://python-all.ru/3.11/library/os.html#os.rmdir) для *filename*. На платформах Windows этот вызов обёрнут в цикл ожидания, который проверяет существование файла; это необходимо из-за антивирусных программ, которые могут удерживать файлы открытыми и препятствовать удалению.998999#### `test.support.os_helper.rmtree(path)`10001001Вызывает [`shutil.rmtree()`](https://python-all.ru/3.11/library/shutil.html#shutil.rmtree) для *path* или вызывает [`os.lstat()`](https://python-all.ru/3.11/library/os.html#os.lstat) и [`os.rmdir()`](https://python-all.ru/3.11/library/os.html#os.rmdir) для удаления пути и его содержимого. Как и в случае с [`rmdir()`](https://python-all.ru/3.11/library/test.html#test.support.os_helper.rmdir), на платформах Windows это обёрнуто в цикл ожидания, который проверяет существование файлов.10021003#### `@test.support.os_helper.skip_unless_symlink`10041005Декоратор для запуска тестов, требующих поддержки символических ссылок.10061007#### `@test.support.os_helper.skip_unless_xattr`10081009Декоратор для запуска тестов, требующих поддержки xattr.10101011#### `test.support.os_helper.temp_cwd(name='tempcwd', quiet=False)`10121013Менеджер контекста, который временно создаёт новую директорию и изменяет текущую рабочую директорию (CWD).10141015Менеджер контекста создаёт временную директорию в текущей директории с именем *name*, прежде чем временно изменить текущую рабочую директорию. Если *name* равно `None`, временная директория создаётся с помощью [`tempfile.mkdtemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkdtemp).10161017Если *quiet* равен `False` и не удаётся создать или изменить текущую рабочую директорию (CWD), возникает ошибка. В противном случае выдаётся только предупреждение и используется исходная CWD.10181019#### `test.support.os_helper.temp_dir(path=None, quiet=False)`10201021Менеджер контекста, который создаёт временную директорию по *path* и возвращает эту директорию.10221023Если *path* равен `None`, временная директория создаётся с помощью [`tempfile.mkdtemp()`](https://python-all.ru/3.11/library/tempfile.html#tempfile.mkdtemp). Если *quiet* равен `False`, менеджер контекста вызывает исключение при ошибке. В противном случае, если *path* указан и не может быть создан, выдаётся только предупреждение.10241025#### `test.support.os_helper.temp_umask(umask)`10261027Менеджер контекста, который временно устанавливает umask процесса.10281029#### `test.support.os_helper.unlink(filename)`10301031Вызывает [`os.unlink()`](https://python-all.ru/3.11/library/os.html#os.unlink) для *filename*. Как и в случае [`rmdir()`](https://python-all.ru/3.11/library/test.html#test.support.os_helper.rmdir), на платформах Windows это обёрнуто в цикл ожидания, проверяющий существование файла.10321033# [`test.support.import_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.import_helper) – Утилиты для тестов импорта10341035Модуль [`test.support.import_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.import_helper) предоставляет поддержку для тестов импорта.10361037Новое в версии 3.10.10381039#### `test.support.import_helper.forget(module_name)`10401041Удаляет модуль *module\_name* из `sys.modules` и удаляет все скомпилированные в байт-код файлы этого модуля.10421043#### `test.support.import_helper.import_fresh_module(name, fresh=(), blocked=(), deprecated=False)`10441045Эта функция импортирует и возвращает свежую копию указанного модуля Python, удаляя его из `sys.modules` перед импортом. Обратите внимание, что, в отличие от `reload()`, оригинальный модуль не затрагивается этой операцией.10461047*fresh* – это итерируемый объект с дополнительными именами модулей, которые также удаляются из кеша `sys.modules` перед импортом.10481049*blocked* – это итерируемый объект с именами модулей, которые заменяются на `None` в кеше модулей во время импорта, чтобы попытки их импортировать вызывали [`ImportError`](https://python-all.ru/3.11/library/exceptions.html#ImportError).10501051Указанный модуль и все модули, перечисленные в параметрах *fresh* и *blocked*, сохраняются перед началом импорта, а затем возвращаются обратно в `sys.modules` после завершения свежего импорта.10521053Сообщения об устаревании модулей и пакетов подавляются во время этого импорта, если *устарело* равен `True`.10541055Эта функция вызовет [`ImportError`](https://python-all.ru/3.11/library/exceptions.html#ImportError), если указанный модуль не удаётся импортировать.10561057Пример использования:10581059```python1060# Получение копий модуля warnings для тестирования без влияния на1061# версию, используемую остальной частью тестового набора. Одна копия использует1062# реализацию на C, другая принудительно использует запасную реализацию на чистом1063# реализация1064py_warnings = import_fresh_module('warnings', blocked=['_warnings'])1065c_warnings = import_fresh_module('warnings', fresh=['_warnings'])1066```10671068Новое в версии 3.1.10691070#### `test.support.import_helper.import_module(name, deprecated=False, *, required_on=())`10711072Эта функция импортирует и возвращает указанный модуль. В отличие от обычного импорта, эта функция вызывает [`unittest.SkipTest`](https://python-all.ru/3.11/library/unittest.html#unittest.SkipTest), если модуль не удаётся импортировать.10731074Сообщения об устаревании модулей и пакетов подавляются во время этого импорта, если *устарело* равен `True`. Если модуль обязателен на одной платформе, но необязателен на других, задайте *required\_on* как итерируемый объект с префиксами платформ, которые будут сравниваться с [`sys.platform`](https://python-all.ru/3.11/library/sys.html#sys.platform).10751076Новое в версии 3.1.10771078#### `test.support.import_helper.modules_setup()`10791080Возвращает копию [`sys.modules`](https://python-all.ru/3.11/library/sys.html#sys.modules).10811082#### `test.support.import_helper.modules_cleanup(oldmodules)`10831084Удаляет модули, за исключением *oldmodules* и `encodings`, чтобы сохранить внутренний кеш.10851086#### `test.support.import_helper.unload(name)`10871088Удаляет *name* из `sys.modules`.10891090#### `test.support.import_helper.make_legacy_pyc(source)`10911092Перемещает [**PEP 3147**](https://python-all.ru/3.11/library/test.html)/[**PEP 488**](https://python-all.ru/3.11/library/test.html) pyc-файл в его устаревшее (legacy) расположение pyc и возвращает путь в файловой системе к этому устаревшему pyc-файлу. Значение *source* – это путь в файловой системе к исходному файлу. Он может отсутствовать, но сам PEP 3147/488 pyc-файл должен существовать.10931094#### `class test.support.import_helper.CleanImport(*module_names)`10951096Менеджер контекста, принуждающий импорт возвращать новую ссылку на модуль. Это полезно для тестирования поведения на уровне модуля, например, выдачи [`DeprecationWarning`](https://python-all.ru/3.11/library/exceptions.html#DeprecationWarning) при импорте. Пример использования:10971098```python1099with CleanImport('foo'):1100    importlib.import_module('foo')  # Новая ссылка.1101```11021103#### `class test.support.import_helper.DirsOnSysPath(*paths)`11041105Менеджер контекста для временного добавления каталогов в [`sys.path`](https://python-all.ru/3.11/library/sys.html#sys.path).11061107Создаёт копию [`sys.path`](https://python-all.ru/3.11/library/sys.html#sys.path), добавляет все каталоги, переданные в качестве позиционных аргументов, а затем восстанавливает [`sys.path`](https://python-all.ru/3.11/library/sys.html#sys.path) до скопированных настроек при завершении контекста.11081109Обратите внимание, что *все* изменения [`sys.path`](https://python-all.ru/3.11/library/sys.html#sys.path) в теле менеджера контекста, включая замену объекта, будут отменены в конце блока.11101111# [`test.support.warnings_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.warnings_helper) – Вспомогательные средства для тестов предупреждений11121113Модуль [`test.support.warnings_helper`](https://python-all.ru/3.11/library/test.html#module-test.support.warnings_helper) предоставляет поддержку для тестов предупреждений.11141115Новое в версии 3.10.11161117#### `test.support.warnings_helper.ignore_warnings(*, category)`11181119Подавляет предупреждения, являющиеся экземплярами *category*, который должен быть [`Warning`](https://python-all.ru/3.11/library/exceptions.html#Warning) или подклассом. Примерно эквивалентно [`warnings.catch_warnings()`](https://python-all.ru/3.11/library/warnings.html#warnings.catch_warnings) с [`warnings.simplefilter('ignore', category=category)`](https://python-all.ru/3.11/library/warnings.html#warnings.simplefilter). Например:11201121```python1122@warning_helper.ignore_warnings(category=DeprecationWarning)1123def test_suppress_warning():1124    # выполнить действие1125```11261127Новое в версии 3.8.11281129#### `test.support.warnings_helper.check_no_resource_warning(testcase)`11301131Менеджер контекста для проверки, что не было возбуждено [`ResourceWarning`](https://python-all.ru/3.11/library/exceptions.html#ResourceWarning). Необходимо удалить объект, который может испускать [`ResourceWarning`](https://python-all.ru/3.11/library/exceptions.html#ResourceWarning), до завершения менеджера контекста.11321133#### `test.support.warnings_helper.check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=None)`11341135Проверяет синтаксическое предупреждение в *statement*, пытаясь скомпилировать *statement*. Также проверяет, что [`SyntaxWarning`](https://python-all.ru/3.11/library/exceptions.html#SyntaxWarning) выдаётся только один раз и что оно будет преобразовано в [`SyntaxError`](https://python-all.ru/3.11/library/exceptions.html#SyntaxError) при превращении в ошибку. *testcase* – это экземпляр [`unittest`](https://python-all.ru/3.11/library/unittest.html#module-unittest) для теста. *errtext* – это регулярное выражение, которое должно соответствовать строковому представлению выданного [`SyntaxWarning`](https://python-all.ru/3.11/library/exceptions.html#SyntaxWarning) и возбуждённого [`SyntaxError`](https://python-all.ru/3.11/library/exceptions.html#SyntaxError). Если *lineno* не равно `None`, сравнивается со строкой предупреждения и исключения. Если *offset* не равно `None`, сравнивается со смещением исключения.11361137Новое в версии 3.8.11381139#### `test.support.warnings_helper.check_warnings(*filters, quiet=True)`11401141Удобная обёртка для [`warnings.catch_warnings()`](https://python-all.ru/3.11/library/warnings.html#warnings.catch_warnings), упрощающая проверку того, что предупреждение было корректно возбуждено. Она примерно эквивалентна вызову `warnings.catch_warnings(record=True)` с [`warnings.simplefilter()`](https://python-all.ru/3.11/library/warnings.html#warnings.simplefilter), установленным в `always`, и с возможностью автоматической проверки записанных результатов.11421143`check_warnings` принимает кортежи из 2 элементов вида `("message regexp", WarningCategory)` в качестве позиционных аргументов. Если указан один или несколько *filters*, или если необязательный ключевой аргумент *quiet* равен `False`, он проверяет, что предупреждения соответствуют ожидаемым: каждый указанный фильтр должен совпадать хотя бы с одним предупреждением, вызванным вложенным кодом, иначе тест завершается неудачей; если возникают предупреждения, не совпадающие ни с одним из указанных фильтров, тест также завершается неудачей. Чтобы отключить первую из этих проверок, установите *quiet* в `True`.11441145Если аргументы не указаны, по умолчанию используется:11461147```python1148check_warnings(("", Warning), quiet=True)1149```11501151В этом случае перехватываются все предупреждения и исключения не возбуждаются.11521153При входе в менеджер контекста возвращается экземпляр `WarningRecorder`. Базовый список предупреждений из [`catch_warnings()`](https://python-all.ru/3.11/library/warnings.html#warnings.catch_warnings) доступен через атрибут [`warnings`](https://python-all.ru/3.11/library/warnings.html#module-warnings) объекта recorder. Для удобства атрибуты объекта, представляющего последнее предупреждение, также можно получить напрямую через объект recorder (см. пример ниже). Если предупреждений не было, то любой из атрибутов, которые обычно ожидаются у объекта, представляющего предупреждение, вернёт `None`.11541155Объект recorder также имеет метод `reset()`, который очищает список предупреждений.11561157Менеджер контекста предназначен для использования следующим образом:11581159```python1160with check_warnings(("assertion is always true", SyntaxWarning),1161                    ("", UserWarning)):1162    exec('assert(False, "Hey!")')1163    warnings.warn(UserWarning("Hide me!"))1164```11651166В этом случае, если какое-либо из предупреждений не было возбуждено, или было возбуждено другое предупреждение, [`check_warnings()`](https://python-all.ru/3.11/library/test.html#test.support.warnings_helper.check_warnings) возбудит исключение.11671168Когда тесту требуется более глубоко изучить предупреждения, а не просто проверить, были ли они, можно использовать такой код:11691170```python1171with check_warnings(quiet=True) as w:1172    warnings.warn("foo")1173    assert str(w.args[0]) == "foo"1174    warnings.warn("bar")1175    assert str(w.args[0]) == "bar"1176    assert str(w.warnings[0].args[0]) == "foo"1177    assert str(w.warnings[1].args[0]) == "bar"1178    w.reset()1179    assert len(w.warnings) == 01180```11811182Здесь будут перехвачены все предупреждения, и тестовый код напрямую проверяет перехваченные предупреждения.11831184Изменено в версии 3.2: Новые необязательные аргументы *filters* и *quiet*.11851186#### `class test.support.warnings_helper.WarningsRecorder`11871188Класс, используемый для записи предупреждений в модульных тестах. Подробнее см. документацию [`check_warnings()`](https://python-all.ru/3.11/library/test.html#test.support.warnings_helper.check_warnings) выше.1189