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

test.md

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

1> **Источник:** https://python-all.ru/3.4/library/test.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 26.7. [`test`](https://python-all.ru/3.4/library/test.html#module-test) – пакет регрессионного тестирования для Python89> **Примечание**10>11> Пакет [`test`](https://python-all.ru/3.4/library/test.html#module-test) предназначен только для внутреннего использования Python. Он документирован для пользы основных разработчиков Python. Любое использование этого пакета за пределами стандартной библиотеки Python не рекомендуется, так как упомянутый здесь код может быть изменён или удалён без предупреждения между выпусками Python.1213Пакет [`test`](https://python-all.ru/3.4/library/test.html#module-test) содержит все регрессионные тесты для Python, а также модули [`test.support`](https://python-all.ru/3.4/library/test.html#module-test.support) и `test.regrtest`. [`test.support`](https://python-all.ru/3.4/library/test.html#module-test.support) используется для улучшения тестов, а `test.regrtest` управляет набором тестов.1415Каждый модуль в пакете [`test`](https://python-all.ru/3.4/library/test.html#module-test), имя которого начинается с `test_`, является набором тестов для конкретного модуля или функции. Все новые тесты следует писать с использованием модуля [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest) или [`doctest`](https://python-all.ru/3.4/library/doctest.html#module-doctest). Некоторые старые тесты написаны в «традиционном» стиле тестирования, который сравнивает вывод, напечатанный в `sys.stdout`; такой стиль тестов считается устаревшим.1617> **См. также**18>19> **Модуль [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest)**20>21> Написание регрессионных тестов PyUnit.22>23> **Модуль [`doctest`](https://python-all.ru/3.4/library/doctest.html#module-doctest)**24>25> Тесты, встроенные в строки документации.2627## 26.7.1. Написание модульных тестов для пакета [`test`](https://python-all.ru/3.4/library/test.html#module-test)2829Рекомендуется, чтобы тесты, использующие модуль [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest), следовали нескольким рекомендациям. Одна из них – называть тестовый модуль, начиная его с `test_` и заканчивая именем тестируемого модуля. Методы тестирования в тестовом модуле должны начинаться с `test_` и заканчиваться описанием того, что тестирует метод. Это необходимо, чтобы драйвер тестов распознавал методы как тестовые. Кроме того, не следует включать строку документации для метода. Вместо этого следует использовать комментарий (например, `# Тестирует функция возвращает только True или False`) для документирования тестовых методов. Это сделано потому, что строки документации выводятся на печать, если они существуют, и, таким образом, не указывается, какой именно тест выполняется.3031Часто используется стандартная заготовка:3233```python34import unittest35from test import support3637class MyTestCase1(unittest.TestCase):3839    # Используйте setUp() и tearDown() только при необходимости4041    def setUp(self):42        ... code to execute in preparation for tests ...4344    def tearDown(self):45        ... code to execute to clean up after tests ...4647    def test_feature_one(self):48        # Тест первой возможности.49        ... testing code ...5051    def test_feature_two(self):52        # Тест второй возможности.53        ... testing code ...5455    ... more test methods ...5657class MyTestCase2(unittest.TestCase):58    ... same structure as MyTestCase1 ...5960... more test classes ...6162if __name__ == '__main__':63    unittest.main()64```6566Этот шаблон кода позволяет запускать набор тестов с помощью `test.regrtest`, как отдельный скрипт, поддерживающий CLI [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest), или через CLI `python -m unittest`.6768Цель регрессионного тестирования – попытаться сломать код. Это приводит к нескольким правилам, которым следует следовать:6970- Набор тестов должен задействовать все классы, функции и константы. Это включает не только внешний API, который будет представлен внешнему миру, но и «приватный» код.71- Предпочтительно тестирование методом белого ящика (анализ тестируемого кода при написании тестов). Тестирование методом чёрного ящика (тестирование только опубликованного пользовательского интерфейса) недостаточно для проверки всех граничных и крайних случаев.72- Убедитесь, что все возможные значения протестированы, включая недопустимые. Это гарантирует, что не только все допустимые значения принимаются, но и неправильные значения обрабатываются корректно.73- Исчерпайте как можно больше путей выполнения кода. Тестируйте места ветвления и соответственно подбирайте входные данные, чтобы гарантировать, что проходит как можно больше различных путей.74- Добавляйте явные тесты для любых ошибок, обнаруженных в тестируемом коде. Это гарантирует, что ошибка не возникнет снова, если код будет изменён в будущем.75- Убедитесь, что после тестов выполнена очистка (например, закрыты и удалены все временные файлы).76- Если тест зависит от конкретного условия операционной системы, то проверьте, что условие уже выполняется, прежде чем запускать тест.77- Импортируйте как можно меньше модулей и делайте это как можно раньше. Это минимизирует внешние зависимости тестов, а также уменьшает возможные аномальные поведения из-за побочных эффектов импорта модуля.78- Старайтесь максимально повторно использовать код. Иногда тесты могут различаться такой мелочью, как тип используемых входных данных. Минимизируйте дублирование кода, создавая подкласс базового тестового класса, который определяет входные данные:7980  ```python81  class TestFuncAcceptsSequencesMixin:8283      func = mySuperWhammyFunction8485      def test_func(self):86          self.func(self.arg)8788  class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):89      arg = [1, 2, 3]9091  class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):92      arg = 'abc'9394  class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):95      arg = (1, 2, 3)96  ```9798  При использовании этого шаблона помните, что все классы, наследующие от [`unittest.TestCase`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase), выполняются как тесты. Класс `Mixin` в примере выше не содержит никаких данных и поэтому не может быть запущен сам по себе, следовательно, он не наследует от [`unittest.TestCase`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase).99100> **См. также**101>102> **Разработка через тестирование**103>104> Книга Кента Бека о написании тестов до кода.105106## 26.7.2. Запуск тестов с помощью интерфейса командной строки107108Пакет [`test`](https://python-all.ru/3.4/library/test.html#module-test) можно запускать как скрипт для управления набором регрессионных тестов Python благодаря опции [*-m*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-m): **python -m test**. Под капотом он использует `test.regrtest`; вызов **python -m test.regrtest**, использовавшийся в предыдущих версиях Python, всё ещё работает. Запуск скрипта самостоятельно автоматически запускает все регрессионные тесты в пакете [`test`](https://python-all.ru/3.4/library/test.html#module-test). Это делается путём поиска всех модулей в пакете, имена которых начинаются с `test_`, их импорта и выполнения функции `test_main()`, если она присутствует, или загрузки тестов через unittest.TestLoader.loadTestsFromModule, если `test_main` не существует. Имена тестов для выполнения также могут быть переданы скрипту. Указание одного регрессионного теста (**python -m test test\_spam**) минимизирует вывод и покажет только, прошёл тест или провалился.109110Запуск [`test`](https://python-all.ru/3.4/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.4/library/test.html#module-test) со всеми ресурсами, кроме `audio` и `largefile`. Для списка всех ресурсов и дополнительных опций командной строки выполните **python -m test -h**.111112Некоторые другие способы выполнения регрессионных тестов зависят от платформы, на которой они выполняются. В Unix можно выполнить **make test** в корневом каталоге, где был собран Python. В Windows выполнение **rt.bat** из каталога `PCBuild` запустит все регрессионные тесты.113114# 26.8. [`test.support`](https://python-all.ru/3.4/library/test.html#module-test.support) – утилиты для набора тестов Python115116Модуль [`test.support`](https://python-all.ru/3.4/library/test.html#module-test.support) обеспечивает поддержку набора регрессионных тестов Python.117118> **Примечание**119>120> [`test.support`](https://python-all.ru/3.4/library/test.html#module-test.support) не является публичным модулем. Он документирован здесь, чтобы помочь разработчикам Python писать тесты. API этого модуля может изменяться без обеспечения обратной совместимости между выпусками.121122В этом модуле определены следующие исключения:123124#### `exception test.support.TestFailed`125126Исключение, возбуждаемое при сбое теста. Это устарело в пользу тестов на основе [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest) и методов утверждений [`unittest.TestCase`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase).127128#### `exception test.support.ResourceDenied`129130Подкласс [`unittest.SkipTest`](https://python-all.ru/3.4/library/unittest.html#unittest.SkipTest). Возбуждается, когда ресурс (например, сетевое соединение) недоступен. Возбуждается функцией [`requires()`](https://python-all.ru/3.4/library/test.html#test.support.requires).131132Модуль [`test.support`](https://python-all.ru/3.4/library/test.html#module-test.support) определяет следующие константы:133134#### `test.support.verbose`135136`True`, когда включён подробный вывод. Следует проверять, когда требуется более подробная информация о выполняющемся тесте. *verbose* устанавливается `test.regrtest`.137138#### `test.support.is_jython`139140`True`, если работающий интерпретатор – Jython.141142#### `test.support.TESTFN`143144Устанавливается в имя, безопасное для использования в качестве имени временного файла. Любой созданный временный файл должен быть закрыт и удалён.145146Модуль [`test.support`](https://python-all.ru/3.4/library/test.html#module-test.support) определяет следующие функции:147148#### `test.support.forget(module_name)`149150Удаляет модуль с именем *module\_name* из `sys.modules` и удаляет все скомпилированные в байт-код файлы этого модуля.151152#### `test.support.is_resource_enabled(resource)`153154Возвращает `True`, если *resource* включён и доступен. Список доступных ресурсов задаётся только тогда, когда `test.regrtest` выполняет тесты.155156#### `test.support.requires(resource, msg=None)`157158Вызывает исключение [`ResourceDenied`](https://python-all.ru/3.4/library/test.html#test.support.ResourceDenied), если *resource* недоступен. *msg* – аргумент для [`ResourceDenied`](https://python-all.ru/3.4/library/test.html#test.support.ResourceDenied), если исключение выбрасывается. Всегда возвращает `True`, если вызвана из функции, чьё `__name__` равно `'__main__'`. Используется, когда тесты выполняются `test.regrtest`.159160#### `test.support.findfile(filename, subdir=None)`161162Возвращает путь к файлу с именем *filename*. Если совпадений не найдено, возвращается *filename*. Это не считается ошибкой, так как оно может быть путём к файлу.163164> Установка165>166> *subdir*167>168> задаёт относительный путь для поиска файла, а не прямой поиск в каталогах пути.169170#### `test.support.run_unittest(*classes)`171172Выполняет подклассы [`unittest.TestCase`](https://python-all.ru/3.4/library/unittest.html#unittest.TestCase), переданные в функцию. Функция просматривает классы в поисках методов, начинающихся с префикса `test_`, и выполняет тесты по отдельности.173174Также допускается передача строк в качестве параметров; они должны быть ключами в `sys.modules`. Каждый соответствующий модуль будет просканирован с помощью `unittest.TestLoader.loadTestsFromModule()`. Обычно это встречается в следующей функции `test_main()`:175176```python177def test_main():178    support.run_unittest(__name__)179```180181Это запустит все тесты, определенные в указанном модуле.182183#### `test.support.run_doctest(module, verbosity=None)`184185Запускает [`doctest.testmod()`](https://python-all.ru/3.4/library/doctest.html#doctest.testmod) для указанного *module*. Возвращает `(failure_count, test_count)`.186187Если *verbosity* равно `None`, [`doctest.testmod()`](https://python-all.ru/3.4/library/doctest.html#doctest.testmod) выполняется с подробностью, установленной в [`verbose`](https://python-all.ru/3.4/library/test.html#test.support.verbose). В противном случае выполняется с подробностью, установленной в `None`.188189#### `test.support.check_warnings(*filters, quiet=True)`190191Удобная обёртка для [`warnings.catch_warnings()`](https://python-all.ru/3.4/library/warnings.html#warnings.catch_warnings), упрощающая проверку того, что предупреждение было правильно вызвано. Она примерно эквивалентна вызову `warnings.catch_warnings(record=True)` с [`warnings.simplefilter()`](https://python-all.ru/3.4/library/warnings.html#warnings.simplefilter), установленным в `always`, и возможностью автоматически проверять записанные результаты.192193`check_warnings` принимает кортежи из 2 элементов вида `("message regexp", WarningCategory)` в качестве позиционных аргументов. Если указан один или несколько *filters*, или если необязательный ключевой аргумент *quiet* равен `False`, выполняется проверка, что предупреждения соответствуют ожиданиям: каждый указанный фильтр должен совпадать хотя бы с одним из предупреждений, вызванных вложенным кодом, иначе тест завершается ошибкой; также, если возникают предупреждения, не совпадающие ни с одним из указанных фильтров, тест завершается ошибкой. Чтобы отключить первую из этих проверок, установите *quiet* в `True`.194195Если аргументы не указаны, по умолчанию используется:196197```python198check_warnings(("", Warning), quiet=True)199```200201В этом случае перехватываются все предупреждения и исключения не возбуждаются.202203При входе в контекстный менеджер возвращается экземпляр `WarningRecorder`. Лежащий в основе список предупреждений из [`catch_warnings()`](https://python-all.ru/3.4/library/warnings.html#warnings.catch_warnings) доступен через атрибут [`warnings`](https://python-all.ru/3.4/library/warnings.html#module-warnings) объекта recorder. Для удобства атрибуты объекта, представляющего последнее предупреждение, также можно получить напрямую через объект recorder (см. пример ниже). Если ни одного предупреждения не было вызвано, то любой из атрибутов, которые обычно ожидаются у объекта, представляющего предупреждение, вернёт `None`.204205Объект recorder также имеет метод `reset()`, который очищает список предупреждений.206207Менеджер контекста предназначен для использования следующим образом:208209```python210with check_warnings(("assertion is always true", SyntaxWarning),211                    ("", UserWarning)):212    exec('assert(False, "Hey!")')213    warnings.warn(UserWarning("Hide me!"))214```215216В этом случае, если одно из предупреждений не было вызвано или было вызвано другое предупреждение, [`check_warnings()`](https://python-all.ru/3.4/library/test.html#test.support.check_warnings) вызовет ошибку.217218Когда тесту требуется более глубоко изучить предупреждения, а не просто проверить, были ли они, можно использовать такой код:219220```python221with check_warnings(quiet=True) as w:222    warnings.warn("foo")223    assert str(w.args[0]) == "foo"224    warnings.warn("bar")225    assert str(w.args[0]) == "bar"226    assert str(w.warnings[0].args[0]) == "foo"227    assert str(w.warnings[1].args[0]) == "bar"228    w.reset()229    assert len(w.warnings) == 0230```231232Здесь будут перехвачены все предупреждения, и тестовый код напрямую проверяет перехваченные предупреждения.233234Изменено в версии 3.2: Новые необязательные аргументы *filters* и *quiet*.235236#### `test.support.captured_stdin()`237238#### `test.support.captured_stdout()`239240#### `test.support.captured_stderr()`241242Контекстный менеджер, который временно заменяет указанный поток объектом [`io.StringIO`](https://python-all.ru/3.4/library/io.html#io.StringIO).243244Пример использования с выходными потоками:245246```python247with captured_stdout() as stdout, captured_stderr() as stderr:248    print("hello")249    print("error", file=sys.stderr)250assert stdout.getvalue() == "hello\n"251assert stderr.getvalue() == "error\n"252```253254Пример использования с входным потоком:255256```python257with captured_stdin() as stdin:258    stdin.write('hello\n')259    stdin.seek(0)260    # вызвать тестовый код, который читает из sys.stdin261    captured = input()262self.assertEqual(captured, "hello")263```264265#### `test.support.temp_dir(path=None, quiet=False)`266267Менеджер контекста, который создаёт временную директорию по *path* и возвращает эту директорию.268269Если *path* равен None, временный каталог создаётся с помощью [`tempfile.mkdtemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkdtemp). Если *quiet* равно `False`, контекстный менеджер вызывает исключение при ошибке. В противном случае, если *path* указан и не может быть создан, выдаётся только предупреждение.270271#### `test.support.change_cwd(path, quiet=False)`272273Менеджер контекста, который временно изменяет текущую рабочую директорию на *path* и возвращает эту директорию.274275Если *quiet* равно `False`, контекстный менеджер вызывает исключение при ошибке. В противном случае он выдаёт только предупреждение и оставляет текущий рабочий каталог без изменений.276277#### `test.support.temp_cwd(name='tempcwd', quiet=False)`278279Менеджер контекста, который временно создаёт новую директорию и изменяет текущую рабочую директорию (CWD).280281Контекстный менеджер создаёт временный каталог в текущем каталоге с именем *name*, а затем временно изменяет текущий рабочий каталог. Если *name* равно None, временный каталог создаётся с помощью [`tempfile.mkdtemp()`](https://python-all.ru/3.4/library/tempfile.html#tempfile.mkdtemp).282283Если *quiet* равно `False` и невозможно создать или изменить текущий рабочий каталог (CWD), вызывается ошибка. В противном случае выдаётся только предупреждение и используется исходный CWD.284285#### `test.support.temp_umask(umask)`286287Менеджер контекста, который временно устанавливает umask процесса.288289#### `test.support.can_symlink()`290291Возвращает `True`, если ОС поддерживает символические ссылки, иначе `False`.292293#### `@test.support.skip_unless_symlink`294295Декоратор для запуска тестов, требующих поддержки символических ссылок.296297#### `@test.support.anticipate_failure(condition)`298299Декоратор для условной пометки тестов с помощью [`unittest.expectedFailure()`](https://python-all.ru/3.4/library/unittest.html#unittest.expectedFailure). Любое использование этого декоратора должно сопровождаться комментарием с указанием соответствующего тикета в системе отслеживания ошибок.300301#### `@test.support.run_with_locale(catstr, *locales)`302303Декоратор для запуска функции в другой локали с корректным сбросом локали после завершения. Параметр *catstr* – это категория локали в виде строки (например, `"LC_ALL"`). Переданные *локали* будут перебираться последовательно, и будет использована первая подходящая локаль.304305#### `test.support.make_bad_fd()`306307Создаёт некорректный файловый дескриптор, открывая и закрывая временный файл, и возвращая его дескриптор.308309#### `test.support.import_module(name, deprecated=False)`310311Эта функция импортирует и возвращает указанный модуль. В отличие от обычного импорта, если модуль не удается импортировать, функция генерирует исключение [`unittest.SkipTest`](https://python-all.ru/3.4/library/unittest.html#unittest.SkipTest).312313Сообщения об устаревании модулей и пакетов подавляются во время этого импорта, если *устарело* равно `True`.314315Новое в версии 3.1.316317#### `test.support.import_fresh_module(name, fresh=(), blocked=(), deprecated=False)`318319Эта функция импортирует и возвращает свежую копию указанного модуля Python, удаляя его из `sys.modules` перед выполнением импорта. Обратите внимание, что, в отличие от `reload()`, оригинальный модуль не затрагивается этой операцией.320321Параметр *fresh* – это итерируемая последовательность дополнительных имен модулей, которые также удаляются из кеша `sys.modules` перед выполнением импорта.322323Параметр *blocked* – это итерируемая последовательность имен модулей, которые заменяются на `None` в кеше модулей во время импорта, чтобы попытки их импорта вызывали исключение [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError).324325Указанный модуль и все модули, перечисленные в параметрах *fresh* и *blocked*, сохраняются до начала импорта, а затем повторно вставляются в `sys.modules` после завершения свежего импорта.326327Сообщения об устаревании модулей и пакетов подавляются во время этого импорта, если *устарело* равно `True`.328329Эта функция генерирует исключение [`ImportError`](https://python-all.ru/3.4/library/exceptions.html#ImportError), если указанный модуль не удается импортировать.330331Пример использования:332333```python334# Получение копий модуля warnings для тестирования без влияния на335# версию, используемую остальной частью тестового набора. Одна копия использует336# реализацию на C, другая принудительно использует запасную реализацию на чистом337# реализация338py_warnings = import_fresh_module('warnings', blocked=['_warnings'])339c_warnings = import_fresh_module('warnings', fresh=['_warnings'])340```341342Новое в версии 3.1.343344#### `test.support.bind_port(sock, host=HOST)`345346Привязывает сокет к свободному порту и возвращает номер порта. Для обеспечения использования непривязанного порта полагается на эфемерные порты. Это важно, так как множество тестов могут выполняться одновременно, особенно в среде buildbot. Этот метод генерирует исключение, если `sock.family` равно [`AF_INET`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET), а `sock.type` равно [`SOCK_STREAM`](https://python-all.ru/3.4/library/socket.html#socket.SOCK_STREAM), и на сокете установлен `SO_REUSEADDR` или `SO_REUSEPORT`. Тесты никогда не должны устанавливать эти параметры сокета для сокетов TCP/IP. Единственный случай для их установки – тестирование многоадресной рассылки (multicasting) через несколько UDP-сокетов.347348Кроме того, если доступен параметр сокета `SO_EXCLUSIVEADDRUSE` (например, в Windows), он будет установлен на сокете. Это предотвратит привязку любого другого процесса к нашему хосту/порту на время выполнения теста.349350#### `test.support.find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM)`351352Возвращает неиспользуемый порт, который должен подходить для привязки. Это достигается созданием временного сокета с тем же семейством и типом, что и параметр `sock` (по умолчанию [`AF_INET`](https://python-all.ru/3.4/library/socket.html#socket.AF_INET), [`SOCK_STREAM`](https://python-all.ru/3.4/library/socket.html#socket.SOCK_STREAM)), и его привязкой к указанному адресу хоста (по умолчанию `0.0.0.0`) с портом, установленным в 0, запрашивая у ОС неиспользуемый эфемерный порт. Затем временный сокет закрывается и удаляется, а эфемерный порт возвращается.353354Для любых тестов, где серверный сокет необходимо привязать к определенному порту на время выполнения теста, следует использовать либо этот метод, либо [`bind_port()`](https://python-all.ru/3.4/library/test.html#test.support.bind_port). Какой из них выбрать, зависит от того, создает ли вызывающий код сокет Python или же неиспользуемый порт нужно указать в конструкторе или передать внешней программе (например, аргумент `-accept` для режима s\_server в openssl). Всегда предпочитайте [`bind_port()`](https://python-all.ru/3.4/library/test.html#test.support.bind_port) вместо [`find_unused_port()`](https://python-all.ru/3.4/library/test.html#test.support.find_unused_port), где это возможно. Использование жестко заданного порта не рекомендуется, так как это может сделать невозможным одновременный запуск нескольких экземпляров теста, что является проблемой для сборочных ботов.355356#### `test.support.load_package_tests(pkg_dir, loader, standard_tests, pattern)`357358Общая реализация протокола [`unittest`](https://python-all.ru/3.4/library/unittest.html#module-unittest) `load_tests` для использования в тестовых пакетах. Параметр *pkg\_dir* – это корневой каталог пакета; *loader*, *standard\_tests* и *pattern* – аргументы, ожидаемые функцией `load_tests`. В простых случаях файл `__init__.py` тестового пакета может быть следующим:359360```python361import os362from test.support import load_package_tests363364def load_tests(*args):365    return load_package_tests(os.path.dirname(__file__), *args)366```367368Модуль [`test.support`](https://python-all.ru/3.4/library/test.html#module-test.support) определяет следующие классы:369370#### `class test.support.TransientResource(exc, **kwargs)`371372Экземпляры представляют собой менеджер контекста, который генерирует исключение [`ResourceDenied`](https://python-all.ru/3.4/library/test.html#test.support.ResourceDenied), если возникает указанный тип исключения. Все именованные аргументы обрабатываются как пары атрибут/значение для сравнения с любым исключением, возникшим внутри блока [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with). Исключение [`ResourceDenied`](https://python-all.ru/3.4/library/test.html#test.support.ResourceDenied) возбуждается только в том случае, если все пары правильно совпадают с атрибутами исключения.373374#### `class test.support.EnvironmentVarGuard`375376Класс, используемый для временной установки или сброса переменных окружения. Экземпляры можно использовать как менеджер контекста; они имеют полноценный интерфейс словаря для запроса/изменения базового `os.environ`. После выхода из менеджера контекста все изменения переменных окружения, сделанные через этот экземпляр, будут отменены.377378Изменено в версии 3.1: Добавлен интерфейс словаря.379380#### `EnvironmentVarGuard.set(envvar, value)`381382Временно устанавливает переменную окружения `envvar` в значение `value`.383384#### `EnvironmentVarGuard.unset(envvar)`385386Временно сбрасывает переменную окружения `envvar`.387388#### `class test.support.SuppressCrashReport`389390Менеджер контекста, используемый для предотвращения всплывающих диалоговых окон об аварийном завершении в тестах, которые ожидаемо завершаются аварийно в подпроцессе.391392В Windows отключает диалоги отчётов об ошибках Windows с помощью [SetErrorMode](https://python-all.ru/3.4/library/test.html).393394На UNIX [`resource.setrlimit()`](https://python-all.ru/3.4/library/resource.html#resource.setrlimit) используется для установки мягкого ограничения [`resource.RLIMIT_CORE`](https://python-all.ru/3.4/library/resource.html#resource.RLIMIT_CORE) в 0, чтобы предотвратить создание файлов daмпов памяти.395396На обеих платформах предыдущее значение восстанавливается с помощью [`__exit__()`](https://python-all.ru/3.4/reference/datamodel.html#object.__exit__).397398#### `class test.support.WarningsRecorder`399400Класс, используемый для записи предупреждений в модульных тестах. Дополнительные сведения см. в описании [`check_warnings()`](https://python-all.ru/3.4/library/test.html#test.support.check_warnings) выше.401