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 возвращает только True или False) для предоставления документации по методам испытаний. Это делается потому, что документация строки быть распечатана, если они существуют, и, таким образом, не указано, какой тест выполняется.

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

import unittest
from test import support

class MyTestCase1(unittest.TestCase):

    # Используйте только setUp() и tearDown() только при необходимости

    def setUp(self):
        ... код для выполнения при подготовке к тестам ...

    def tearDown(self):
        ... код для очистки после тестирования ...

    def test_feature_one(self):
        # Первая тестовая функция.
        ... тестовый код ...

    def test_feature_two(self):
        # Вторая тестовая функция.
        ... тестовый код ...

    ... больше методов тестов ...

class MyTestCase2(unittest.TestCase):
    ... та же структура, что и MyTestCase1 ...

... больше тестовых классов ...

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

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

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

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

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

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

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

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

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

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

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

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

    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, выполняются как тесты. Класс Mixin в приведенном выше примере не имеет данных и поэтому не может быть запущен сам по себе, поэтому он не наследует от unittest.TestCase.

См.также

Разработка через тестирование (TDD, Test Driven Development)
Книга Kent Beck о написании тестов перед код.

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

Пакет test может быть запущен как скрипт, чтобы управлять набором регрессионных тестов Python’а благодаря -m опции: python -m test. Под капотом использует test.regrtest; вызов python -m test.regrtest используемый в предыдущих версиях Python все еще работает. Запуск сценария сам по себе автоматически запускает все регрессионные тесты в пакете test. Это достигается путем поиска всех модулей в пакете, имя которых начинается с test_, их импорта и выполнения функции test_main() если они присутствуют или загружаются через unittest. , если 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, когда подробный вывод включен. Необходимо проверить, если требуется более подробная информация о запущенном тесте. verbose задается по test.regrtest.

test.support.is_jython

True, если работающий интерпретатор - Jython.

test.support.is_android

True, является ли система Android.

test.support.unix_shell

Путь к оболочке, если она не находится в Windows; иначе None.

test.support.FS_NONASCII

Не ASCII символ кодируемый os.fsencode().

test.support.TESTFN

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

test.support.TESTFN_UNICODE

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

test.support.TESTFN_ENCODING

Установить значение sys.getfilesystemencoding().

test.support.TESTFN_UNENCODABLE

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

test.support.TESTFN_UNDECODABLE

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

test.support.TESTFN_NONASCII

Задать имя файла, содержащего FS_NONASCII символ.

test.support.IPV6_ENABLED

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

test.support.SAVEDCWD

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

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, если выполняется на CPython, а не на Windows, и конфигурация не задана на WITH_DOC_STRINGS.

test.support.HAVE_DOCSTRINGS

Проверить наличие докстрингов.

test.support.TEST_HTTP_URL

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

test.support.ALWAYS_EQ

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

test.support.LARGEST

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

test.support.SMALLEST

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

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

test.support.forget(module_name)

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

test.support.unload(name)

Удалить name из sys.modules.

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

test.support.rmdir(filename)

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

test.support.rmtree(path)

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

test.support.make_legacy_pyc(source)

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

test.support.is_resource_enabled(resource)

Возвращает True, если resource включен и доступен. Список доступных ресурсов устанавливается только при выполнении тестов 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, если resource недоступен. msg является аргументом для ResourceDenied, если он поднят. Всегда возвращает True, если вызывается функцией, __name__ которой является '__main__'. Используется при выполнении тестов test.regrtest.

test.support.system_must_validate_cert(f)

Проверка unittest.SkipTest TLS сертификации сбоев.

test.support.sortdict(dict)

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

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

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

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

test.support.create_empty_file(filename)

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

test.support.fd_count()

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

test.support.match_test(test)

Сопоставить test с образцами, заданными в set_match_tests().

test.support.set_match_tests(patterns)

Определение теста соответствия с patterns регулярного выражения.

test.support.run_unittest(*classes)

Выполнить команду unittest.TestCase подклассы переданную функции. Функция сканирует классы на наличие методов, начинающихся с префикса test_ и выполняет тесты по отдельности.

Также законно передавать строки в качестве параметров; это должны быть ключи в sys.modules. Каждый связанный модуль будет отсканирован по unittest.TestLoader.loadTestsFromModule(). Обычно это видно из следующей функции test_main():

def test_main():
    support.run_unittest(__name__)

Будут выполнены все тесты, определенные в именованном модуле.

test.support.run_doctest(module, verbosity=None, optionflags=0)

Выполнить doctest.testmod() на данном module. Возвращает (failure_count, test_count).

Если verbosity равно None, doctest.testmod() выполняется со степенью детализации, равной verbose. В противном случае выполняется со степенью детализации, установленной на None. optionflags передается как optionflags doctest.testmod().

test.support.setswitchinterval(interval)

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

test.support.check_impl_detail(**guards)

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

check_impl_detail()               # Только на CPython (по умолчанию).
check_impl_detail(jython=True)    # Только на Jython.
check_impl_detail(cpython=False)  # Везде, кроме CPython.
test.support.check_warnings(*filters, quiet=True)

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

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

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

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

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

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

Объект-регистратор также имеет метод 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.

test.support.check_no_resource_warning(testcase)

Менеджер контекста для проверки отсутствия ResourceWarning. Перед окончанием работы диспетчера ResourceWarning необходимо удалить объект, который может выдать контекст.

test.support.set_memlimit(limit)

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

test.support.record_original_stdout(stdout)

Сохранить значение из stdout. Он предназначен для удержания stdout в то время, как начался regrtest.

test.support.get_original_stdout()

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

test.support.strip_python_strerr(stderr)

Удаление stderr процесса Python из возможных выходных данных отладки, выдаваемых интерпретатор. Это обычно выполняется по результатам subprocess.Popen.communicate().

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.temp_dir(path=None, quiet=False)

Менеджер контекста, который создает временный каталог в path и вырабатывает каталог.

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

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

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

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

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

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

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

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

test.support.temp_umask(umask)

Менеджер контекста, временно устанавливающий маску процесса.

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

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

test.support.disable_faulthandler()

Менеджер контекста, заменяющий sys.stderr на sys.__stderr__.

test.support.gc_collect()

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

test.support.disable_gc()

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

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

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

Применение:

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

Для длительности obj.attr блока будет установлено значение with 5, что приведет к восстановлению старого значение в конце блока. Если attr не существует на obj, он будет создан, а затем удален в конце блока.

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

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

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

Применение:

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

Для длительности obj["item"] блока будет установлено значение with 5, что приведет к восстановлению старого значение в конце блока. Если item не существует на obj, он будет создан, а затем удален в конце блока.

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

test.support.wait_threads_exit(timeout=60.0)

Менеджер Context, чтобы ждать до всего потоки создал в выходе with инструкция.

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

Менеджер контекста для запуска threads. Он пытается присоединиться к потоки по выходе.

test.support.calcobjsize(fmt)

Возвращает struct.calcsize() для nP{fmt}0n или, если gettotalrefcount существует, 2PnP{fmt}0P.

test.support.calcvobjsize(fmt)

Возвращает struct.calcsize() для nPn{fmt}0n или, если gettotalrefcount существует, 2PnPn{fmt}0P.

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

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

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

test.support.can_xattr()

Возвращает True, поддерживает ли ОС xattr, False в противном случае.

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

@test.support.skip_unless_xattr

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

@test.support.skip_unless_bind_unix_socket

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

@test.support.anticipate_failure(condition)

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

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

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

@test.support.run_with_tz(tz)

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

@test.support.requires_freebsd_version(*min_version)

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

@test.support.requires_linux_version(*min_version)

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

@test.support.requires_mac_version(*min_version)

Декоратор для минимальной версии при выполнении теста на Mac OS X. Если версия MAC OS X меньше минимальной, поднимите unittest.SkipTest.

@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)

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

@test.support.requires_docstrings

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

@test.support.cpython_only(test)

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

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

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

@test.support.no_tracing(func)

Декоратор для временного отключения трассировки на время теста.

@test.support.refcount_test(test)

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

@test.support.reap_threads(func)

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

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

Декоратор для тестов на бигмем.

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

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

@test.support.bigaddrspacetest(f)

Декоратор для тестов, заполняющих адресное пространство. f - это функция для переноса.

test.support.make_bad_fd()

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

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

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

test.support.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.open_urlresource(url, *args, **kw)

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

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

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

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

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

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

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

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

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

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

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

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

Использование в качестве примера:

# Получить копию модуля предупреждений для тестирования, не влияя на версию,
# используемый остальной частью набора тестов. Одна копия использует реализацию C,
# другая вынуждена использовать реализацию чистого Python резервного копирования
py_warnings = import_fresh_module('warnings', blocked=['_warnings'])
c_warnings = import_fresh_module('warnings', fresh=['_warnings'])

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

test.support.modules_setup()

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

test.support.modules_cleanup(oldmodules)

Удалить модули, кроме oldmodules и encodings, для сохранения внутренних кэш.

test.support.threading_setup()

Возвращает текущее количество поток и копию висячего потоки.

test.support.threading_cleanup(*original_values)

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

test.support.join_thread(thread, timeout=30.0)

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

test.support.reap_children()

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

test.support.get_attribute(obj, name)

Получение атрибута, поднимая unittest.SkipTest, если поднят AttributeError.

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

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

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

test.support.bind_unix_socket(sock, addr)

Связать сокет unix, поднимая unittest.SkipTest, если PermissionError поднята.

test.support.catch_threading_exception()

Менеджер контекста ловит исключение threading.Thread используя threading.excepthook().

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

  • exc_type exc_value exc_traceback thread

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

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

Применение:

with support.catch_threading_exception() as cm:
    # код порождает поток, который вызывает исключение
    ...

    # проверить исключение потока, используя cm атрибуты: exc_type, exc_value,
    # exc_traceback, thread
    ...

# exc_type, exc_value, exc_traceback, thread атрибуты cm больше не существует в
# этой точке (чтобы избежать циклических ссылок)

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

test.support.catch_unraisable_exception()

Менеджер контекста ловит неразрешимое исключение с помощью sys.unraisablehook().

При сохранении значение особой ситуации (cm.unraisable.exc_value) создается ссылочный цикл. Цикл ссылок разрывается явно при выходе диспетчера контекст.

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

Применение:

with support.catch_unraisable_exception() as cm:
    # код, создающий "неразрешимое исключение"
    ...

    # проверить на неразрешимое исключение: используйте cm.unraisable
    ...

# cm.nraisable атрибут больше не существует в данный момент (чтобы прервать
# циклические ссылки)

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

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

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

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

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.fs_is_case_insensitive(directory)

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

test.support.detect_api_mismatch(ref_api, other_api, *, ignore=())

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

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

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

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

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

test.support.run_in_subinterp(code)

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

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

Убедитесь, что iter освобожден после итерации.

test.support.missing_compiler_executable(cmd_names=[])

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

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

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

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

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

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

Аргумент blacklist может быть набором имен, которые не должны рассматриваться как часть публичного 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'}
        blacklist = {'baz'}  # Undocumented name.
        # bar imports part of its API from _bar.
        support.check__all__(self, bar, ('bar', '_bar'),
                             extra=extra, blacklist=blacklist)

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

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

class test.support.TransientResource(exc, **kwargs)

Сущности - это менеджер контекста, который вызывает ResourceDenied, если задан тип исключения. Любые ключевые аргументы рассматриваются как пары атрибут/значение для сравнения с любым исключением, созданным в with инструкция. Только в том случае, если все пары правильно совпадают с атрибуты в исключении, ResourceDenied возбуждается.

class test.support.EnvironmentVarGuard

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

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

EnvironmentVarGuard.set(envvar, value)

Временно установить переменную среды envvar в значение value.

EnvironmentVarGuard.unset(envvar)

Временно отмените настройку envvar переменной среды.

class test.support.SuppressCrashReport

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

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

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

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

class test.support.CleanImport(*module_names)

Менеджер контекста, выполняющий принудительный импорт для возвращает новой ссылки на модуль. Он полезен при тестировании поведения на уровне модуля, например, при получении при импорте устаревшего предупреждения. Использование в качестве примера:

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

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

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

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

class test.support.SaveSignals

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

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

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

match_value(self, k, dv, v)

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

class test.support.WarningsRecorder

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

class test.support.BasicTestRunner
run(test)

Выполнить test и возвращает результат.

class test.support.TestHandler(logging.handlers.BufferingHandler)

Класс поддержки логирование.

class test.support.FakePath(path)

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

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) sub-интерпретатор процесса.

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

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

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

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

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.

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

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

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

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 до завершения и возвращает stdout.

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

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

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

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

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

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

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

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