test — Пакет регрессионных тестов для Python

Примечание

Пакет test предназначен только для внутреннего использования Python. Он задокументирован в интересах основных разработчиков Python. Любое использование этого пакета за пределами стандартной библиотеки Python не рекомендуется, поскольку упомянутый здесь код может быть изменен или удален без предварительного уведомления в период между выпусками Python.


Пакет test содержит все регрессионные тесты для Python, а также модули test.support и test.regrtest. test.support используется для улучшения ваших тестов, в то время как test.regrtest управляет набором тестов .

Каждый модуль в пакете test, название которого начинается с test_, представляет собой набор тестов для определенного модуля или функции. Все новые тесты должны быть написаны с использованием модуля unittest или doctest. Некоторые старые тесты написаны с использованием «традиционного» стиля тестирования, который сравнивает выводимые данные с sys.stdout; этот стиль тестирования считается устаревшим.

См.также

Модуль unittest

Написание регрессионных тестов PyUnit.

Модуль doctest

Тесты, встроенные в строки документации.

Написание модульных тестов для пакета test

Желательно, чтобы тесты, использующие модуль unittest, следовали нескольким рекомендациям. Первое - дать тестовому модулю название, начав его с test_ и завершив его именем тестируемого модуля. Методы тестирования в модуле тестирования должны начинаться с test_ и заканчиваться описанием того, что тестируется методом. Это необходимо для того, чтобы тестировщик распознал методы как методы тестирования. Кроме того, не следует включать строку документации для метода. Для предоставления документации по методам тестирования следует использовать комментарий (например, # Tests function returns only True or False). Это делается потому, что строки документации распечатываются, если они существуют, и, таким образом, не указывается, какой тест выполняется.

Часто используется базовый шаблон:

import unittest
from test import support

class MyTestCase1(unittest.TestCase):

    # Only use setUp() and tearDown() if necessary

    def setUp(self):
        ... code to execute in preparation for tests ...

    def tearDown(self):
        ... code to execute to clean up after tests ...

    def test_feature_one(self):
        # Test feature one.
        ... testing code ...

    def test_feature_two(self):
        # Test feature two.
        ... testing code ...

    ... more test methods ...

class MyTestCase2(unittest.TestCase):
    ... same structure as MyTestCase1 ...

... more test classes ...

if __name__ == '__main__':
    unittest.main()

Этот шаблон кода позволяет запускать набор тестов с помощью test.regrtest, сам по себе как скрипт, поддерживающий unittest CLI, или с помощью python -m unittest CLIPS.

Цель регрессионного тестирования - попытаться взломать код. Это приводит к нескольким рекомендациям, которым следует следовать:

  • Пакет тестирования должен использовать все классы, функции и константы. Это включает в себя не только внешний API, который должен быть представлен внешнему миру, но и «закрытый» код.

  • Предпочтительнее тестирование в режиме «белого ящика» (проверка тестируемого кода во время написания тестов). Тестирование в режиме «черного ящика» (тестирование только опубликованного пользовательского интерфейса) недостаточно полно, чтобы убедиться, что протестированы все граничные условия.

  • Убедитесь, что проверены все возможные значения, включая недопустимые. Это гарантирует, что не только все допустимые значения являются приемлемыми, но и что неправильные значения обрабатываются правильно.

  • Используйте как можно больше путей в коде. Проверьте, где происходит ветвление, и, таким образом, адаптируйте вводимые данные, чтобы убедиться, что в коде используется как можно больше различных путей.

  • Добавьте явную проверку на наличие любых обнаруженных ошибок в тестируемом коде. Это гарантирует, что ошибка не возникнет снова, если код будет изменен в будущем.

  • Обязательно проведите очистку после ваших тестов (например, закройте и удалите все временные файлы).

  • Если тест зависит от определенного состояния операционной системы, то перед попыткой выполнения теста убедитесь, что это условие уже существует.

  • Импортируйте как можно меньше модулей и сделайте это как можно скорее. Это минимизирует внешние зависимости тестов, а также сводит к минимуму возможное аномальное поведение из-за побочных эффектов импорта модуля.

  • Старайтесь максимально эффективно использовать код повторно. Иногда тесты могут отличаться друг от друга в зависимости от типа используемых входных данных. Сведите к минимуму дублирование кода, создав подклассы базового тестового класса и класса, который определяет входные данные:

    class TestFuncAcceptsSequencesMixin:
    
        func = mySuperWhammyFunction
    
        def test_func(self):
            self.func(self.arg)
    
    class AcceptLists(TestFuncAcceptsSequencesMixin, unittest.TestCase):
        arg = [1, 2, 3]
    
    class AcceptStrings(TestFuncAcceptsSequencesMixin, unittest.TestCase):
        arg = 'abc'
    
    class AcceptTuples(TestFuncAcceptsSequencesMixin, unittest.TestCase):
        arg = (1, 2, 3)
    

    При использовании этого шаблона помните, что все классы, которые наследуются от unittest.TestCase, запускаются как тесты. Класс TestFuncAcceptsSequencesMixin в приведенном выше примере не содержит никаких данных и поэтому не может быть запущен сам по себе, поэтому он не наследуется от unittest.TestCase.

См.также

Разработка на основе тестирования

Книга Кента Бека о написании тестов перед написанием кода.

Запуск тестов с использованием интерфейса командной строки

Пакет test можно запустить как скрипт для запуска набора регрессионных тестов Python, благодаря опции -m: python -m test. По сути, он использует test.regrtest; вызов python -m test.regrtest, использовавшийся в предыдущих версиях Python, все еще работает. При самостоятельном запуске скрипта автоматически запускаются все регрессионные тесты в пакете test. Он делает это, находя все модули в пакете, название которых начинается с test_, импортируя их и выполняя функцию test_main(), если она присутствует, или загружая тесты с помощью unittest.TestLoader.loadTestsFromМодуль, если test_main не существует. Имена тестов, которые нужно выполнить, также могут быть переданы в скрипт. Указание одного регрессионного теста (python -m test test_spam) минимизирует выходные данные и выводит только то, прошел тест успешно или нет.

Запуск test напрямую позволяет указать, какие ресурсы доступны для использования тестами. Для этого используется параметр командной строки -u. Указание all в качестве значения для параметра -u позволяет использовать все возможные ресурсы: python -m test -uall. Если желательны все ресурсы, кроме одного (более распространенный случай), список нежелательных ресурсов, разделенных запятыми, может быть указан после all. Команда python -m test -uall,-audio,-largefile будет выполнена test со всеми ресурсами, кроме ресурсов audio и largefile. Для получения списка всех ресурсов и дополнительных параметров командной строки выполните команду python -m test -h.

Некоторые другие способы выполнения регрессионных тестов зависят от того, на какой платформе выполняются тесты. В Unix вы можете запустить make test в каталоге верхнего уровня, в котором был создан Python. В Windows при выполнении rt.bat из вашего каталога PCbuild будут запущены все регрессионные тесты.

test.support — Утилиты для набора тестов Python

Модуль test.support обеспечивает поддержку набора регрессионных тестов Python.

Примечание

test.support не является общедоступным модулем. Здесь приведена документация, помогающая разработчикам на Python писать тесты. API этого модуля может изменяться без учета проблем обратной совместимости между версиями.

Этот модуль определяет следующие исключения:

exception test.support.TestFailed

Исключение, которое генерируется при сбое теста. Этот метод не рекомендуется использовать в пользу тестов на основе unittest и методов подтверждения unittest.TestCase.

exception test.support.ResourceDenied

Подкласс unittest.SkipTest. Вызывается, когда ресурс (например, сетевое подключение) недоступен. Вызывается функцией requires().

Модуль test.support определяет следующие константы:

test.support.verbose

True когда включен подробный вывод. Этот флажок следует установить, если требуется более подробная информация о выполняемом тесте. подробный вывод задается значением test.regrtest.

test.support.is_jython

True если запущенный интерпретатор - Python.

test.support.is_android

True если используется система Android.

test.support.unix_shell

Путь к оболочке, если ее нет в Windows; в противном случае None.

test.support.LOOPBACK_TIMEOUT

Время ожидания в секундах для тестов с использованием сетевого сервера, прослушивающего локальный сетевой интерфейс обратной связи, например 127.0.0.1.

Время ожидания достаточно велико, чтобы предотвратить сбой теста: оно учитывает, что клиент и сервер могут выполняться в разных потоках или даже в разных процессах.

Время ожидания должно быть достаточным для connect(), recv() и send() методов socket.socket.

Его значение по умолчанию равно 5 секундам.

Смотрите также INTERNET_TIMEOUT.

test.support.INTERNET_TIMEOUT

Тайм-аут в секундах для сетевых запросов, поступающих в Интернет.

Время ожидания достаточно короткое, чтобы предотвратить слишком долгое ожидание теста, если интернет-запрос заблокирован по какой-либо причине.

Обычно тайм-аут с использованием INTERNET_TIMEOUT не должен помечать тест как неудачный, а вместо этого пропускать тест: смотрите transient_internet().

Его значение по умолчанию равно 1 минуте.

Смотрите также LOOPBACK_TIMEOUT.

test.support.SHORT_TIMEOUT

Время ожидания в секундах для того, чтобы отметить тест как неудачный, если он выполняется «слишком долго».

Значение тайм-аута зависит от параметра командной строки regrtest --timeout.

Если тест с использованием SHORT_TIMEOUT начинает случайно завершаться ошибкой на медленных сборочных роботах, используйте вместо этого LONG_TIMEOUT.

Его значение по умолчанию равно 30 секундам.

test.support.LONG_TIMEOUT

Время ожидания в секундах для определения зависания теста.

Этого достаточно, чтобы снизить риск сбоя теста на самых медленных сборщиках Python. Его не следует использовать для пометки теста как неудачного, если он выполняется «слишком долго». Значение тайм-аута зависит от параметра командной строки regrtest --timeout.

Его значение по умолчанию равно 5 минутам.

Смотрите также LOOPBACK_TIMEOUT, INTERNET_TIMEOUT и SHORT_TIMEOUT.

test.support.PGO

Установите, когда тесты могут быть пропущены, если они не являются полезными для PGO.

test.support.PIPE_MAX_SIZE

Константа, которая, вероятно, больше, чем размер базового буфера канала операционной системы, чтобы блокировать запись.

test.support.SOCK_MAX_SIZE

Константа, которая, вероятно, больше, чем размер базового буфера сокета операционной системы, чтобы блокировать запись.

test.support.TEST_SUPPORT_DIR

Устанавливается в каталог верхнего уровня, содержащий test.support.

test.support.TEST_HOME_DIR

Установите значение каталога верхнего уровня для тестового пакета.

test.support.TEST_DATA_DIR

Установите значение data в каталоге тестового пакета.

test.support.MAX_Py_ssize_t

Установите значение sys.maxsize для тестов с большим объемом памяти.

test.support.max_memuse

Устанавливается значением set_memlimit() в качестве ограничения объема памяти для тестов с большим объемом памяти. Ограничено значением MAX_Py_ssize_t.

test.support.real_max_memuse

Устанавливается значением set_memlimit() в качестве ограничения объема памяти для тестов с большим объемом памяти. Не ограничено значением MAX_Py_ssize_t.

test.support.MISSING_C_DOCSTRINGS

Установите значение True, если Python собран без строк документации (макрос WITH_DOC_STRINGS не определен). Смотрите параметр configure --without-doc-strings.

Смотрите также переменную HAVE_DOCSTRINGS.

test.support.HAVE_DOCSTRINGS

Установите значение True, если доступны строки документации по функциям. Смотрите опцию python -OO, которая удаляет строки документации из функций, реализованных на Python.

Смотрите также переменную MISSING_C_DOCSTRINGS.

test.support.TEST_HTTP_URL

Определите URL-адрес выделенного HTTP-сервера для сетевых тестов.

test.support.ALWAYS_EQ

Объект, который равен чему угодно. Используется для проверки сравнения смешанных типов.

test.support.NEVER_EQ

Объект, который не равен ничему (даже ALWAYS_EQ). Используется для проверки сравнения смешанных типов.

test.support.LARGEST

Объект, который превосходит что-либо (кроме самого себя). Используется для проверки сравнения смешанных типов.

test.support.SMALLEST

Объект, который меньше, чем что-либо (кроме него самого). Используется для проверки сравнения смешанных типов.

Модуль test.support определяет следующие функции:

test.support.busy_retry(timeout, err_msg=None, /, *, error=True)

Запускайте тело цикла до тех пор, пока break не остановит цикл.

По истечении таймаута секунд вызовите AssertionError, если значение error равно true, или просто остановите цикл, если значение error равно false.

Пример:

for _ in support.busy_retry(support.SHORT_TIMEOUT):
    if check():
        break

Пример использования error=False:

for _ in support.busy_retry(support.SHORT_TIMEOUT, error=False):
    if check():
        break
else:
    raise RuntimeError('my custom error')
test.support.sleeping_retry(timeout, err_msg=None, /, *, init_delay=0.010, max_delay=1.0, error=True)

Стратегия ожидания, которая применяет экспоненциальное замедление.

Запускайте тело цикла до тех пор, пока break не остановит цикл. Переходите в режим ожидания на каждой итерации цикла, но не на первой итерации. Задержка перехода в режим ожидания удваивается на каждой итерации (до max_delay секунд).

Смотрите документацию по использованию параметров в разделе busy_retry().

Пример создания исключения через несколько секунд SHORT_TIMEOUT:

for _ in support.sleeping_retry(support.SHORT_TIMEOUT):
    if check():
        break

Пример использования error=False:

for _ in support.sleeping_retry(support.SHORT_TIMEOUT, error=False):
    if check():
        break
else:
    raise RuntimeError('my custom error')
test.support.is_resource_enabled(resource)

Верните True, если ресурс включен и доступен. Список доступных ресурсов задается только при выполнении тестов test.regrtest.

test.support.python_is_optimized()

Верните True, если Python не был собран с использованием -O0 или -Og.

test.support.with_pymalloc()

Верните _testcapi.WITH_PYMALLOC.

test.support.requires(resource, msg=None)

Поднимите ResourceDenied, если ресурс недоступен. сообщение является аргументом для ResourceDenied, если он задан. Всегда возвращает True, если вызывается функцией, для которой __name__ равно '__main__'. Используется, когда тесты выполняются test.regrtest.

test.support.sortdict(dict)

Возвращает значение dict с отсортированными ключами.

test.support.findfile(filename, subdir=None)

Возвращает путь к файлу с именем filename. Если совпадение не найдено, возвращается filename. Это не означает ошибку, поскольку это может быть путь к файлу.

Параметр subdir указывает относительный путь, который следует использовать для поиска файла, а не искать непосредственно в каталогах path.

test.support.setswitchinterval(interval)

Установите значение sys.setswitchinterval() равным заданному интервалу. Определяет минимальный интервал для систем Android, предотвращающий зависание системы.

test.support.check_impl_detail(**guards)

Используйте эту проверку для защиты тестов, зависящих от реализации CPython, или для их запуска только в реализациях, защищенных аргументами. Эта функция возвращает True или False в зависимости от платформы хоста. Пример использования:

check_impl_detail()               # Only on CPython (default).
check_impl_detail(jython=True)    # Only on Jython.
check_impl_detail(cpython=False)  # Everywhere except CPython.
test.support.set_memlimit(limit)

Установите значения max_memuse и real_max_memuse для тестов с большим объемом памяти.

test.support.record_original_stdout(stdout)

Сохраните значение из stdout. Оно предназначено для хранения стандартного вывода на момент начала повторного тестирования.

test.support.get_original_stdout()

Верните исходный стандартный вывод, заданный record_original_stdout() или sys.stdout, если он не задан.

test.support.args_from_interpreter_flags()

Возвращает список аргументов командной строки, воспроизводящих текущие настройки в sys.flags и sys.warnoptions.

test.support.optim_args_from_interpreter_flags()

Возвращает список аргументов командной строки, воспроизводящих текущие настройки оптимизации в sys.flags.

test.support.captured_stdin()
test.support.captured_stdout()
test.support.captured_stderr()

Контекстный менеджер, который временно заменяет именованный поток на объект io.StringIO.

Пример использования с выходными потоками:

with captured_stdout() as stdout, captured_stderr() as stderr:
    print("hello")
    print("error", file=sys.stderr)
assert stdout.getvalue() == "hello\n"
assert stderr.getvalue() == "error\n"

Пример использования с входным потоком:

with captured_stdin() as stdin:
    stdin.write('hello\n')
    stdin.seek(0)
    # call test code that consumes from sys.stdin
    captured = input()
self.assertEqual(captured, "hello")
test.support.disable_faulthandler()

Контекстный менеджер, который временно отключает faulthandler.

test.support.gc_collect()

Принудительно собрать как можно больше объектов. Это необходимо, потому что сборщик мусора не гарантирует своевременное освобождение. Это означает, что методы __del__ могут быть вызваны позже, чем ожидалось, и weakrefs могут оставаться активными дольше, чем ожидалось.

test.support.disable_gc()

Контекстный менеджер, который отключает сборщик мусора при входе. При выходе сборщик мусора восстанавливает свое предыдущее состояние.

test.support.swap_attr(obj, attr, new_val)

Контекстный менеджер для замены атрибута новым объектом.

Использование:

with swap_attr(obj, "attr", 5):
    ...

Это установит значение obj.attr равным 5 на время действия блока with, восстановив старое значение в конце блока. Если attr не существует в obj, он будет создан, а затем удален в конце блока.

Старое значение (или None, если оно не существует) будет присвоено целевому объекту предложения «as», если таковой существует.

test.support.swap_item(obj, attr, new_val)

Контекстный менеджер для замены элемента новым объектом.

Использование:

with swap_item(obj, "item", 5):
    ...

Это установит значение obj["item"] равным 5 на время действия блока with, восстановив старое значение в конце блока. Если item не существует в obj, он будет создан, а затем удален в конце блока.

Старое значение (или None, если оно не существует) будет присвоено целевому объекту предложения «as», если таковой существует.

test.support.flush_std_streams()

Вызовите метод flush() на sys.stdout, а затем на sys.stderr. Его можно использовать, чтобы убедиться в том, что порядок записей в журналах согласован, прежде чем записывать данные в stderr.

Добавлено в версии 3.11.

test.support.print_warning(msg)

Выведите предупреждение в виде sys.__stderr__. Отформатируйте сообщение следующим образом: f"Warning -- {msg}". Если сообщение состоит из нескольких строк, добавьте префикс "Warning -- " к каждой строке.

Добавлено в версии 3.9.

test.support.wait_process(pid, *, exitcode, timeout=None)

Дождитесь завершения процесса pid и убедитесь, что код завершения процесса равен exitcode.

Поднимите AssertionError, если код завершения процесса не равен exitcode.

Если процесс выполняется дольше, чем тайм-аут секунд (SHORT_TIMEOUT по умолчанию), завершите процесс и запустите AssertionError. Функция тайм-аута недоступна в Windows.

Добавлено в версии 3.9.

test.support.calcobjsize(fmt)

Возвращает размер файла PyObject, элементы структуры которого определены с помощью fmt. Возвращаемое значение включает размер заголовка объекта Python и выравнивание.

test.support.calcvobjsize(fmt)

Возвращает размер файла PyVarObject, элементы структуры которого определены с помощью fmt. Возвращаемое значение включает размер заголовка объекта Python и выравнивание.

test.support.checksizeof(test, o, size)

Для testcase test подтвердите, что sys.getsizeof для o плюс размер заголовка GC равны size.

@test.support.anticipate_failure(condition)

Средство настройки, позволяющее условно помечать тесты знаком unittest.expectedFailure(). Любое использование этого средства настройки должно сопровождаться комментарием, указывающим на соответствующую проблему с отслеживанием.

test.support.system_must_validate_cert(f)

Декоратор, который пропускает оформленный тест при сбоях проверки сертификации TLS.

@test.support.run_with_locale(catstr, *locales)

Декоратор для запуска функции в другом языковом стандарте, корректно переустанавливающий ее после завершения. catstr - это категория языкового стандарта в виде строки (например, "LC_ALL"). Переданные языковые стандарты будут опробованы последовательно, и будет использован первый допустимый языковой стандарт.

@test.support.run_with_tz(tz)

Декоратор для запуска функции в определенном часовом поясе, корректно переустанавливающий ее после завершения.

@test.support.requires_freebsd_version(*min_version)

Декоратор для минимальной версии при запуске теста во FreeBSD. Если версия FreeBSD меньше минимальной, тест пропускается.

@test.support.requires_linux_version(*min_version)

Декоратор для минимальной версии при запуске теста в Linux. Если версия Linux меньше минимальной, тест пропускается.

@test.support.requires_mac_version(*min_version)

Декоратор для минимальной версии при запуске теста на macOS. Если версия macOS меньше минимальной, тест пропускается.

@test.support.requires_IEEE_754

Декоратор для пропуска тестов на платформах, отличных от IEEE 754.

@test.support.requires_zlib

Декоратор для пропуска тестов, если zlib не существует.

@test.support.requires_gzip

Декоратор для пропуска тестов, если gzip не существует.

@test.support.requires_bz2

Декоратор для пропуска тестов, если bz2 не существует.

@test.support.requires_lzma

Декоратор для пропуска тестов, если lzma не существует.

@test.support.requires_resource(resource)

Декоратор для пропуска тестов, если ресурс недоступен.

@test.support.requires_docstrings

Декоратор для запуска теста только в том случае, если HAVE_DOCSTRINGS.

@test.support.cpython_only

Декоратор для тестов, применимый только к CPython.

@test.support.impl_detail(msg=None, **guards)

Декоратор для вызова check_impl_detail() в guards. Если это возвращает False, то использует msg в качестве причины для пропуска теста.

@test.support.no_tracing

Декоратор временно отключает трассировку на время выполнения теста.

@test.support.refcount_test

Декоратор для тестов, которые включают подсчет ссылок. Декоратор не запускает тест, если он не запущен с помощью Python. На время выполнения теста любая функция трассировки отключена, чтобы предотвратить непредвиденные повторные подсчеты, вызванные функцией трассировки.

@test.support.bigmemtest(size, memuse, dry_run=True)

Декоратор для тестов bigmem.

size - это требуемый размер для теста (в произвольных, интерпретируемых тестом единицах измерения). memuse - это количество байт на единицу измерения для теста или его приблизительная оценка. Например, тест, для которого требуется два байтовых буфера по 4 гигабайта каждый, может быть оформлен как @bigmemtest(size=_4G, memuse=2).

Аргумент size обычно передается методу оформленного тестирования в качестве дополнительного аргумента. Если значение dry_run равно True, значение, передаваемое методу тестирования, может быть меньше запрошенного значения. Если значение dry_run равно False, это означает, что тест не поддерживает фиктивные запуски, если значение -M не указано.

@test.support.bigaddrspacetest

Декоратор для тестов, которые заполняют адресное пространство.

test.support.check_syntax_error(testcase, statement, errtext='', *, lineno=None, offset=None)

Проверьте наличие синтаксических ошибок в statement, попытавшись скомпилировать statement. testcase - это экземпляр unittest для теста. errtext - это регулярное выражение, которое должно соответствовать строковому представлению созданного SyntaxError. Если значение lineno не равно None, выполняется сравнение со строкой исключения. Если значение offset не равно None, выполняется сравнение со смещением исключения.

test.support.open_urlresource(url, *args, **kw)

Открыть url. Если открыть не удается, выводится значение TestFailed.

test.support.reap_children()

Используйте это в конце test_main всякий раз, когда запускаются подпроцессы. Это поможет избежать появления дополнительных дочерних элементов (зомби), которые будут захватывать ресурсы и создавать проблемы при поиске отражений.

test.support.get_attribute(obj, name)

Получаем атрибут, повышающий значение unittest.SkipTest, если задано значение AttributeError.

test.support.catch_unraisable_exception()

Контекстный менеджер перехватывает недопустимое исключение, используя sys.unraisablehook().

Сохранение значения исключения (cm.unraisable.exc_value) создает цикл ссылок. Цикл ссылок явно прерывается при завершении работы контекстного менеджера.

Сохранение объекта (cm.unraisable.object) может восстановить его, если для него задан объект, который находится в стадии завершения. При выходе из контекстного менеджера сохраненный объект будет удален.

Использование:

with support.catch_unraisable_exception() as cm:
    # code creating an "unraisable exception"
    ...

    # check the unraisable exception: use cm.unraisable
    ...

# cm.unraisable attribute no longer exists at this point
# (to break a reference cycle)

Добавлено в версии 3.8.

test.support.load_package_tests(pkg_dir, loader, standard_tests, pattern)

Общая реализация протокола unittest load_tests для использования в тестовых пакетах. pkg_dir - это корневой каталог пакета; loader, standard_tests и pattern - это аргументы, ожидаемые load_tests. В простых случаях __init__.py тестового пакета может быть следующим:

import os
from test.support import load_package_tests

def load_tests(*args):
    return load_package_tests(os.path.dirname(__file__), *args)
test.support.detect_api_mismatch(ref_api, other_api, *, ignore=())

Возвращает набор атрибутов, функций или методов ref_api, не найденных в other_api, за исключением определенного списка элементов, которые должны игнорироваться при этой проверке, указанного в игнорировать.

По умолчанию при этом пропускаются частные атрибуты, начинающиеся с «_», но включаются все магические методы, т.е. те, которые начинаются и заканчиваются на «__».

Добавлено в версии 3.5.

test.support.patch(test_instance, object_to_patch, attr_name, new_value)

Замените object_to_patch.attr_name на new_value. Также добавьте процедуру очистки в test_instance, чтобы восстановить object_to_patch для attr_name. attr_name должно быть допустимым атрибутом для object_to_patch.

test.support.run_in_subinterp(code)

Запустите код во вспомогательном интерпретаторе. Поднимите значение unittest.SkipTest, если включено значение tracemalloc.

test.support.check_free_after_iterating(test, iter, cls, args=())

Экземпляры Assert для cls освобождаются после выполнения итерации.

test.support.missing_compiler_executable(cmd_names=[])

Проверьте наличие исполняемых файлов компилятора, имена которых указаны в cmd_names, или всех исполняемых файлов компилятора, если значение cmd_names пусто, и верните первый отсутствующий исполняемый файл или None, если не найдено ни одного отсутствующего файла.

test.support.check__all__(test_case, module, name_of_module=None, extra=(), not_exported=())

Утверждаем, что __all__ переменная module содержит все общедоступные имена.

Общедоступные имена модуля (его API) определяются автоматически на основе того, соответствуют ли они соглашению об общедоступных именах и были ли они определены в module.

Аргумент name_of_module может указывать (в виде строки или ее кортежа), какой модуль(ы) API может быть определен для того, чтобы быть обнаруженным как общедоступный API. Одним из примеров этого является то, что module импортирует часть своего общедоступного API из других модулей, возможно, из серверной части C (например, csv и его _csv).

Дополнительным аргументом может быть набор имен, которые в противном случае не были бы автоматически определены как «общедоступные», например, объекты без соответствующего атрибута __module__. Если он указан, он будет добавлен к автоматически обнаруженным.

Аргументом not_exported может быть набор имен, которые не должны рассматриваться как часть общедоступного API, даже если их имена указывают на обратное.

Пример использования:

import bar
import foo
import unittest
from test import support

class MiscTestCase(unittest.TestCase):
    def test__all__(self):
        support.check__all__(self, foo)

class OtherTestCase(unittest.TestCase):
    def test__all__(self):
        extra = {'BAR_CONST', 'FOO_CONST'}
        not_exported = {'baz'}  # Undocumented name.
        # bar imports part of its API from _bar.
        support.check__all__(self, bar, ('bar', '_bar'),
                             extra=extra, not_exported=not_exported)

Добавлено в версии 3.6.

test.support.skip_if_broken_multiprocessing_synchronize()

Пропустите тесты, если модуль multiprocessing.synchronize отсутствует, если нет доступной реализации семафора или если при создании блокировки возникает OSError.

Добавлено в версии 3.10.

test.support.check_disallow_instantiation(test_case, tp, *args, **kwds)

Утверждают, что тип tp не может быть создан с использованием args и kwds.

Добавлено в версии 3.10.

test.support.adjust_int_max_str_digits(max_digits)

Эта функция возвращает диспетчер контекста, который изменит глобальную настройку sys.set_int_max_str_digits() на время действия контекста, чтобы разрешить выполнение тестового кода, для которого требуется другое ограничение на количество цифр при преобразовании между целым числом и строкой.

Добавлено в версии 3.11.

Модуль test.support определяет следующие классы:

class test.support.SuppressCrashReport

Контекстный менеджер, используемый для предотвращения всплывающих окон диалогового окна сбоя в тестах, которые, как ожидается, приведут к сбою подпроцесса.

В Windows он отключает диалоговые окна отчетов об ошибках Windows, используя SetErrorMode.

В UNIX resource.setrlimit() используется для установки мягкого ограничения resource.RLIMIT_CORE равным 0, чтобы предотвратить создание файла coredump.

На обеих платформах старое значение восстанавливается с помощью __exit__().

class test.support.SaveSignals

Класс для сохранения и восстановления обработчиков сигналов, зарегистрированных обработчиком сигналов Python.

save(self)

Сохраните обработчики сигналов в словаре, сопоставляющем номера сигналов текущему обработчику сигналов.

restore(self)

Установите номера сигналов из словаря save() в сохраненный обработчик.

class test.support.Matcher
matches(self, d, **kwargs)

Попробуйте сопоставить один dict с указанными аргументами.

match_value(self, k, dv, v)

Попробуйте сопоставить одно сохраненное значение (dv) с указанным значением (v).

test.support.socket_helper — Утилиты для тестирования сокетов

Модуль test.support.socket_helper обеспечивает поддержку тестов сокетов.

Добавлено в версии 3.9.

test.support.socket_helper.IPV6_ENABLED

Установите значение True, если IPv6 включен на этом хосте, False в противном случае.

test.support.socket_helper.find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM)

Возвращает неиспользуемый порт, который должен быть пригоден для привязки. Это достигается путем создания временного сокета с тем же семейством и типом, что и параметр sock (по умолчанию AF_INET, SOCK_STREAM),), и привязки его к указанному адресу хоста (по умолчанию 0.0.0.0) с портом, равным 0, что приводит к обнаружению неиспользуемого временного порта в операционной системе. Затем временный сокет закрывается и удаляется, а временный порт возвращается.

Либо этот метод, либо bind_port() следует использовать для любых тестов, в которых серверный сокет должен быть привязан к определенному порту на время теста. Какой из них использовать, зависит от того, создает ли вызывающий код сокет Python или необходимо указать неиспользуемый порт в конструкторе или передать его внешней программе (т.е. аргумент -accept для режима s_server в openssl). По возможности, всегда отдавайте предпочтение bind_port(), а не find_unused_port(). Не рекомендуется использовать жестко запрограммированный порт, поскольку это может привести к невозможности одновременного запуска нескольких экземпляров теста, что является проблемой для ботов-сборщиков.

test.support.socket_helper.bind_port(sock, host=HOST)

Привяжите сокет к свободному порту и верните номер порта. Мы используем временные порты, чтобы убедиться, что мы используем несвязанный порт. Это важно, поскольку одновременно может выполняться множество тестов, особенно в среде buildbot. Этот метод вызывает исключение, если sock.family равно AF_INET, а sock.type равно SOCK_STREAM, и для сокета установлено значение SO_REUSEADDR или SO_REUSEPORT это. В тестах никогда не следует устанавливать эти параметры сокета для сокетов TCP IP. Единственным случаем установки этих параметров является тестирование многоадресной рассылки через несколько сокетов UDP.

Кроме того, если доступна опция SO_EXCLUSIVEADDRUSE socket (например, в Windows), она будет установлена для сокета. Это предотвратит привязку кого-либо еще к нашему хост-порту на время тестирования.

test.support.socket_helper.bind_unix_socket(sock, addr)

Привяжите сокет Unix, поднимая unittest.SkipTest, если поднят PermissionError.

@test.support.socket_helper.skip_unless_bind_unix_socket

Декоратор для запуска тестов, требующих функционала bind() для сокетов Unix.

test.support.socket_helper.transient_internet(resource_name, *, timeout=30.0, errnos=())

Контекстный менеджер, который вызывает ResourceDenied, когда различные проблемы с подключением к Интернету проявляются как исключения.

test.support.script_helper — Утилиты для выполнения тестов на Python

Модуль test.support.script_helper обеспечивает поддержку тестов выполнения скриптов на Python.

test.support.script_helper.interpreter_requires_environment()

Верните True, если sys.executable interpreter требуются переменные окружения, чтобы вообще иметь возможность работать.

Это предназначено для использования с @unittest.skipIf() для аннотирования тестов, которые должны использовать функцию assert_python*() для запуска вспомогательного интерпретатора в изолированном режиме (-I) или без режима окружения (-E) процесс.

Обычная сборка и тестирование не приводят к такой ситуации, но это может произойти при попытке запустить стандартный библиотечный набор тестов из интерпретатора, у которого нет очевидного источника с текущей логикой поиска источника в Python.

Установка PYTHONHOME - это один из способов запустить большую часть testsuite в такой ситуации. PYTHONPATH или PYTHONUSERSITE - это другие распространенные переменные среды, которые могут повлиять на возможность запуска интерпретатора.

test.support.script_helper.run_python_until_end(*args, **env_vars)

Настройте среду на основе env_vars для запуска интерпретатора в подпроцессе. Значения могут включать в себя __isolated, __cleanenv, __cwd, и TERM.

Изменено в версии 3.9: Функция больше не удаляет пробелы из stderr.

test.support.script_helper.assert_python_ok(*args, **env_vars)

Подтвердите, что запуск интерпретатора с использованием args и необязательных переменных окружения env_vars завершен успешно (rc == 0), и верните кортеж (return code, stdout, stderr).

Если задан параметр __cleanenv, предназначенный только для ключевых слов, env_vars используется в качестве новой среды.

Python запускается в изолированном режиме (параметр командной строки -I), за исключением случаев, когда для параметра __isolated, используемого только для ключевых слов, задано значение False.

Изменено в версии 3.9: Функция больше не удаляет пробелы из stderr.

test.support.script_helper.assert_python_failure(*args, **env_vars)

Подтвердите, что запуск интерпретатора с использованием args и необязательных переменных окружения env_vars завершается ошибкой (rc != 0), и верните кортеж (return code, stdout, stderr).

Дополнительные параметры приведены в разделе assert_python_ok().

Изменено в версии 3.9: Функция больше не удаляет пробелы из stderr.

test.support.script_helper.spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw)

Запустите подпроцесс Python с заданными аргументами.

kw - это дополнительное ключевое слово args для передачи в subprocess.Popen(). Возвращает объект subprocess.Popen.

test.support.script_helper.kill_python(p)

Запустите данный процесс subprocess.Popen до завершения и верните стандартный вывод.

test.support.script_helper.make_script(script_dir, script_basename, source, omit_suffix=False)

Создайте скрипт, содержащий source в path script_dir и script_basename. Если в omit_suffix значение False, добавьте .py к имени. Верните полный путь к скрипту.

test.support.script_helper.make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None)

Создайте zip-файл в zip_dir и zip_basename с расширением zip, который содержит файлы в script_name. name_in_zip - это имя архива. Возвращает кортеж, содержащий (full path, full path of archive name).

test.support.script_helper.make_pkg(pkg_dir, init_source='')

Создайте каталог с именем pkg_dir, содержащий файл __init__ с содержимым init_source.

test.support.script_helper.make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, source, depth=1, compiled=False)

Создайте каталог zip-пакетов с путями zip_dir и zip_basename, содержащий пустой файл __init__ и файл script_basename, содержащий исходный код. Если значение compiled равно True, оба исходных файла будут скомпилированы и добавлены в zip-пакет. Возвращает полный путь к zip-файлу и имя архива для zip-файла.

test.support.bytecode_helper — Инструменты поддержки для тестирования корректной генерации байт-кода

Модуль test.support.bytecode_helper обеспечивает поддержку тестирования и проверки генерации байт-кода.

Добавлено в версии 3.9.

Модуль определяет следующий класс:

class test.support.bytecode_helper.BytecodeTestCase(unittest.TestCase)

Этот класс имеет пользовательские методы подтверждения для проверки байт-кода.

BytecodeTestCase.get_disassembly_as_string(co)

Возвращает разборку co в виде строки.

BytecodeTestCase.assertInBytecode(x, opname, argval=_UNSPECIFIED)

Возвращает instr, если найдено opname, в противном случае выдает AssertionError.

BytecodeTestCase.assertNotInBytecode(x, opname, argval=_UNSPECIFIED)

Выдает AssertionError, если найдено opname.

test.support.threading_helper — Утилиты для потоковых тестов

Модуль test.support.threading_helper обеспечивает поддержку многопоточных тестов.

Добавлено в версии 3.10.

test.support.threading_helper.join_thread(thread, timeout=None)

Присоединяйтесь к потоку в течение таймаута. Поднимите AssertionError, если поток все еще активен после таймаута секунд.

@test.support.threading_helper.reap_threads

Декоратор, гарантирующий, что потоки будут очищены, даже если тест завершится неудачей.

test.support.threading_helper.start_threads(threads, unlock=None)

Контекстный менеджер для запуска threads, который представляет собой последовательность потоков. unlock - это функция, вызываемая после запуска потоков, даже если было вызвано исключение; примером может быть threading.Event.set(). start_threads попытается присоединиться к запущенным потокам при выходе.

test.support.threading_helper.threading_cleanup(*original_values)

Очистка потоков, не указанных в original_values. Предназначен для выдачи предупреждения, если тест оставляет запущенные потоки в фоновом режиме.

test.support.threading_helper.threading_setup()

Возвращает текущее количество нитей и копию оборванных нитей.

test.support.threading_helper.wait_threads_exit(timeout=None)

Контекстный менеджер должен дождаться завершения всех потоков, созданных в инструкции with.

test.support.threading_helper.catch_threading_exception()

Контекстный менеджер перехватывает исключение threading.Thread с помощью threading.excepthook().

Атрибуты, устанавливаемые при перехвате исключения:

  • exc_type

  • exc_value

  • exc_traceback

  • thread

Смотрите документацию threading.excepthook().

Эти атрибуты удаляются при выходе из контекстного менеджера.

Использование:

with threading_helper.catch_threading_exception() as cm:
    # code spawning a thread which raises an exception
    ...

    # check the thread exception, use cm attributes:
    # exc_type, exc_value, exc_traceback, thread
    ...

# exc_type, exc_value, exc_traceback, thread attributes of cm no longer
# exists at this point
# (to avoid reference cycles)

Добавлено в версии 3.8.

test.support.os_helper — Утилиты для тестирования операционной системы

Модуль test.support.os_helper обеспечивает поддержку тестов операционной системы.

Добавлено в версии 3.10.

test.support.os_helper.FS_NONASCII

Символ, отличный от ASCII, который можно закодировать с помощью os.fsencode().

test.support.os_helper.SAVEDCWD

Установите значение os.getcwd().

test.support.os_helper.TESTFN

Задайте имя, которое безопасно использовать в качестве имени временного файла. Любой создаваемый временный файл следует закрыть и отсоединить (удалить).

test.support.os_helper.TESTFN_NONASCII

Присвойте файлу имя, содержащее символ FS_NONASCII, если он существует. Это гарантирует, что если имя файла существует, его можно закодировать и декодировать в соответствии с кодировкой файловой системы по умолчанию. Это позволяет легко пропускать тесты, для которых требуется имя файла, отличное от ASCII, на платформах, где они не могут работать.

test.support.os_helper.TESTFN_UNENCODABLE

Присваивается имя файла (тип str), которое не должно быть закодировано с помощью кодировки файловой системы в строгом режиме. Это может быть None, если невозможно сгенерировать такое имя файла.

test.support.os_helper.TESTFN_UNDECODABLE

Присваивается имя файла (тип bytes), которое не должно быть расшифровано с помощью кодирования файловой системы в строгом режиме. Это может быть None, если невозможно сгенерировать такое имя файла.

test.support.os_helper.TESTFN_UNICODE

Задайте для временного файла имя, отличное от ASCII.

class test.support.os_helper.EnvironmentVarGuard

Класс, используемый для временной установки или отмены установки переменных среды. Экземпляры могут использоваться в качестве контекстного менеджера и иметь полный интерфейс словаря для запроса изменения базового os.environ. После выхода из контекстного менеджера все изменения переменных среды, внесенные через этот экземпляр, будут откатаны.

Изменено в версии 3.1: Добавлен интерфейс словаря.

class test.support.os_helper.FakePath(path)

Простой path-like object. Он реализует метод __fspath__(), который просто возвращает аргумент path. Если path является исключением, оно будет вызвано в __fspath__().

EnvironmentVarGuard.set(envvar, value)

Временно установите для переменной окружения envvar значение value.

EnvironmentVarGuard.unset(envvar)

Временно отмените установку переменной окружения envvar.

Верните True, если операционная система поддерживает символьные ссылки, False в противном случае.

test.support.os_helper.can_xattr()

Верните True, если операционная система поддерживает xattr, False в противном случае.

test.support.os_helper.change_cwd(path, quiet=False)

Контекстный менеджер, который временно изменяет текущий рабочий каталог на path и возвращает каталог.

Если значение quiet равно False, контекстный менеджер генерирует исключение при возникновении ошибки. В противном случае он выдает только предупреждение и сохраняет текущий рабочий каталог неизменным.

test.support.os_helper.create_empty_file(filename)

Создайте пустой файл с именем filename. Если он уже существует, обрежьте его.

test.support.os_helper.fd_count()

Подсчитайте количество открытых файловых дескрипторов.

test.support.os_helper.fs_is_case_insensitive(directory)

Верните True, если файловая система для directory не учитывает регистр символов.

test.support.os_helper.make_bad_fd()

Создайте недопустимый файловый дескриптор, открыв и закрыв временный файл и вернув его дескриптор.

test.support.os_helper.rmdir(filename)

Вызовите os.rmdir() для filename. На платформах Windows это завершается циклом ожидания, который проверяет наличие файла, что необходимо из-за антивирусных программ, которые могут удерживать файлы открытыми и предотвращать их удаление.

test.support.os_helper.rmtree(path)

Вызовите shutil.rmtree() в path или os.lstat() и os.rmdir(), чтобы удалить путь и его содержимое. Как и в случае с rmdir(), на платформах Windows это завершается циклом ожидания, который проверяет наличие файлов.

Декоратор для запуска тестов, требующих поддержки символических ссылок.

@test.support.os_helper.skip_unless_xattr

Декоратор для запуска тестов, требующих поддержки xattr.

test.support.os_helper.temp_cwd(name='tempcwd', quiet=False)

Контекстный менеджер, который временно создает новый каталог и изменяет текущий рабочий каталог (CWD).

Диспетчер контекста создает временную директорию в текущей директории с именем name, прежде чем временно изменить текущую рабочую директорию. Если значение name равно None, временная директория создается с использованием tempfile.mkdtemp().

Если значение quiet равно False и создать или изменить CWD невозможно, выдается сообщение об ошибке. В противном случае выдается только предупреждение и используется исходный CWD.

test.support.os_helper.temp_dir(path=None, quiet=False)

Контекстный менеджер, который создает временный каталог по адресу path и возвращает этот каталог.

Если значение path равно None, то временный каталог создается с помощью tempfile.mkdtemp(). Если значение quiet равно False, контекстный менеджер генерирует исключение при возникновении ошибки. В противном случае, если указан путь и его невозможно создать, выдается только предупреждение.

test.support.os_helper.temp_umask(umask)

Контекстный менеджер, который временно устанавливает umask процесса.

Вызовите os.unlink() в filename. Как и в случае с rmdir(), на платформах Windows это завершается циклом ожидания, который проверяет существование файла.

test.support.import_helper — Утилиты для тестирования импорта

Модуль test.support.import_helper обеспечивает поддержку тестов импорта.

Добавлено в версии 3.10.

test.support.import_helper.forget(module_name)

Удалите модуль с именем имя_модуля из sys.modules и удалите все байт-скомпилированные файлы модуля.

test.support.import_helper.import_fresh_module(name, fresh=(), blocked=(), deprecated=False)

Эта функция импортирует и возвращает новую копию именованного модуля Python, удаляя именованный модуль из sys.modules перед выполнением импорта. Обратите внимание, что, в отличие от reload(), эта операция не затрагивает исходный модуль.

fresh - это повторяющийся список дополнительных имен модулей, которые также удаляются из кэша sys.modules перед выполнением импорта.

заблокировано - это повторяющийся список имен модулей, которые заменяются на None в кэше модуля во время импорта, чтобы гарантировать, что при попытке их импорта возникнет ImportError.

Именованный модуль и все модули, указанные в параметрах fresh и blocked, сохраняются перед началом импорта и затем повторно вставляются в sys.modules после завершения нового импорта.

Сообщения об устаревании модулей и пакетов подавляются во время этого импорта, если значение deprecated равно True.

Эта функция вызовет ImportError, если именованный модуль не может быть импортирован.

Пример использования:

# Get copies of the warnings module for testing without affecting the
# version being used by the rest of the test suite. One copy uses the
# C implementation, the other is forced to use the pure Python fallback
# implementation
py_warnings = import_fresh_module('warnings', blocked=['_warnings'])
c_warnings = import_fresh_module('warnings', fresh=['_warnings'])

Добавлено в версии 3.1.

test.support.import_helper.import_module(name, deprecated=False, *, required_on=())

Эта функция импортирует и возвращает именованный модуль. В отличие от обычного импорта, эта функция выдает unittest.SkipTest, если модуль не может быть импортирован.

Сообщения об устаревании модулей и пакетов подавляются во время этого импорта, если значение deprecated равно True. Если модуль требуется для одной платформы, но необязателен для других, установите для required_on значение повторяющегося набора префиксов платформы, которые будут сравниваться с sys.platform.

Добавлено в версии 3.1.

test.support.import_helper.modules_setup()

Возвращает копию sys.modules.

test.support.import_helper.modules_cleanup(oldmodules)

Удалите модули, за исключением oldmodules и encodings, чтобы сохранить внутренний кэш.

test.support.import_helper.unload(name)

Удалите имя из sys.modules.

test.support.import_helper.make_legacy_pyc(source)

Переместите файл PEP 3147PEP 488 pyc в его прежнее расположение pyc и верните путь к файловой системе, указанный в предыдущем файле pyc. Значение source - это путь файловой системы к исходному файлу. Он не обязательно должен существовать, однако pyc-файл PEP 3147488 должен существовать.

class test.support.import_helper.CleanImport(*module_names)

Контекстный менеджер для принудительного возврата ссылки на новый модуль при импорте. Это полезно для тестирования поведения на уровне модуля, например, для вывода DeprecationWarning при импорте. Пример использования:

with CleanImport('foo'):
    importlib.import_module('foo')  # New reference.
class test.support.import_helper.DirsOnSysPath(*paths)

Контекстный менеджер для временного добавления каталогов в sys.path.

При этом создается копия sys.path, добавляются все каталоги, указанные в качестве позиционных аргументов, а затем возвращается sys.path к скопированным настройкам, когда контекст заканчивается.

Обратите внимание, что все sys.path изменения в теле контекстного менеджера, включая замену объекта, будут отменены в конце блока.

test.support.warnings_helper — Утилиты для проверки предупреждений

Модуль test.support.warnings_helper обеспечивает поддержку тестов предупреждений.

Добавлено в версии 3.10.

test.support.warnings_helper.ignore_warnings(*, category)

Подавляйте предупреждения, которые являются экземплярами category, которые должны быть Warning или подклассом. Примерно эквивалентно warnings.catch_warnings() с warnings.simplefilter('ignore', category=category). Например:

@warning_helper.ignore_warnings(category=DeprecationWarning)
def test_suppress_warning():
    # do something

Добавлено в версии 3.8.

test.support.warnings_helper.check_no_resource_warning(testcase)

Контекстный менеджер, чтобы проверить, не было ли задано значение ResourceWarning. Вы должны удалить объект, который может выдавать значение ResourceWarning до завершения работы контекстного менеджера.

test.support.warnings_helper.check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=None)

Проверьте наличие синтаксического предупреждения в statement, попытавшись скомпилировать statement. Проверьте также, что SyntaxWarning выдается только один раз и что оно будет преобразовано в SyntaxError, если оно будет преобразовано в ошибку. testcase - это unittest экземпляр для теста. errtext - это регулярное выражение, которое должно соответствовать строковому представлению отправленного SyntaxWarning и созданного SyntaxError. Если значение lineno не равно None, выполняется сравнение со строкой предупреждения и исключения. Если значение offset не равно None, выполняется сравнение со смещением исключения.

Добавлено в версии 3.8.

test.support.warnings_helper.check_warnings(*filters, quiet=True)

Удобная оболочка для warnings.catch_warnings(), которая упрощает проверку правильности выдачи предупреждения. Это примерно эквивалентно вызову warnings.catch_warnings(record=True) с параметром warnings.simplefilter() равным always и возможностью автоматической проверки записанных результатов.

check_warnings принимает 2 кортежа вида ("message regexp", WarningCategory) в качестве позиционных аргументов. Если указан один или несколько фильтров или если необязательный аргумент ключевого слова quiet равен False, выполняется проверка, чтобы убедиться, что предупреждения соответствуют ожиданиям: каждый указанный фильтр должен соответствовать хотя бы одному из предупреждений, вызванных прилагаемым кодом, иначе тест завершится неудачей, и если выдаются какие-либо предупреждения, которые не соответствуют ни одному из указанных фильтров, тест завершается неудачей. Чтобы отключить первую из этих проверок, установите для параметра quiet значение True.

Если аргументы не указаны, то по умолчанию используется значение:

check_warnings(("", Warning), quiet=True)

В этом случае все предупреждения перехватываются и никаких ошибок не возникает.

При входе в контекстный менеджер возвращается экземпляр WarningRecorder. Список предупреждений, лежащих в основе catch_warnings(), доступен через атрибут warnings объекта recorder. Для удобства к атрибутам объекта, представляющего самое последнее предупреждение, также можно получить доступ непосредственно через объект recorder (см. пример ниже). Если предупреждение не было выдано, то любой из атрибутов, которые в противном случае ожидались бы для объекта, представляющего предупреждение, вернет None.

У объекта recorder также есть метод reset(), который очищает список предупреждений.

Контекстный менеджер предназначен для использования следующим образом:

with check_warnings(("assertion is always true", SyntaxWarning),
                    ("", UserWarning)):
    exec('assert(False, "Hey!")')
    warnings.warn(UserWarning("Hide me!"))

В этом случае, если либо предупреждение не было выдано, либо было выдано какое-либо другое предупреждение, check_warnings() выдаст сообщение об ошибке.

Когда тесту нужно более глубоко изучить предупреждения, а не просто проверить, произошли они или нет, можно использовать такой код, как этот:

with check_warnings(quiet=True) as w:
    warnings.warn("foo")
    assert str(w.args[0]) == "foo"
    warnings.warn("bar")
    assert str(w.args[0]) == "bar"
    assert str(w.warnings[0].args[0]) == "foo"
    assert str(w.warnings[1].args[0]) == "bar"
    w.reset()
    assert len(w.warnings) == 0

Здесь все предупреждения будут перехвачены, и тестовый код напрямую проверит перехваченные предупреждения.

Изменено в версии 3.2: Добавлены новые необязательные аргументы filters и quiet.

class test.support.warnings_helper.WarningsRecorder

Класс, используемый для записи предупреждений для модульных тестов. Более подробную информацию смотрите в документации по check_warnings() выше.

Вернуться на верх