unittest — Фреймворк для модульного тестирования
Исходный код: Lib/unittest/__init__.py
(Если вы уже знакомы с основными концепциями тестирования, можете перейти к списку методов assert.)
Фреймворк для модульного тестирования unittest первоначально был вдохновлен JUnit и имеет схожий характер с основными фреймворками для модульного тестирования на других языках. Он поддерживает автоматизацию тестирования, совместное использование кода настройки и завершения для тестов, агрегацию тестов в коллекции и независимость тестов от фреймворка отчётности.
Для достижения этого, unittest поддерживает некоторые важные концепции объектно-ориентированным способом:
- Тестовое окружение
-
Тестовое окружение представляет подготовку, необходимую для выполнения одного или нескольких тестов, и любые связанные с этим действия по очистке. Это может включать, например, создание временных или прокси-баз данных, каталогов или запуск процесса сервера.
- Тестовый случай
-
Тестовый случай — это отдельный модуль тестирования. Он проверяет ожидаемый результат для конкретного набора входных данных.
unittestпредоставляет базовый классTestCase, который можно использовать для создания новых тестовых случаев. - Тестовый набор
-
Тестовый набор — это коллекция тестовых случаев, тестовых наборов или их комбинации. Используется для объединения тестов, которые должны выполняться вместе.
- Запускающий тест
-
Запускающий тест — это компонент, который организует выполнение тестов и предоставляет результаты пользователю. Запускающий тест может использовать графический интерфейс, текстовый интерфейс или возвращать специальное значение для указания результатов выполнения тестов.
См. также
-
Moduledoctest -
Другой модуль поддержки тестирования с совершенно другим характером.
- Простой тест Smalltalk: С паттернами
-
Оригинальная статья Кента Бека о фреймворках для тестирования, использующих паттерн, общий для
unittest. - pytest
-
Фреймворк для модульного тестирования сторонних разработчиков с более лёгкой синтаксической записью тестов. Например,
assert func(10) == 42. - Классификация инструментов тестирования Python
-
Расширенный список инструментов тестирования Python, включая фреймворки функционального тестирования и библиотеки для имитирования объектов.
- Список рассылки по тестированию на Python
-
Группа с особыми интересами для обсуждения тестирования и инструментов тестирования в Python.
Скрипт Tools/unittestgui/unittestgui.py в дистрибутиве исходного кода Python — это инструмент с графическим интерфейсом для обнаружения и выполнения тестов. Он предназначен для упрощения использования для тех, кто только начинает знакомиться с модульным тестированием. Для производственных сред рекомендуется запускать тесты через систему непрерывной интеграции, такую как Buildbot, Jenkins или Travis-CI, или AppVeyor.
Базовый пример
Модуль unittest предоставляет богатый набор инструментов для создания и запуска тестов. Этот раздел демонстрирует, что небольшой подмножество инструментов достаточно для удовлетворения потребностей большинства пользователей.
Вот небольшой скрипт для тестирования трёх методов работы со строками:
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
Тестовый случай создаётся путём наследования от unittest.TestCase. Три отдельных теста определены методами, имена которых начинаются с букв test. Эта соглашение об именовании информирует запускающий тест о том, какие методы представляют собой тесты.
Суть каждого теста — вызов assertEqual() для проверки ожидаемого результата; assertTrue() или assertFalse() для проверки условия; или assertRaises() для проверки того, что поднимается определённое исключение. Эти методы используются вместо оператора assert, чтобы запускающий тест мог аккумулировать все результаты тестов и сформировать отчёт.
Методы setUp() и tearDown() позволяют определять инструкции, которые будут выполняться до и после каждого тестового метода. Они рассматриваются более подробно в разделе Организация кода тестов.
Последний блок демонстрирует простой способ запуска тестов. unittest.main() предоставляет командную строку для запуска скрипта тестов. При запуске из командной строки указанный выше скрипт выводит результат, похожий на этот:
... ---------------------------------------------------------------------- Ran 3 tests in 0.000s OK
Передача параметра -v в ваш скрипт тестов сообщит unittest.main() о необходимости повышения уровня подробности и выведет следующий результат:
test_isupper (__main__.TestStringMethods) ... ok test_split (__main__.TestStringMethods) ... ok test_upper (__main__.TestStringMethods) ... ok ---------------------------------------------------------------------- Ran 3 tests in 0.001s OK
Приведённые выше примеры показывают наиболее часто используемые функции фреймворка unittest, которые достаточно для большинства повседневных задач тестирования. Остальная часть документации изучает полный набор функций с нуля.
Интерфейс командной строки
Модуль unittest можно использовать из командной строки для запуска тестов из модулей, классов или даже отдельных тестовых методов:
python -m unittest test_module1 test_module2 python -m unittest test_module.TestClass python -m unittest test_module.TestClass.test_method
Вы можете передать список с любой комбинацией имён модулей и полных квалифицированных имён классов или методов.
Тестовые модули также можно указывать по пути к файлу:
python -m unittest tests/test_something.py
Это позволяет использовать автодополнение имён файлов в оболочке для указания тестового модуля. Указанный файл должен быть импортируем как модуль. Путь преобразуется в имя модуля путём удаления «.py» и преобразования разделителей пути в «.». Если вы хотите выполнить тестовый файл, который не импортируется как модуль, то вы должны выполнить файл напрямую.
Вы можете запустить тесты с большей детализацией (более высоким уровнем подробности), передав флаг -v:
python -m unittest -v test_module
При выполнении без аргументов запускается Обнаружение тестов:
python -m unittest
Список всех параметров командной строки:
python -m unittest -h
Изменено в версии 3.2: В более ранних версиях можно было запускать только отдельные тестовые методы, а не модули или классы.
Параметры командной строки
unittest поддерживает следующие параметры командной строки:
-
-b, --buffer -
Стандартные потоки ввода и вывода буферизируются во время выполнения теста. Вывод во время прохождения теста отбрасывается. Вывод отображается обычно при ошибке или сбое теста и добавляется к сообщениям об ошибках.
-
-c, --catch -
Ctrl+C во время выполнения теста ожидает завершения текущего теста, а затем сообщает обо всех результатах до этого момента. Второе нажатие Ctrl+C вызывает обычное исключение
KeyboardInterrupt.См. Обработка сигналов для функций, которые предоставляют эту функциональность.
-
-f, --failfast -
Останавливает выполнение теста при первой ошибке или сбое.
-
-k -
Выполняет только тестовые методы и классы, которые соответствуют шаблону или подстроке. Этот параметр можно использовать несколько раз, в этом случае все тестовые случаи, которые соответствуют любому из заданных шаблонов, включаются.
Шаблоны, содержащие символ подстановки (
*), сопоставляются с именем теста с помощьюfnmatch.fnmatchcase(); в противном случае используется простое чувствительное к регистру сопоставление подстрок.Шаблоны сопоставляются с полным квалифицированным именем тестового метода, как он импортируется загрузчиком тестов.
Например,
-k fooсоответствуетfoo_tests.SomeTest.test_something,bar_tests.SomeTest.test_foo, но неbar_tests.FooTest.test_something.
-
--locals -
Показывать локальные переменные в трассировках.
Добавлен в версии 3.2: Параметры командной строки -b, -c и -f были добавлены.
Добавлен в версии 3.5: Параметр командной строки --locals.
Добавлен в версии 3.7: Параметр командной строки -k.
Командная строка также может использоваться для обнаружения тестов, для запуска всех тестов в проекте или только подмножества.
Обнаружение тестов
Добавлен в версии 3.2.
Unittest поддерживает простое обнаружение тестов. Для совместимости с обнаружением тестов все файлы тестов должны быть модулями или пакетами (включая пакеты имен), импортируемыми из каталога верхнего уровня проекта (это означает, что их имена файлов должны быть допустимыми идентификаторами).
Обнаружение тестов реализовано в TestLoader.discover(), но также может использоваться из командной строки. Основное использование в командной строке:
cd project_directory python -m unittest discover
Примечание
В качестве сокращения python -m unittest эквивалентно python -m unittest discover. Если вы хотите передать аргументы для обнаружения тестов, то подкоманда discover должна быть использована явно.
Подкоманда discover имеет следующие параметры:
-
-v, --verbose -
Подробный вывод
-
-s, --start-directory directory -
Директория для начала обнаружения (
.по умолчанию)
-
-p, --pattern pattern -
Шаблон для сопоставления файлов тестов (
test*.pyпо умолчанию)
-
-t, --top-level-directory directory -
Директория верхнего уровня проекта (по умолчанию - текущая директория)
Параметры -s, -p и -t можно передать в качестве позиционных аргументов в том же порядке. Следующие две командные строки эквивалентны:
python -m unittest discover -s project_directory -p "*_test.py" python -m unittest discover project_directory "*_test.py"
Помимо пути, можно передать имя пакета, например myproject.subpackage.test, в качестве директории начала. В этом случае указанное имя пакета будет импортировано, и его расположение в файловой системе будет использоваться как начальная директория.
Внимание
Обнаружение тестов загружает тесты с помощью импорта. После того как обнаружение тестов нашло все файлы тестов из указанной вами стартовой директории, оно преобразует пути в имена пакетов для импорта. Например, foo/bar/baz.py будет импортирован как foo.bar.baz.
Если у вас установлен пакет глобально и вы пытаетесь обнаружить тесты в другой копии этого пакета, импорт может произойти из неправильного места. В этом случае обнаружение тестов выведет предупреждение и завершится.
Если вы предоставляете стартовую директорию как имя пакета, а не путь к директории, обнаружение предполагает, что место, из которого оно импортирует, является предполагаемым местом, поэтому предупреждение не выводится.
Тестовые модули и пакеты могут настраивать загрузку и обнаружение тестов с помощью протокола загрузки тестов.
Изменено в версии 3.4: Обнаружение тестов поддерживает пакеты имен для начальной директории. Обратите внимание, что вам также необходимо указать директорию верхнего уровня (например, python -m unittest discover -s root/namespace -t root).
Организация тестового кода
Основными строительными блоками модульного тестирования являются тестовые случаи — отдельные сценарии, которые необходимо подготовить и проверить на корректность. В unittest, тестовые случаи представлены экземплярами unittest.TestCase. Для создания собственных тестовых случаев необходимо написать подклассы TestCase или использовать FunctionTestCase.
Тестовый код экземпляра TestCase должен быть полностью самодостаточным, чтобы его можно было запускать изолированно или в произвольной комбинации с любым количеством других тестовых случаев.
Простейший подкласс TestCase просто реализует тестовый метод (т.е. метод, имя которого начинается с test) для выполнения определенного тестового кода:
import unittest
class DefaultWidgetSizeTestCase(unittest.TestCase):
def test_default_widget_size(self):
widget = Widget('The widget')
self.assertEqual(widget.size(), (50, 50))
Обратите внимание, что для проверки чего-либо мы используем один из методов assert*(), предоставляемых базовым классом TestCase. Если тест завершается неудачно, будет возбуждено исключение с поясняющим сообщением, и unittest определит тестовый случай как неудачный. Любые другие исключения будут обрабатываться как ошибки.
Тестов может быть много, и их настройка может быть повторяющейся. К счастью, мы можем выделить код настройки, реализовав метод с именем setUp(), который тестовый фреймворк автоматически вызовет для каждого выполняемого теста:
import unittest
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget('The widget')
def test_default_widget_size(self):
self.assertEqual(self.widget.size(), (50,50),
'incorrect default size')
def test_widget_resize(self):
self.widget.resize(100,150)
self.assertEqual(self.widget.size(), (100,150),
'wrong size after resize')
Примечание
Порядок выполнения различных тестов определяется сортировкой имён тестовых методов по отношению к встроенному порядку строк.
Если метод setUp() возбуждает исключение во время выполнения теста, фреймворк посчитает, что тест завершился с ошибкой, и метод теста не будет выполнен.
Аналогично, мы можем предоставить метод tearDown(), который приводит в порядок после выполнения тестового метода:
import unittest
class WidgetTestCase(unittest.TestCase):
def setUp(self):
self.widget = Widget('The widget')
def tearDown(self):
self.widget.dispose()
Если setUp() выполнился успешно, tearDown() будет выполнен независимо от успеха или неудачи тестового метода.
Такая рабочая среда для тестового кода называется фиксатурой теста. Новый экземпляр TestCase создаётся как уникальная фиксатура теста, используемая для выполнения каждого отдельного тестового метода. Таким образом, setUp(), tearDown() и __init__() будут вызываться один раз на тест.
Рекомендуется использовать реализации TestCase для группировки тестов по функциям, которые они проверяют. unittest предоставляет механизм для этого: тестовый набор, представленный классом unittest’s TestSuite. В большинстве случаев вызов unittest.main() сделает всё правильно и соберет все тестовые случаи модуля для вас и выполнит их.
Однако, если вы хотите настроить построение своего тестового набора, вы можете сделать это самостоятельно:
def suite():
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase('test_default_widget_size'))
suite.addTest(WidgetTestCase('test_widget_resize'))
return suite
if __name__ == '__main__':
runner = unittest.TextTestRunner()
runner.run(suite())
Вы можете разместить определения тестовых случаев и тестовых наборов в тех же модулях, что и код, который они должны проверять (например, widget.py), но есть несколько преимуществ размещения тестового кода в отдельном модуле, таком как test_widget.py:
- Модуль тестов можно запускать автономно из командной строки.
- Тестовый код легче отделить от поставляемого кода.
- Меньше соблазна изменять тестовый код для адаптации под код, который он тестирует, без веской причины.
- Тестовый код должен изменяться гораздо реже, чем код, который он тестирует.
- Проверяемый код можно легче рефакторить.
- Тесты для модулей, написанных на C, должны быть в отдельных модулях, так что почему бы не быть последовательными?
- Если стратегия тестирования изменится, нет необходимости изменять исходный код.
Использование старого тестового кода
Некоторые пользователи могут обнаружить, что у них есть существующий тестовый код, который они хотели бы запустить из unittest, не конвертируя каждую старую тестовую функцию в подкласс TestCase.
По этой причине unittest предоставляет класс FunctionTestCase. Этот подкласс TestCase может использоваться для обертывания существующей тестовой функции. Также можно предоставить функции настройки и завершения.
Учитывая следующую тестовую функцию:
def testSomething():
something = makeSomething()
assert something.name is not None
# ...
можно создать эквивалентный экземпляр тестового случая следующим образом, с необязательными методами настройки и завершения:
testcase = unittest.FunctionTestCase(testSomething,
setUp=makeSomethingDB,
tearDown=deleteSomethingDB)
Примечание
Хотя FunctionTestCase можно использовать для быстрого преобразования существующей тестовой базы в систему на основе unittest, этот подход не рекомендуется. Выделение времени на создание надлежащих подклассов TestCase сделает будущие рефакторинги тестов бесконечно проще.
В некоторых случаях существующие тесты могли быть написаны с использованием модуля doctest. В таком случае doctest предоставляет класс DocTestSuite, который может автоматически создавать экземпляры unittest.TestSuite из существующих тестов на основе doctest.
Пропуск тестов и ожидаемые ошибки
Новое в версии 3.1.
Unittest поддерживает пропуск отдельных тестовых методов и целых классов тестов. Кроме того, он поддерживает пометку теста как «ожидаемой ошибки», то есть теста, который сломан и будет завершаться ошибкой, но не должен учитываться как ошибка в TestResult.
Пропуск теста осуществляется с помощью декоратора skip() или одного из его условных вариантов, вызова TestCase.skipTest() внутри setUp() или тестового метода или непосредственного возбуждения исключения SkipTest.
Базовый пропуск выглядит так:
class MyTestCase(unittest.TestCase):
@unittest.skip("demonstrating skipping")
def test_nothing(self):
self.fail("shouldn't happen")
@unittest.skipIf(mylib.__version__ < (1, 3),
"not supported in this library version")
def test_format(self):
# Tests that work for only a certain version of the library.
pass
@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
def test_windows_support(self):
# windows specific testing code
pass
def test_maybe_skipped(self):
if not external_resource_available():
self.skipTest("external resource not available")
# test code that depends on the external resource
pass
Вот вывод выполнения примера выше в подробном режиме:
test_format (__main__.MyTestCase) ... skipped 'not supported in this library version' test_nothing (__main__.MyTestCase) ... skipped 'demonstrating skipping' test_maybe_skipped (__main__.MyTestCase) ... skipped 'external resource not available' test_windows_support (__main__.MyTestCase) ... skipped 'requires Windows' ---------------------------------------------------------------------- Ran 4 tests in 0.005s OK (skipped=4)
Классы могут пропускаться так же, как и методы:
@unittest.skip("showing class skipping")
class MySkippedTestCase(unittest.TestCase):
def test_not_run(self):
pass
TestCase.setUp() также может пропускать тест. Это полезно, когда ресурс, который необходимо настроить, недоступен.
Ожидаемые ошибки используют декоратор expectedFailure().
class ExpectedFailureTestCase(unittest.TestCase):
@unittest.expectedFailure
def test_fail(self):
self.assertEqual(1, 0, "broken")
Легко создать собственные декораторы пропуска, сделав декоратор, который вызывает skip() для теста, когда нужно его пропустить. Этот декоратор пропускает тест, если у переданного объекта есть определённый атрибут:
def skipUnlessHasattr(obj, attr):
if hasattr(obj, attr):
return lambda func: func
return unittest.skip("{!r} doesn't have {!r}".format(obj, attr))
Следующие декораторы и исключения реализуют пропуск тестов и ожидаемые ошибки:
-
@unittest.skip(reason) -
Безусловный пропуск декорированного теста. reason должно описывать причину пропуска теста.
-
@unittest.skipIf(condition, reason) -
Пропустить декорированный тест, если condition истинно.
-
@unittest.skipUnless(condition, reason) -
Пропустить декорированный тест, если condition ложно.
-
@unittest.expectedFailure -
Пометить тест как ожидаемую ошибку или исключение. Если тест завершается ошибкой или исключением в самом тестовом методе (а не в одном из методов «тестового оснащения»), то он будет считаться успешным. Если тест проходит, он будет считаться неудачным.
-
exception unittest.SkipTest(reason) -
Это исключение генерируется для пропуска теста.
Обычно можно использовать
TestCase.skipTest()или один из декораторов пропуска, а не генерировать это исключение напрямую.
Пропущенные тесты не будут выполнять setUp() или tearDown() вокруг них. Пропущенные классы не будут выполнять setUpClass() или tearDownClass(). Пропущенные модули не будут выполнять setUpModule() или tearDownModule().
Выделение итераций тестов с помощью подтестов
Новое в версии 3.4.
Когда существуют очень небольшие различия между тестами, например, некоторые параметры, unittest позволяет различать их внутри тела тестового метода с помощью менеджера контекста subTest().
Например, следующий тест:
class NumbersTest(unittest.TestCase):
def test_even(self):
"""
Test that numbers between 0 and 5 are all even.
"""
for i in range(0, 6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0)
выведет следующий результат:
======================================================================
FAIL: test_even (__main__.NumbersTest) (i=1)
----------------------------------------------------------------------
Traceback (most recent call last):
File "subtests.py", line 32, in test_even
self.assertEqual(i % 2, 0)
AssertionError: 1 != 0
======================================================================
FAIL: test_even (__main__.NumbersTest) (i=3)
----------------------------------------------------------------------
Traceback (most recent call last):
File "subtests.py", line 32, in test_even
self.assertEqual(i % 2, 0)
AssertionError: 1 != 0
======================================================================
FAIL: test_even (__main__.NumbersTest) (i=5)
----------------------------------------------------------------------
Traceback (most recent call last):
File "subtests.py", line 32, in test_even
self.assertEqual(i % 2, 0)
AssertionError: 1 != 0
Без использования подтеста выполнение остановится после первой ошибки, и ошибка будет сложнее для диагностики, потому что значение i не будет отображено:
======================================================================
FAIL: test_even (__main__.NumbersTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "subtests.py", line 32, in test_even
self.assertEqual(i % 2, 0)
AssertionError: 1 != 0
Классы и функции
В этом разделе подробно описан API unittest.
Объекты тестовых случаев
-
class unittest.TestCase(methodName='runTest') -
Экземпляры класса
TestCaseпредставляют собой логические тестовые единицы в вселеннойunittest. Этот класс предназначен для использования в качестве базового класса, при этом конкретные тесты реализуются в производных классах. Этот класс реализует интерфейс, необходимый для тестового исполнителя, чтобы он мог управлять тестами, а также методы, которые код теста может использовать для проверки и отчета о различных видах ошибок.Каждый экземпляр
TestCaseвыполнит один базовый метод: метод с именем methodName. В большинстве случаев использованияTestCaseвы не будете изменять methodName и не будете переопределять метод по умолчаниюrunTest().Изменено в версии 3.2:
TestCaseможет быть успешно создан без предоставления methodName. Это упрощает эксперименты сTestCaseиз интерактивного интерпретатора.Экземпляры
TestCaseпредоставляют три группы методов: одна группа используется для выполнения теста, другая используется реализацией теста для проверки условий и отчета об ошибках, и некоторые методы запроса, позволяющие собирать информацию о самом тесте.Методы в первой группе (выполнение теста) следующие:
-
setUp() -
Метод, вызываемый для подготовки тестового фикстура. Он вызывается непосредственно перед вызовом тестового метода; любая исключительная ситуация, за исключением
AssertionErrorилиSkipTest, поднятая этим методом, будет рассматриваться как ошибка, а не как сбой теста. По умолчанию ничего не делает.
-
tearDown() -
Метод, вызываемый сразу после того, как тестовый метод был вызван и результат был записан. Он вызывается даже если тестовый метод поднял исключение, поэтому реализация в подклассах может потребовать особого внимания при проверке внутреннего состояния. Любое исключение, помимо
AssertionErrorилиSkipTest, поднятое этим методом, будет рассматриваться как дополнительная ошибка, а не как сбой теста (тем самым увеличивая общее количество ошибок). Этот метод будет вызван только в случае успешного выполнения методаsetUp(), независимо от результата выполнения тестового метода. По умолчанию ничего не делает.
-
setUpClass() -
Метод класса, вызываемый перед запуском тестов в отдельном классе.
setUpClassвызывается с классом в качестве единственного аргумента и должен быть помечен какclassmethod():@classmethod def setUpClass(cls): ...Подробнее см. Фикстуры класса и модуля.
Введено в версии 3.2.
-
tearDownClass() -
Метод класса, вызываемый после запуска тестов в отдельном классе.
tearDownClassвызывается с классом в качестве единственного аргумента и должен быть помечен какclassmethod():@classmethod def tearDownClass(cls): ...Подробнее см. Фикстуры класса и модуля.
Введено в версии 3.2.
-
run(result=None) -
Запускает тест, собирая результат в объект
TestResult, переданный в качестве result. Если result опущен илиNone, создается временный объект результата (вызывая методdefaultTestResult()) и используется. Объект результата возвращается вызывающему методуrun().Тот же эффект может быть получен, просто вызвав экземпляр
TestCase.Изменено в версии 3.3: Предыдущие версии
runне возвращали результат. То же самое относится к вызову экземпляра.
-
skipTest(reason) -
Вызов этого метода во время тестового метода или
setUp()пропускает текущий тест. Подробнее см. Пропуск тестов и ожидаемые ошибки.Введено в версии 3.1.
-
subTest(msg=None, **params) -
Возвращает менеджер контекста, который выполняет заключенный блок кода в качестве подтеста. msg и params являются необязательными произвольными значениями, которые отображаются всякий раз, когда подтест терпит неудачу, позволяя четко их идентифицировать.
Тестовый случай может содержать любое количество объявлений подтестов, и они могут быть произвольно вложены.
Подробнее см. Различение итераций тестов с помощью подтестов.
Введено в версии 3.4.
-
debug() -
Запускает тест без сбора результата. Это позволяет исключениям, поднятым тестом, распространяться до вызывающего метода и может использоваться для поддержки запуска тестов под отладчиком.
Класс
TestCaseпредоставляет несколько методов утверждения для проверки и отчета об ошибках. В следующей таблице перечислены наиболее часто используемые методы (более подробный список см. в таблицах ниже):Метод
Проверяет, что
Введено в
a == ba != bbool(x) is Truebool(x) is Falsea is b3.1
a is not b3.1
x is None3.1
x is not None3.1
a in b3.1
a not in b3.1
isinstance(a, b)3.2
not isinstance(a, b)3.2
Все методы assert принимают аргумент msg, который, если указан, используется в качестве сообщения об ошибке при возникновении сбоя (см. также
longMessage). Обратите внимание, что аргумент ключевого слова msg может быть передан вassertRaises(),assertRaisesRegex(),assertWarns(),assertWarnsRegex()только тогда, когда они используются как менеджер контекста. -
-
assertEqual(first, second, msg=None) -
Проверка, что first и second равны. Если значения не равны, тест завершится с ошибкой.
Кроме того, если first и second имеют точно один и тот же тип и являются списком, кортежем, словарем, множеством, неизменяемым множеством или строкой, или любым типом, который подкласс регистрирует с помощью
addTypeEqualityFunc(), вызовется функция сравнения, специфичная для типа, для создания более полезного сообщения об ошибке (см. также список методов, специфичных для типа).Изменено в версии 3.1: Добавлен автоматический вызов функции сравнения, специфичной для типа.
Изменено в версии 3.2:
assertMultiLineEqual()добавлена в качестве функции сравнения по умолчанию для строк.
-
assertNotEqual(first, second, msg=None) -
Проверка, что first и second не равны. Если значения равны, тест завершится с ошибкой.
-
assertTrue(expr, msg=None) -
assertFalse(expr, msg=None) -
Проверка, что expr истинно (или ложно).
Обратите внимание, что это эквивалентно
bool(expr) is Trueи не эквивалентноexpr is True(для последнего используйтеassertIs(expr, True)). Следует также избегать использования этого метода, когда доступны более конкретные методы (например,assertEqual(a, b)вместоassertTrue(a == b)), так как они предоставляют более подробное сообщение об ошибке в случае неудачи.
-
assertIs(first, second, msg=None) -
assertIsNot(first, second, msg=None) -
Проверка, что first и second являются (или не являются) одним и тем же объектом.
Введено в версии 3.1.
-
assertIsNone(expr, msg=None) -
assertIsNotNone(expr, msg=None) -
Проверка, что expr является (или не является)
None.Введено в версии 3.1.
-
assertIn(member, container, msg=None) -
assertNotIn(member, container, msg=None) -
Проверка, что member находится (или не находится) в container.
Введено в версии 3.1.
-
assertIsInstance(obj, cls, msg=None) -
assertNotIsInstance(obj, cls, msg=None) -
Проверка, что obj является (или не является) экземпляром cls (которое может быть классом или кортежем классов, как поддерживается
isinstance()). Для проверки точного типа используйтеassertIs(type(obj), cls).Введено в версии 3.2.
Также можно проверить возникновение исключений, предупреждений и сообщений в журнале, используя следующие методы:
Метод
Проверяет, что
Введено в
fun(*args, **kwds)вызывает excfun(*args, **kwds)вызывает exc, и сообщение соответствует выражению регулярного выражения r3.1
fun(*args, **kwds)вызывает warn3.2
fun(*args, **kwds)вызывает warn, и сообщение соответствует выражению регулярного выражения r3.2
Внутри блока
withв журнале logger регистрируются записи с минимальным уровнем level3.4
-
assertRaises(exception, callable, *args, **kwds) -
assertRaises(exception, *, msg=None) -
Проверка, что исключение поднимается при вызове callable с любыми позиционными или именованными аргументами, также переданными в
assertRaises(). Тест проходит, если поднимается exception, ошибкой считается если поднимается другое исключение или завершается неудачей, если исключение не поднимается. Для перехвата любой группы исключений можно передать кортеж классов исключений как exception.Если указаны только аргументы exception и, возможно, msg, возвращается менеджер контекста, чтобы код под тестированием мог быть написан в строке, а не как функция:
with self.assertRaises(SomeException): do_something()При использовании в качестве менеджера контекста
assertRaises()принимает дополнительный именованный аргумент msg.Менеджер контекста сохранит перехваченный объект исключения в своем атрибуте
exception. Это может быть полезно, если предполагается выполнить дополнительные проверки на поднятом исключении:with self.assertRaises(SomeException) as cm: do_something() the_exception = cm.exception self.assertEqual(the_exception.error_code, 3)Изменено в версии 3.1: Добавлена возможность использовать
assertRaises()в качестве менеджера контекста.Изменено в версии 3.2: Добавлен атрибут
exception.Изменено в версии 3.3: Добавлен именованный аргумент msg при использовании в качестве менеджера контекста.
-
assertRaisesRegex(exception, regex, callable, *args, **kwds) -
assertRaisesRegex(exception, regex, *, msg=None) -
Подобно
assertRaises(), но также проверяет, что regex соответствует строковому представлению поднятого исключения. regex может быть объектом регулярного выражения или строкой, содержащей выражение регулярного выражения, подходящее для использования сre.search(). Примеры:self.assertRaisesRegex(ValueError, "invalid literal for.*XYZ'$", int, 'XYZ')или:
with self.assertRaisesRegex(ValueError, 'literal'): int('XYZ')Введено в версии 3.1: Добавлен под именем
assertRaisesRegexp.Изменено в версии 3.2: Переименовано в
assertRaisesRegex().Изменено в версии 3.3: Добавлен именованный аргумент msg при использовании в качестве менеджера контекста.
-
assertWarns(warning, callable, *args, **kwds) -
assertWarns(warning, *, msg=None) -
Проверка, что предупреждение генерируется при вызове callable с любыми позиционными или именованными аргументами, которые также передаются в
assertWarns(). Тест проходит, если warning генерируется, и завершается неудачей, если этого не происходит. Любое исключение — это ошибка. Чтобы перехватить любое из группы предупреждений, можно передать кортеж классов предупреждений как warnings.Если указаны только аргументы warning и, возможно, msg, возвращается менеджер контекста, чтобы код под тестированием мог быть написан в строке, а не как функция:
with self.assertWarns(SomeWarning): do_something()При использовании в качестве менеджера контекста
assertWarns()принимает дополнительный именованный аргумент msg.Менеджер контекста сохранит перехваченный объект предупреждения в атрибуте
warning, а строку исходного кода, которая вызвала предупреждение, в атрибутахfilenameиlineno. Это может быть полезно, если предполагается выполнить дополнительные проверки на перехваченном предупреждении:with self.assertWarns(SomeWarning) as cm: do_something() self.assertIn('myfile.py', cm.filename) self.assertEqual(320, cm.lineno)Этот метод работает независимо от фильтров предупреждений, действующих во время его вызова.
Введено в версии 3.2.
Изменено в версии 3.3: Добавлен именованный аргумент msg при использовании в качестве менеджера контекста.
-
assertWarnsRegex(warning, regex, callable, *args, **kwds) -
assertWarnsRegex(warning, regex, *, msg=None) -
Подобно
assertWarns(), но также проверяет, что regex соответствует сообщению сгенерированного предупреждения. regex может быть объектом регулярного выражения или строкой, содержащей регулярное выражение, подходящее для использования сre.search(). Пример:self.assertWarnsRegex(DeprecationWarning, r'legacy_function\(\) is deprecated', legacy_function, 'XYZ')или:
with self.assertWarnsRegex(RuntimeWarning, 'unsafe frobnicating'): frobnicate('/etc/passwd')Введено в версии 3.2.
Изменено в версии 3.3: Добавлен именованный аргумент msg при использовании в качестве менеджера контекста.
-
-
assertLogs(logger=None, level=None) -
Менеджер контекста для проверки того, что хотя бы одно сообщение было записано в журнал или в одном из его дочерних элементов, с указанным уровнем.
Если задано, журнал должен быть объектом
logging.Loggerили строкой, указывающей имя логгера. По умолчанию используется корневой логгер, который перехватывает все сообщения, которые не были заблокированы дочерним логгером, не поддерживающим распространение.Если задано, уровень должен быть либо числовым уровнем ведения журнала, либо его строковым эквивалентом (например, либо
"ERROR"илиlogging.ERROR). По умолчаниюlogging.INFO.Тест проходит, если хотя бы одно сообщение, выпущенное внутри блока
withсоответствует условиям журнал и уровень; в противном случае тест терпит неудачу.Объект, возвращаемый менеджером контекста, представляет собой вспомогательный инструмент записи, который отслеживает соответствующие сообщения журнала. У него есть два атрибута:
-
records -
Список объектов
logging.LogRecordсоответствующих сообщений журнала.
-
output -
Список объектов
strс отформатированным выводом соответствующих сообщений.
Пример:
with self.assertLogs('foo', level='INFO') as cm: logging.getLogger('foo').info('first message') logging.getLogger('foo.bar').error('second message') self.assertEqual(cm.output, ['INFO:foo:first message', 'ERROR:foo.bar:second message'])Введено в версии 3.4.
-
Существуют и другие методы, используемые для выполнения более специфических проверок, такие как:
Метод
Проверяет, что
Введено в
round(a-b, 7) == 0round(a-b, 7) != 0a > b3.1
a >= b3.1
a < b3.1
a <= b3.1
r.search(s)3.1
not r.search(s)3.2
Элементы a и b имеют одинаковое количество одинаковых элементов независимо от их порядка.
3.2
-
assertAlmostEqual(first, second, places=7, msg=None, delta=None) -
assertNotAlmostEqual(first, second, places=7, msg=None, delta=None) -
Проверяет, что first и second приблизительно (или не приблизительно) равны, вычисляя разницу, округляя до заданного количества десятичных знаков (по умолчанию 7) и сравнивая с нулём. Обратите внимание, что эти методы округляют значения до заданного числа десятичных знаков (как функция
round()), а не значимых цифр.Если вместо places передаётся delta, то разность между first и second должна быть меньше или равна (или больше) delta.
Передача как delta, так и places приводит к ошибке
TypeError.Изменено в версии 3.2:
assertAlmostEqual()автоматически рассматривает объекты, как приблизительно равные, если они равны.assertNotAlmostEqual()автоматически завершается неудачей, если объекты равны. Добавлено ключевой аргумент delta.
-
assertGreater(first, second, msg=None) -
assertGreaterEqual(first, second, msg=None) -
assertLess(first, second, msg=None) -
assertLessEqual(first, second, msg=None) -
Проверка, что first соответственно >, >=, < или <= чем second в зависимости от имени метода. В противном случае тест завершится неудачей:
>>> self.assertGreaterEqual(3, 4) AssertionError: "3" unexpectedly not greater than or equal to "4"
Введено в версии 3.1.
-
assertRegex(text, regex, msg=None) -
assertNotRegex(text, regex, msg=None) -
Проверка, что поиск по regex соответствует (или не соответствует) тексту. В случае неудачи сообщение об ошибке будет содержать шаблон и текст (или шаблон и часть текста, которая неожиданно соответствовала). regex может быть объектом регулярного выражения или строкой, содержащей регулярное выражение, подходящее для использования с
re.search().Введено в версии 3.1: Добавлена под именем
assertRegexpMatches.Изменено в версии 3.2: Метод
assertRegexpMatches()был переименован вassertRegex().Введено в версии 3.2:
assertNotRegex().Введено в версии 3.5: Имя
assertNotRegexpMatches— устаревший псевдоним дляassertNotRegex().
-
assertCountEqual(first, second, msg=None) -
Проверка, что последовательность first содержит те же элементы, что и second, независимо от их порядка. Если они не совпадают, будет сгенерировано сообщение об ошибке, отображающее различия между последовательностями.
Дубликаты элементов не игнорируются при сравнении first и second. Проверяется, что каждый элемент имеет одинаковое количество в обеих последовательностях. Эквивалентно:
assertEqual(Counter(list(first)), Counter(list(second)))но работает и с последовательностями неупорядоченных объектов.Введено в версии 3.2.
Метод
assertEqual()перенаправляет проверку равенства для объектов одного типа на разные методы для разных типов. Эти методы уже реализованы для большинства встроенных типов, но также можно зарегистрировать новые методы с помощьюaddTypeEqualityFunc():-
addTypeEqualityFunc(typeobj, function) -
Регистрирует метод, специфичный для типа, вызываемый
assertEqual(), для проверки, сравниваются ли два объекта одного и того же typeobj (не подклассы) как равные. function должен принимать два позиционных аргумента и один необязательный аргумент msg=None точно так же, как иassertEqual(). Он должен поднимать исключениеself.failureException(msg)при обнаружении неравенства между первыми двумя параметрами — возможно, предоставляя полезную информацию и подробно объясняя неравенства в сообщении об ошибке.Введено в версии 3.1.
Список методов, специфичных для типа, которые автоматически используются
assertEqual(), приведен в следующей таблице. Обратите внимание, что обычно нет необходимости вызывать эти методы напрямую.-
Метод
Используется для сравнения
Новый в
строки
3.1
последовательности
3.1
списки
3.1
кортежи
3.1
множества или неизменяемые множества
3.1
словари
3.1
-
assertMultiLineEqual(first, second, msg=None) -
Проверка, что многострочная строка first равна строке second. Если строки не равны, в сообщении об ошибке будет содержаться различие между ними. Этот метод используется по умолчанию при сравнении строк с
assertEqual().Новый в версии 3.1.
-
assertSequenceEqual(first, second, msg=None, seq_type=None) -
Проверяет, что две последовательности равны. Если указан seq_type, то оба first и second должны быть экземплярами seq_type, иначе будет возбуждено исключение. Если последовательности отличаются, генерируется сообщение об ошибке, показывающее разницу между ними.
Этот метод не вызывается напрямую
assertEqual(), но используется для реализацииassertListEqual()иassertTupleEqual().Новый в версии 3.1.
-
assertListEqual(first, second, msg=None) -
assertTupleEqual(first, second, msg=None) -
Проверяет, что два списка или кортежа равны. Если нет, генерируется сообщение об ошибке, показывающее только различия между ними. Также генерируется ошибка, если какой-либо из параметров имеет неправильный тип. Эти методы используются по умолчанию при сравнении списков или кортежей с
assertEqual().Новый в версии 3.1.
-
assertSetEqual(first, second, msg=None) -
Проверяет, что два множества равны. Если нет, генерируется сообщение об ошибке, содержащее список различий между множествами. Этот метод используется по умолчанию при сравнении множеств или неизменяемых множеств с
assertEqual().Возникает ошибка, если у first или second нет метода
set.difference().Новый в версии 3.1.
-
assertDictEqual(first, second, msg=None) -
Проверяет, что два словаря равны. Если нет, в сообщении об ошибке показываются различия в словарях. Этот метод будет использоваться по умолчанию для сравнения словарей при вызовах
assertEqual().Новый в версии 3.1.
Наконец,
TestCaseпредоставляет следующие методы и атрибуты:-
fail(msg=None) -
Безусловно сигнализирует об ошибке теста с сообщением msg или
None.
-
failureException -
Этот атрибут класса указывает на исключение, генерируемое методом теста. Если фреймворку теста нужно использовать специализированное исключение, возможно, для переноса дополнительной информации, он должен быть подклассом этого исключения, чтобы «работать корректно» с фреймворком. Начальное значение этого атрибута —
AssertionError.
-
longMessage -
Этот атрибут класса определяет, что произойдёт, когда пользовательское сообщение об ошибке передаётся в качестве параметра msg вызову assertXYY, который завершается ошибкой.
Trueявляется значением по умолчанию. В этом случае пользовательское сообщение добавляется в конец стандартного сообщения об ошибке. Когда установлено вFalse, пользовательское сообщение заменяет стандартное сообщение.Настройка класса может быть переопределена в отдельных методах теста путём присвоения атрибута экземпляра, self.longMessage, в значение
TrueилиFalseдо вызова методов assert.Настройка класса сбрасывается перед каждым вызовом теста.
Новый в версии 3.1.
-
maxDiff -
Этот атрибут управляет максимальной длиной вывода различий методами assert, которые сообщают о различиях при ошибке. По умолчанию 80*8 символов. Методы assert, на которые влияет этот атрибут, —
assertSequenceEqual()(включая все методы сравнения последовательностей, которые делегируют ему),assertDictEqual()иassertMultiLineEqual().Установление
maxDiffв значениеNoneозначает, что нет ограничения на длину вывода различий.Новый в версии 3.2.
Фреймворки тестов могут использовать следующие методы для сбора информации о тесте:
-
countTestCases() -
Возвращает количество тестов, представленных этим объектом теста. Для экземпляров
TestCaseэто всегда1.
-
defaultTestResult() -
Возвращает экземпляр класса результатов теста, который следует использовать для этого класса тестового случая (если другой экземпляр результата не предоставлен методу
run()).Для экземпляров
TestCaseэто всегда будет экземплярTestResult; подклассыTestCaseдолжны переопределять это по мере необходимости.
-
id() -
Возвращает строку, идентифицирующую конкретный тестовый случай. Обычно это полное имя метода теста, включая имя модуля и класса.
-
shortDescription() -
Возвращает описание теста или
Noneесли описание не предоставлено. По умолчанию этот метод возвращает первую строку документа строки метода теста, если она доступна, илиNone.Изменено в версии 3.1: В версии 3.1 это было изменено для добавления имени теста к краткому описанию, даже при наличии документации. Это вызвало проблемы совместимости с расширениями unittest, и добавление имени теста было перенесено в
TextTestResultв Python 3.2.
-
addCleanup(function, /, *args, **kwargs) -
Добавляет функцию, которая будет вызываться после
tearDown()для очистки ресурсов, используемых во время теста. Функции будут вызываться в обратном порядке к порядку их добавления (LIFO). Они вызываются с любыми аргументами и ключевыми словами, переданными вaddCleanup()при их добавлении.Если
setUp()завершается ошибкой, что означает, чтоtearDown()не вызывается, то все добавленные функции очистки все равно будут вызваны.Новый в версии 3.1.
-
-
doCleanups() -
Этот метод вызывается безусловно после
tearDown(), или послеsetUp(), еслиsetUp()вызывает исключение.Он отвечает за вызов всех функций очистки, добавленных с помощью
addCleanup(). Если вам нужны функции очистки, которые должны быть вызваны доtearDown(), то вы можете вызватьdoCleanups()самостоятельно.doCleanups()извлекает методы из стека функций очистки по одному, поэтому его можно вызвать в любое время.Новое в версии 3.1.
-
classmethod addClassCleanup(function, /, *args, **kwargs) -
Добавляет функцию, которая будет вызываться после
tearDownClass()для очистки ресурсов, используемых в ходе тестирования класса. Функции будут вызываться в обратном порядке добавления (LIFO). Они вызываются с любыми аргументами и именованными аргументами, переданными вaddClassCleanup()при их добавлении.Если
setUpClass()завершается ошибкой, что означает, чтоtearDownClass()не вызывается, то все добавленные функции очистки все равно будут вызваны.Новое в версии 3.8.
-
classmethod doClassCleanups() -
Этот метод вызывается безусловно после
tearDownClass(), или послеsetUpClass(), еслиsetUpClass()вызывает исключение.Он отвечает за вызов всех функций очистки, добавленных с помощью
addClassCleanup(). Если вам нужны функции очистки, которые должны быть вызваны доtearDownClass(), то вы можете вызватьdoClassCleanups()самостоятельно.doClassCleanups()извлекает методы из стека функций очистки по одному, поэтому его можно вызвать в любое время.Новое в версии 3.8.
-
-
class unittest.IsolatedAsyncioTestCase(methodName='runTest') -
Этот класс предоставляет API, аналогичный
TestCase, и также принимает корутины в качестве функций тестирования.Новое в версии 3.8.
-
coroutine asyncSetUp() -
Метод, вызываемый для подготовки тестовой среды. Вызывается после
setUp(). Вызывается непосредственно перед вызовом тестового метода; любые исключения, кромеAssertionErrorилиSkipTest, которые генерирует этот метод, будут считаться ошибками, а не сбоями тестирования. Реализация по умолчанию ничего не делает.
-
coroutine asyncTearDown() -
Метод, вызываемый сразу после вызова тестового метода и записи результата. Вызывается перед
tearDown(). Вызывается даже если тестовый метод вызвал исключение, поэтому реализация в подклассах может потребовать особого внимания к проверке внутреннего состояния. Любое исключение, кромеAssertionErrorилиSkipTest, вызванное этим методом, будет считаться дополнительной ошибкой, а не сбоем тестирования (тем самым увеличивая общее количество сообщенных ошибок). Этот метод будет вызван только в случае успешного выполненияasyncSetUp(), независимо от результата выполнения тестового метода. Реализация по умолчанию ничего не делает.
-
addAsyncCleanup(function, /, *args, **kwargs) -
Этот метод принимает корутину, которая может использоваться как функция очистки.
-
run(result=None) -
Настраивает новую очередь событий для выполнения теста, собирая результат в объект
TestResult, переданный как result. Если result опущено илиNone, создается временный объект результата (вызывая методdefaultTestResult()) и используется. Объект результата возвращается вызывающей сторонеrun(). В конце теста все задачи в очереди событий отменяются.
Пример, иллюстрирующий порядок:
from unittest import IsolatedAsyncioTestCase events = [] class Test(IsolatedAsyncioTestCase): def setUp(self): events.append("setUp") async def asyncSetUp(self): self._async_connection = await AsyncConnection() events.append("asyncSetUp") async def test_response(self): events.append("test_response") response = await self._async_connection.get("https://example.com") self.assertEqual(response.status_code, 200) self.addAsyncCleanup(self.on_cleanup) def tearDown(self): events.append("tearDown") async def asyncTearDown(self): await self._async_connection.close() events.append("asyncTearDown") async def on_cleanup(self): events.append("cleanup") if __name__ == "__main__": unittest.main()После выполнения теста,
eventsбудет содержать["setUp", "asyncSetUp", "test_response", "asyncTearDown", "tearDown", "cleanup"]. -
-
class unittest.FunctionTestCase(testFunc, setUp=None, tearDown=None, description=None) -
Этот класс реализует часть интерфейса
TestCase, которая позволяет тестовому прогонивателю управлять тестом, но не предоставляет методы, которые код теста может использовать для проверки и отчета об ошибках. Этот класс используется для создания тестовых случаев с использованием устаревшего кода теста, позволяя его интегрировать в тестовую среду, основанную наunittest.
Устаревшие псевдонимы
По историческим причинам, некоторые из методов TestCase имели один или несколько устаревших псевдонимов. В следующей таблице указаны правильные имена вместе с их устаревшими псевдонимами:
Имя метода | Устаревший псевдоним | Устаревший псевдоним |
|---|---|---|
failUnlessEqual | assertEquals | |
failIfEqual | assertNotEquals | |
failUnless | assert_ | |
failIf | ||
failUnlessRaises | ||
failUnlessAlmostEqual | assertAlmostEquals | |
failIfAlmostEqual | assertNotAlmostEquals | |
assertRegexpMatches | ||
assertNotRegexpMatches | ||
assertRaisesRegexp |
Устарело начиная с версии 3.1: Устаревшие псевдонимы fail* в колонке два были удалены.
Устарело начиная с версии 3.2: Устаревшие псевдонимы assert* в колонке три были удалены.
Устарело начиная с версии 3.2: assertRegexpMatches и assertRaisesRegexp были переименованы в assertRegex() и assertRaisesRegex().
Устарело начиная с версии 3.5: Имя assertNotRegexpMatches устарело, вместо него следует использовать assertNotRegex().
Группировка тестов
-
class unittest.TestSuite(tests=()) -
Этот класс представляет собой агрегацию отдельных тестовых случаев и наборов тестов. Класс предоставляет интерфейс, необходимый исполнителю тестов, чтобы позволить ему запускаться как любой другой тестовый случай. Запуск экземпляра
TestSuiteэквивалентен итерации по набору, выполняя каждый тест индивидуально.Если задан tests, он должен быть итерируемым объектом отдельных тестовых случаев или других наборов тестов, которые будут использоваться для построения набора изначально. Дополнительные методы предназначены для добавления тестовых случаев и наборов в коллекцию позднее.
Объекты
TestSuiteведут себя почти как объектыTestCase, за исключением того, что они фактически не реализуют тест. Вместо этого они используются для агрегирования тестов в группы тестов, которые должны выполняться вместе. Доступны некоторые дополнительные методы для добавления тестов в экземплярыTestSuite:-
addTests(tests) -
Добавить все тесты из итерируемого объекта экземпляров
TestCaseиTestSuiteв этот набор тестов.Это эквивалентно итерации по tests, вызову
addTest()для каждого элемента.
TestSuiteразделяет следующие методы сTestCase:-
run(result) -
Запустить тесты, связанные с этим набором, собирая результат в объект результата, переданный как result. Отметьте, что в отличие от
TestCase.run(),TestSuite.run()требует передачи объекта результата.
-
debug() -
Запустить тесты, связанные с этим набором, без сбора результатов. Это позволяет исключениям, поднятым тестом, распространяться к вызывающей стороне и может использоваться для поддержки запуска тестов под отладчиком.
-
countTestCases() -
Возвращает количество тестов, представленных этим тестовым объектом, включая все индивидуальные тесты и поднаборы.
-
__iter__() -
Тесты, сгруппированные по
TestSuite, всегда доступны посредством итерации. Подклассы могут лениво предоставлять тесты, переопределяя__iter__(). Обратите внимание, что этот метод может вызываться несколько раз на одном наборе (например, при подсчёте тестов или сравнении на равенство), поэтому тесты, возвращаемые повторными итерациями передTestSuite.run(), должны быть одинаковыми для каждой итерации вызова. ПослеTestSuite.run()вызывающие стороны не должны полагаться на тесты, возвращаемые этим методом, если вызывающая сторона не использует подкласс, который переопределяетTestSuite._removeTestAtIndex()для сохранения ссылок на тесты.Изменено в версии 3.2: В более ранних версиях
TestSuiteобращался к тестам напрямую, а не через итерацию, поэтому переопределение__iter__()не было достаточным для предоставления тестов.Изменено в версии 3.4: В более ранних версиях
TestSuiteсохранял ссылки на каждыйTestCaseпослеTestSuite.run(). Подклассы могут восстановить это поведение, переопределяяTestSuite._removeTestAtIndex().
В типичном использовании объекта
TestSuiteметодrun()вызываетсяTestRunnerвместо пользовательской оболочки тестов. -
Загрузка и выполнение тестов
-
class unittest.TestLoader -
Класс
TestLoaderиспользуется для создания наборов тестов из классов и модулей. Обычно нет необходимости создавать экземпляр этого класса; модульunittestпредоставляет экземпляр, который можно использовать совместно, какunittest.defaultTestLoader. Однако использование подкласса или экземпляра позволяет настроить некоторые настраиваемые свойства.Объекты
TestLoaderимеют следующие атрибуты:-
errors -
Список некритичных ошибок, возникших во время загрузки тестов. Не сбрасывается загрузчиком ни в один момент. Критические ошибки сигнализируются соответствующим методом, выбрасывающим исключение для вызывающего кода. Некритические ошибки также указываются синтетическим тестом, который при выполнении выбросит исходную ошибку.
Введено в версии 3.5.
Объекты
TestLoaderимеют следующие методы:-
loadTestsFromTestCase(testCaseClass) -
Возвращает набор всех тестовых случаев, содержащихся в производном от
TestCasetestCaseClass.Экземпляр тестового случая создается для каждого метода, имя которого указано в
getTestCaseNames(). По умолчанию это имена методов, начинающиеся сtest. ЕслиgetTestCaseNames()не возвращает методы, но реализован методrunTest(), вместо этого создается один тестовый случай для этого метода.
-
loadTestsFromModule(module, pattern=None) -
Возвращает набор всех тестовых случаев, содержащихся в указанном модуле. Этот метод ищет в модуле module классы, производные от
TestCase, и создаёт экземпляр класса для каждого тестового метода, определённого для класса.Примечание
Использование иерархии классов, производных от
TestCase, может быть удобным для совместного использования фикстур и вспомогательных функций, но определение тестовых методов в базовых классах, которые не предназначены для прямого создания экземпляров, не совместимо с этим методом. Однако это может быть полезно, когда фикстуры различаются и определяются в подклассах.Если модуль предоставляет функцию
load_tests, она будет вызвана для загрузки тестов. Это позволяет модулям настраивать загрузку тестов. Это протокол load_tests. Аргумент pattern передаётся в качестве третьего аргумента вload_tests.Изменено в версии 3.2: Добавлена поддержка
load_tests.Изменено в версии 3.5: Недокументированный и неофициальный необязательный аргумент use_load_tests устарел и игнорируется, хотя он по-прежнему принимается для обратной совместимости. Метод также теперь принимает ключевой аргумент pattern, который передаётся
load_testsв качестве третьего аргумента.
-
loadTestsFromName(name, module=None) -
Возвращает набор всех тестовых случаев, заданных строковым спецификатором.
Спецификатор name — это «точечное имя», которое может указывать либо на модуль, либо на класс тестового случая, либо на тестовый метод внутри класса тестового случая, либо на экземпляр
TestSuite, либо на вызываемый объект, который возвращает экземплярTestCaseилиTestSuite. Эти проверки применяются в указанном порядке; другими словами, метод в возможном тестовом классе будет воспринят как «метод теста внутри класса тестового случая», а не как «вызываемый объект».Например, если у вас есть модуль
SampleTests, содержащий класс, производный отTestCase,SampleTestCase, с тремя тестовыми методами (test_one(),test_two(), иtest_three()), спецификатор'SampleTests.SampleTestCase'заставит этот метод вернуть набор, который выполнит все три тестовых метода. Использование спецификатора'SampleTests.SampleTestCase.test_two'заставит его вернуть набор тестов, который выполнит только метод тестаtest_two(). Спецификатор может ссылаться на модули и пакеты, которые ещё не импортированы; они будут импортированы как побочный эффект.Метод необязательно разрешает name относительно заданного module.
Изменено в версии 3.5: Если при обработке name происходит ошибка
ImportErrorилиAttributeError, возвращается синтетический тест, который при выполнении вызовет эту ошибку. Эти ошибки включаются в накопленные ошибки self.errors.
-
loadTestsFromNames(names, module=None) -
Аналогично
loadTestsFromName(), но принимает последовательность имён, а не одно имя. Возвращаемое значение — набор тестов, поддерживающий все тесты, определённые для каждого имени.
-
getTestCaseNames(testCaseClass) -
Возвращает отсортированную последовательность имён методов, найденных внутри testCaseClass; это должен быть подкласс
TestCase.
-
discover(start_dir, pattern='test*.py', top_level_dir=None) -
Ищет все тестовые модули, рекурсивно перебирая подкаталоги с указанной начальной директории, и возвращает объект TestSuite, содержащий их. Будут загружены только те тестовые файлы, которые соответствуют pattern (используя синтаксис шаблонов оболочек). Будут загружены только имена модулей, которые могут быть импортированы (то есть являются допустимыми идентификаторами Python).
Все тестовые модули должны быть импортируемы с верхнего уровня проекта. Если начальная директория не является директорией верхнего уровня, то директория верхнего уровня должна быть указана отдельно.
Если импорт модуля завершается ошибкой, например, из-за синтаксической ошибки, то это регистрируется как одна ошибка, и поиск продолжается. Если ошибка импорта вызвана исключением
SkipTest, она регистрируется как пропуск, а не ошибка.Если найден пакет (каталог, содержащий файл с именем
__init__.py), пакет проверяется на наличие функцииload_tests. Если она существует, она вызываетсяpackage.load_tests(loader, tests, pattern). Поиск тестов заботится о том, чтобы пакет проверялся только один раз во время вызова, даже если сама функция load_tests вызываетloader.discover.Если
load_testsсуществует, поиск не рекурсивно входит в пакет,load_testsотвечает за загрузку всех тестов в пакете.Шаблон намеренно не сохраняется как атрибут загрузчика, чтобы пакеты могли продолжить поиск сами. top_level_dir сохраняется, чтобы
load_testsне пришлось передавать этот аргумент вloader.discover().start_dir может быть именем точечного модуля, а также директорией.
Введено в версии 3.2.
Изменено в версии 3.4: Модули, которые поднимают
SkipTestпри импорте, регистрируются как пропуска, а не как ошибки.Изменено в версии 3.4: start_dir может быть пакетами именного пространства.
Изменено в версии 3.4: Пути сортируются перед импортом, чтобы порядок выполнения был одинаковым, даже если порядок на файловой системе не зависит от имени файла.
Изменено в версии 3.5: Найденные пакеты теперь проверяются на наличие
load_testsнезависимо от того, совпадает ли их путь с pattern, потому что имя пакета не может соответствовать шаблону по умолчанию.
Следующие атрибуты
TestLoaderмогут быть настроены путём наследования или присвоения экземпляру:-
testMethodPrefix -
Строка, задающая префикс имён методов, которые будут интерпретироваться как тестовые методы. Значение по умолчанию —
'test'.Это влияет на
getTestCaseNames()и все методыloadTestsFrom*().
-
sortTestMethodsUsing -
Функция, используемая для сравнения имён методов при сортировке в
getTestCaseNames()и всех методахloadTestsFrom*().
-
-
suiteClass -
Вызываемый объект, который создает набор тестов из списка тестов. Методы полученного объекта не нужны. По умолчанию используется класс
TestSuite.Это влияет на все методы
loadTestsFrom*().
-
testNamePatterns -
Список шаблонов имен тестов в стиле оболочки Unix, которым методы тестов должны соответствовать, чтобы быть включенными в наборы тестов (см. параметр
-v).Если этот атрибут не
None(по умолчанию), все методы тестов, которые должны быть включены в наборы тестов, должны соответствовать одному из шаблонов в этом списке. Обратите внимание, что соответствие всегда выполняется с помощьюfnmatch.fnmatchcase(), поэтому, в отличие от шаблонов, переданных в параметр-v, простые шаблоны подстрок должны быть преобразованы с использованием*шаблонов.Это влияет на все методы
loadTestsFrom*().New in version 3.7.
-
-
class unittest.TestResult -
Этот класс используется для сбора информации о том, какие тесты прошли успешно, а какие — нет.
Объект
TestResultхранит результаты набора тестов. КлассыTestCaseиTestSuiteгарантируют, что результаты записываются должным образом; авторы тестов не должны беспокоиться о записи результатов тестов.Фреймворки тестирования, построенные на основе
unittest, могут потребовать доступ к объектуTestResult, сгенерированному при запуске набора тестов, для целей отчётности; экземплярTestResultвозвращается методомTestRunner.run()для этой цели.Экземпляры
TestResultимеют следующие атрибуты, которые будут полезны при проверке результатов выполнения набора тестов:-
errors -
Список, содержащий 2-кортежи из экземпляров
TestCaseи строк, содержащих отформатированные трассировки стека. Каждый кортеж представляет тест, вызвавший непредвиденное исключение.
-
failures -
Список, содержащий 2-кортежи из экземпляров
TestCaseи строк, содержащих отформатированные трассировки стека. Каждый кортеж представляет тест, в котором явным образом было указано завершение с ошибкой с помощью методовTestCase.assert*().
-
skipped -
Список, содержащий 2-кортежи из экземпляров
TestCaseи строк, содержащих причину пропуска теста.Новое в версии 3.1.
-
expectedFailures -
Список, содержащий 2-кортежи из экземпляров
TestCaseи строк, содержащих отформатированные трассировки стека. Каждый кортеж представляет ожидаемую ошибку или сбой тестового случая.
-
unexpectedSuccesses -
Список, содержащий экземпляры
TestCase, которые были помечены как ожидаемые ошибки, но завершились успешно.
-
shouldStop -
Устанавливается в
True, когда выполнение тестов должно быть остановлено методомstop().
-
testsRun -
Общее количество выполненных тестов.
-
buffer -
Если установлено в true,
sys.stdoutиsys.stderrбудут буферизованы между вызовамиstartTest()иstopTest(). Собраный вывод будет отражен в реальномsys.stdoutиsys.stderrтолько в случае ошибки или сбоя теста. Любой вывод также прикрепляется к сообщению об ошибке/сбое.Новое в версии 3.2.
-
failfast -
Если установлено в true, метод
stop()будет вызван при первой ошибке или сбое, останавливая выполнение теста.Новое в версии 3.2.
-
tb_locals -
Если установлено в true, локальные переменные будут отображаться в трассировках.
Новое в версии 3.5.
-
wasSuccessful() -
Возвращает
True, если все выполненные до этого тесты прошли успешно, иначе возвращаетFalse.Изменено в версии 3.4: Возвращает
False, если были какие-либоunexpectedSuccessesот тестов, помеченных декораторомexpectedFailure().
-
stop() -
Этот метод может быть вызван для сигнализации о том, что набор выполняемых тестов должен быть прерван, установив атрибут
shouldStopвTrue. ОбъектыTestRunnerдолжны учитывать этот флаг и возвращаться без выполнения дополнительных тестов.Например, эта функция используется классом
TextTestRunnerдля остановки фреймворка тестирования при сигнализации пользователем об прерывании с клавиатуры. Интерактивные инструменты, предоставляющие реализацииTestRunner, могут использовать это аналогичным образом.
Следующие методы класса
TestResultиспользуются для поддержания внутренних структур данных и могут быть расширены в подклассах для поддержки дополнительных требований к отчётности. Это особенно полезно при создании инструментов, которые поддерживают интерактивную отчётность во время выполнения тестов.-
startTest(test) -
Вызывается, когда тестовый случай test собирается для выполнения.
-
stopTest(test) -
Вызывается после выполнения тестового случая test, независимо от результата.
-
startTestRun() -
Вызывается один раз перед выполнением любых тестов.
Новое в версии 3.1.
-
stopTestRun() -
Вызывается один раз после выполнения всех тестов.
Новое в версии 3.1.
-
addError(test, err) -
Вызывается, когда тестовый случай test вызывает непредвиденное исключение. err — кортеж в формате, возвращаемом
sys.exc_info():(type, value, traceback).Стандартная реализация добавляет кортеж
(test, formatted_err)в атрибут экземпляраerrors, где formatted_err — отформатированная трассировка, полученная из err.
-
addFailure(test, err) -
Вызывается, когда тестовый случай test завершается с ошибкой. err — кортеж в формате, возвращаемом
sys.exc_info():(type, value, traceback).Стандартная реализация добавляет кортеж
(test, formatted_err)в атрибут экземпляраfailures, где formatted_err — отформатированная трассировка, полученная из err.
-
addSuccess(test) -
Вызывается, когда тестовый случай test завершается успешно.
Стандартная реализация ничего не делает.
-
addSkip(test, reason) -
Вызывается, когда тестовый случай test пропущен. reason — причина пропуска теста.
Стандартная реализация добавляет кортеж
(test, reason)в атрибут экземпляраskipped.
-
addExpectedFailure(test, err) -
Вызывается, когда тестовый случай test завершается с ошибкой или сбоем, но был помечен декоратором
expectedFailure().Стандартная реализация добавляет кортеж
(test, formatted_err)в атрибут экземпляраexpectedFailures, где formatted_err — отформатированная трассировка, полученная из err.
-
addUnexpectedSuccess(test) -
Вызывается, когда тестовый случай test был помечен декоратором
expectedFailure(), но завершился успешно.Стандартная реализация добавляет тест в атрибут экземпляра
unexpectedSuccesses.
-
-
addSubTest(test, subtest, outcome) -
Вызывается при завершении подтеста. test — это тестовый случай, соответствующий методу теста. subtest — экземпляр настраиваемого
TestCase, описывающий подтест.Если outcome —
None, подтест выполнен успешно. В противном случае, он завершился ошибкой, где outcome — кортеж, возвращаемыйsys.exc_info():(type, value, traceback).По умолчанию реализация ничего не делает при успешном выполнении, а записывает ошибки подтестов как обычные ошибки.
Добавлена в версии 3.4.
-
-
class unittest.TextTestResult(stream, descriptions, verbosity) -
Конкретная реализация
TestResult, используемаяTextTestRunner.Добавлена в версии 3.2: Этот класс ранее назывался
_TextTestResult. Старое имя всё ещё существует как псевдоним, но устарело.
-
unittest.defaultTestLoader -
Экземпляр класса
TestLoader, предназначенный для совместного использования. Если нет необходимости в настройкеTestLoader, этот экземпляр можно использовать вместо многократного создания новых экземпляров.
-
class unittest.TextTestRunner(stream=None, descriptions=True, verbosity=1, failfast=False, buffer=False, resultclass=None, warnings=None, *, tb_locals=False) -
Реализация базового запуска тестов, которая выводит результаты в поток. Если stream —
None, по умолчанию используетсяsys.stderrв качестве потока вывода. Этот класс имеет несколько настраиваемых параметров, но по сути очень прост. Графические приложения, которые запускают наборы тестов, должны предоставлять альтернативные реализации. Такие реализации должны принимать**kwargsкак интерфейс для построения исполнителей изменяется по мере добавления функций в unittest.По умолчанию этот исполнитель показывает
DeprecationWarning,PendingDeprecationWarning,ResourceWarningиImportWarning, даже если они по умолчанию игнорируются. Предупреждения об устаревании, вызванные устаревшими методами unittest, также обрабатываются особым образом, и, когда фильтры предупреждений —'default'или'always', они будут отображаться только один раз на модуль, чтобы избежать слишком большого количества сообщений об ошибках. Это поведение можно переопределить с помощью параметров Python-Wdили-Wa(см. Управление предупреждениями) и оставить warnings равнымNone.Изменено в версии 3.2: Добавлен аргумент
warnings.Изменено в версии 3.2: Поток по умолчанию установлен на
sys.stderrво время инициализации, а не во время импорта.Изменено в версии 3.5: Добавлен параметр tb_locals.
-
_makeResult() -
Этот метод возвращает экземпляр
TestResultиспользуемыйrun(). Он не предназначен для прямого вызова, но может быть переопределён в подклассах для предоставления настраиваемогоTestResult._makeResult()создаёт экземпляр класса или вызываемого объекта, переданного в конструкторTextTestRunnerв качестве аргументаresultclass. По умолчанию —TextTestResult, еслиresultclassне указан. Класс результатов создаётся со следующими аргументами:stream, descriptions, verbosity
-
run(test) -
Этот метод является главным публичным интерфейсом
TextTestRunner. Этот метод принимает экземплярTestSuiteилиTestCase. Создаётся экземплярTestResultс помощью вызова_makeResult(), и тесты запускаются, а результаты выводятся в stdout.
-
-
unittest.main(module='__main__', defaultTest=None, argv=None, testRunner=None, testLoader=unittest.defaultTestLoader, exit=True, verbosity=1, failfast=None, catchbreak=None, buffer=None, warnings=None) -
Программа командной строки, которая загружает набор тестов из module и запускает их; это в первую очередь для удобного выполнения модулей тестов. Самый простой способ использования этой функции — включить следующую строку в конце скрипта тестов:
if __name__ == '__main__': unittest.main()Вы можете запустить тесты с более подробной информацией, передав аргумент verbosity:
if __name__ == '__main__': unittest.main(verbosity=2)Аргумент defaultTest — это имя одного теста или итерируемый набор имён тестов для запуска, если имена тестов не указаны через argv. Если не указан или
Noneи имена тестов не указаны через argv, выполняются все тесты, найденные в module.Аргумент argv может быть списком опций, переданных программе, где первый элемент — имя программы. Если не указан или
None, используются значения изsys.argv.Аргумент testRunner может быть классом исполнителя тестов или уже созданным экземпляром. По умолчанию
mainвызываетsys.exit()с кодом завершения, указывающим на успех или неудачу проведённых тестов.Аргумент testLoader должен быть экземпляром
TestLoaderи по умолчанию равенdefaultTestLoader.mainподдерживает использование из интерактивного интерпретатора, передавая аргументexit=False. Это отображает результат в стандартном выводе без вызоваsys.exit():>>> from unittest import main >>> main(module='test_module', exit=False)
Параметры failfast, catchbreak и buffer имеют тот же эффект, что и одноимённые параметры командной строки.
Аргумент warnings задаёт фильтр предупреждений, который должен использоваться при запуске тестов. Если он не указан, он останется
Noneесли параметр-Wпередан в python (см. Управление предупреждениями), в противном случае он будет установлен на'default'.Вызов
mainфактически возвращает экземпляр классаTestProgram. Это хранит результат проведённых тестов как атрибутresult.Изменено в версии 3.1: Добавлен параметр exit.
Изменено в версии 3.2: Добавлены параметры verbosity, failfast, catchbreak, buffer и warnings.
Изменено в версии 3.4: Параметр defaultTest изменён для поддержки также итерируемых наборов имён тестов.
Протокол load_tests
Новое в версии 3.2.
Модули или пакеты могут настроить загрузку тестов из них во время обычных запусков или обнаружения тестов, реализовав функцию, называемую load_tests.
Если модуль теста определяет load_tests, он будет вызван TestLoader.loadTestsFromModule() со следующими аргументами:
load_tests(loader, standard_tests, pattern)
где шаблон передаётся напрямую из loadTestsFromModule. По умолчанию он равен None.
Функция должна вернуть TestSuite.
loader — это экземпляр TestLoader, выполняющий загрузку. standard_tests — это тесты, которые по умолчанию загружались бы из модуля. Для модулей тестов обычно достаточно добавить или удалить тесты из стандартного набора тестов. Третий аргумент используется при загрузке пакетов в рамках обнаружения тестов.
Типичная функция load_tests, которая загружает тесты из определённого набора классов TestCase, может выглядеть следующим образом:
test_cases = (TestCase1, TestCase2, TestCase3)
def load_tests(loader, tests, pattern):
suite = TestSuite()
for test_class in test_cases:
tests = loader.loadTestsFromTestCase(test_class)
suite.addTests(tests)
return suite
Если обнаружение запускается в каталоге, содержащем пакет, либо из командной строки, либо вызывая TestLoader.discover(), то пакет __init__.py будет проверяться на наличие load_tests. Если эта функция не существует, обнаружение рекурсивно войдёт в пакет, как будто это просто другой каталог. В противном случае обнаружение тестов пакета будет оставлено load_tests, который вызывается со следующими аргументами:
load_tests(loader, standard_tests, pattern)
Это должно вернуть TestSuite, представляющую все тесты из пакета. (standard_tests будет содержать только тесты, собранные из __init__.py.)
Поскольку шаблон передаётся в load_tests, пакет свободен продолжать (и потенциально изменять) обнаружение тестов. Функция «ничего не делать» load_tests для тестового пакета будет выглядеть следующим образом:
def load_tests(loader, standard_tests, pattern):
# top level directory cached on loader instance
this_dir = os.path.dirname(__file__)
package_tests = loader.discover(start_dir=this_dir, pattern=pattern)
standard_tests.addTests(package_tests)
return standard_tests
Изменено в версии 3.5: Обнаружение больше не проверяет имена пакетов на соответствие шаблону из-за невозможности соответствия имён пакетов шаблону по умолчанию.
Фикстуры классов и модулей
Фикстуры на уровне класса и модуля реализованы в TestSuite. Когда тестовый набор встречает тест из нового класса, tearDownClass() предыдущего класса (если он есть) вызывается, за которым следует setUpClass() нового класса.
Аналогично, если тест из другого модуля, чем предыдущий тест, тогда tearDownModule предыдущего модуля запускается, за которым следует setUpModule нового модуля.
После того, как все тесты будут выполнены, конечный tearDownClass и tearDownModule будут выполнены.
Обратите внимание, что общие фикстуры не совместимы с [возможными] функциями, такими как параллелизация тестов, и нарушают изоляцию тестов. Их следует использовать с осторожностью.
По умолчанию порядок тестов, созданных загрузчиками тестов unittest, заключается в группировании всех тестов из тех же модулей и классов вместе. Это приведёт к тому, что setUpClass / setUpModule (и т. д.) будут вызываться ровно один раз на класс и модуль. Если вы случайным образом измените порядок, так что тесты из разных модулей и классов будут расположены рядом друг с другом, то эти общие функции фикстур могут быть вызваны несколько раз в одном запуске тестов.
Общие фикстуры не предназначены для работы с наборами с нестандартным порядком. BaseTestSuite всё ещё существует для фреймворков, которые не хотят поддерживать общие фикстуры.
Если при выполнении одной из общих функций фикстур возникнет исключение, тест будет отчётён как ошибка. Поскольку нет соответствующего экземпляра теста, создаётся объект _ErrorHolder (у которого такой же интерфейс, как у TestCase), чтобы представить ошибку. Если вы просто используете стандартный исполняемый модуль unittest, то эта деталь не имеет значения, но если вы создатель фреймворка, то это может быть актуально.
setUpClass и tearDownClass
Эти методы должны быть реализованы как методы класса:
import unittest
class Test(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls._connection = createExpensiveConnectionObject()
@classmethod
def tearDownClass(cls):
cls._connection.destroy()
Если вы хотите, чтобы setUpClass и tearDownClass были вызваны в базовых классах, то вы должны сами вызвать их. Реализации в TestCase пустые.
Если при выполнении setUpClass возникает исключение, то тесты в классе не выполняются, и tearDownClass не выполняется. Пропущенные классы не будут иметь setUpClass или tearDownClass выполненными. Если исключение является исключением SkipTest, то класс будет отчётён как пропущенный, а не как ошибка.
setUpModule и tearDownModule
Эти функции должны быть реализованы как функции:
def setUpModule():
createConnection()
def tearDownModule():
closeConnection()
Если при выполнении setUpModule возникает исключение, то ни один из тестов в модуле не будет выполнен, и tearDownModule не будет выполнен. Если исключение является исключением SkipTest, то модуль будет отчётён как пропущенный, а не как ошибка.
Чтобы добавить код очистки, который должен выполняться даже в случае исключения, используйте addModuleCleanup:
-
unittest.addModuleCleanup(function, /, *args, **kwargs) -
Добавить функцию, которая будет вызвана после
tearDownModule()для очистки ресурсов, используемых во время класса теста. Функции будут вызываться в обратном порядке к порядку их добавления (LIFO). Они вызываются с любыми аргументами и ключевыми аргументами, переданными вaddModuleCleanup()при их добавлении.Если
setUpModule()терпит неудачу, что означает, чтоtearDownModule()не вызывается, то любые функции очистки, которые были добавлены, всё равно будут вызваны.Новое в версии 3.8.
-
unittest.doModuleCleanups() -
Эта функция вызывается безусловно после
tearDownModule(), или послеsetUpModule(), еслиsetUpModule()вызывает исключение.Она отвечает за вызов всех функций очистки, добавленных с помощью
addModuleCleanup(). Если вам нужно, чтобы функции очистки вызывались доtearDownModule(), вы можете сами вызватьdoModuleCleanups().doModuleCleanups()извлекает методы из стека функций очистки по одному за раз, поэтому его можно вызывать в любое время.Новое в версии 3.8.
Обработка сигналов
Новая версия 3.2.
Командная строка опция -c/--catch для unittest, а также параметр catchbreak для unittest.main(), обеспечивают более дружелюбную обработку нажатия Ctrl+C во время выполнения теста. При включенной обработке нажатия Ctrl+C позволит завершить текущий тест, а затем выполнение теста закончится и будут отображены все результаты до этого момента. Второе нажатие Ctrl+C вызовет KeyboardInterrupt обычным способом.
Обработчик сигнала для обработки нажатия Ctrl+C пытается оставаться совместимым с кодом или тестами, которые устанавливают собственный обработчик signal.SIGINT. Если обработчик unittest вызывается, но не является установленным обработчиком signal.SIGINT, т.е. он был заменен тестируемой системой и делегирован, то он вызывает обработчик по умолчанию. Это обычно ожидаемое поведение кода, который заменяет установленный обработчик и делегирует его. Для отдельных тестов, которые нуждаются в отключении обработки нажатия Ctrl+C, можно использовать декоратор removeHandler().
Существует несколько служебных функций для авторов фреймворков, чтобы включить функциональность обработки нажатия Ctrl+C в рамках фреймворков тестирования.
-
unittest.installHandler() -
Установить обработчик нажатия Ctrl+C. При получении
signal.SIGINT(обычно в ответ на нажатие пользователем Ctrl+C) для всех зарегистрированных результатов вызываетсяstop().
-
unittest.registerResult(result) -
Зарегистрировать объект
TestResultдля обработки нажатия Ctrl+C. Регистрация результата сохраняет слабую ссылку на него, поэтому она не препятствует его сбору мусора.Регистрация объекта
TestResultне имеет побочных эффектов, если обработка нажатия Ctrl+C не включена, поэтому фреймворки тестов могут безусловно регистрировать все создаваемые результаты независимо от того, включена ли обработка.
-
unittest.removeResult(result) -
Удалить зарегистрированный результат. После удаления результата
stop()больше не будет вызываться для этого объекта результата в ответ на нажатие Ctrl+C.
-
unittest.removeHandler(function=None) -
Если вызывается без аргументов, эта функция удаляет обработчик нажатия Ctrl+C, если он был установлен. Эту функцию также можно использовать в качестве декоратора теста, чтобы временно удалить обработчик во время выполнения теста:
@unittest.removeHandler def test_signal_handling(self): ...
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/unittest.html