test
— Пакет регрессионных тестов для Python¶
Примечание
Пакет test
предназначен только для внутреннего использования Python. Она
задокументирована в интересах основных разработчиков Python. Любое использование
этого пакета вне стандартной библиотеки не рекомендуется Python’ом, поскольку код,
упомянутые здесь, могут быть изменен или удален без уведомления между
выпусками Python.
Пакет test
содержит все регрессионные тесты для Python, а также модули
test.support
и test.regrtest
. test.support
используется для улучшиения тестов, пока
test.regrtest
управляет набором тестов.
Каждый модуль в пакете test
, имя которого начинается с test_
,
является пакетом тестирования для конкретного модуля или функции. Все новые
тесты должны быть написаны с помощью модуля unittest
или doctest
.
Некоторые старые тесты написаны с использованием «традиционного» стиля
тестирования, который сравнивает выходные данные, напечатанные на sys.stdout
;
этот стиль тестирования считается устаревшим.
См.также
Написание юнит тестов для пакета 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
.
-
test.support.
unlink
(filename)¶ Вызвать
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()
. Если quietFalse
, диспетчер контекст создает исключение при ошибке. В противном случае, если 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.
-
test.support.
can_symlink
()¶ Возвращает
True
, поддерживает ли ОС символьные ссылки,False
в противном случае.
-
test.support.
can_xattr
()¶ Возвращает
True
, поддерживает ли ОС xattr,False
в противном случае.
-
@
test.support.
skip_unless_symlink
¶ Декоратор для выполнения тестов, требующих поддержки символьных ссылок.
-
@
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_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_runFalse
, это означает, что тест не поддерживает пустые запуски, когда-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.
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. Если compiledTrue
, оба исходных файла будут скомпилированы и добавлены в zip- пакет. Возвращает кортеж полного zip-пути и имени архива для zip-файла.