Как использовать подтесты
Добавлено в версии 9.0.
Примечание
Эта возможность является экспериментальной. Её поведение, в частности способ отображения ошибок, может измениться в будущих выпусках. Однако основная функциональность и способы использования считаются стабильными.
pytest позволяет группировать проверки внутри обычного теста — такие группы называются подтестами.
Подтесты — это альтернатива параметризации. Они особенно полезны, когда точные значения параметров неизвестны на этапе сбора тестов.
# content of test_subtest.py
def test(subtests):
for i in range(5):
with subtests.test(msg="custom message", i=i):
assert i % 2 == 0
Каждый сбой проверки или ошибка перехватывается менеджером контекста и отображается отдельно:
$ pytest -q test_subtest.py
uuuuuF [100%]
================================= FAILURES =================================
_______________________ test [custom message] (i=1) ________________________
subtests = <_pytest.subtests.Subtests object at 0xdeadbeef0001>
def test(subtests):
for i in range(5):
with subtests.test(msg="custom message", i=i):
> assert i % 2 == 0
E assert (1 % 2) == 0
test_subtest.py:6: AssertionError
_______________________ test [custom message] (i=3) ________________________
subtests = <_pytest.subtests.Subtests object at 0xdeadbeef0001>
def test(subtests):
for i in range(5):
with subtests.test(msg="custom message", i=i):
> assert i % 2 == 0
E assert (3 % 2) == 0
test_subtest.py:6: AssertionError
___________________________________ test ___________________________________
contains 2 failed subtests
========================= short test summary info ==========================
SUBFAILED[custom message] (i=1) test_subtest.py::test - assert (1 % 2) == 0
SUBFAILED[custom message] (i=3) test_subtest.py::test - assert (3 % 2) == 0
FAILED test_subtest.py::test - contains 2 failed subtests
3 failed, 3 subtests passed in 0.12s
В приведённом выше выводе:
- В компактном выводе о ходе выполнения для успешно пройденных и неудачных подтестов используется
u; сведения о каждом неудачном подтесте см. в краткой сводке тестов. - Сбои подтестов отображаются как
SUBFAILED. - Подтесты отображаются первыми, а «верхнеуровневый» тест — отдельно в конце.
Обратите внимание: в одном тесте можно использовать subtests несколько раз или даже сочетать их с обычными проверками за пределами блока subtests.test:
def test(subtests):
for i in range(5):
with subtests.test("stage 1", i=i):
assert i % 2 == 0
assert func() == 10
for i in range(10, 20):
with subtests.test("stage 2", i=i):
assert i % 2 == 0
Примечание
Альтернативу подтестам см. в разделе Как параметризовать фикстуры и тестовые функции.
Подробность вывода
По умолчанию отображаются только сбои подтестов. При более высоком уровне подробности (-v) также отображается ход выполнения для успешно пройденных подтестов.
Подробность вывода подтестов можно настроить с помощью параметра verbosity_subtests.
Аннотации типов
pytest.Subtests экспортируется, поэтому его можно использовать в аннотациях типов:
def test(subtests: pytest.Subtests) -> None: ...
Параметризация и подтесты
Хотя традиционная параметризация pytest и subtests похожи, между ними есть важные различия, и они применяются в разных случаях.
Параметризация
- Выполняется на этапе сбора тестов.
- Создаёт отдельные тесты.
- На параметризованные тесты можно ссылаться из командной строки.
- Хорошо работает с плагинами, управляющими выполнением тестов, например с
--last-failed. - Идеально подходит для тестирования таблиц решений.
Подтесты
- Выполняются во время запуска теста.
- Неизвестны на этапе сбора тестов.
- Могут генерироваться динамически.
- На отдельные подтесты нельзя ссылаться из командной строки.
- Плагины, управляющие выполнением тестов, не могут воздействовать на отдельные подтесты.
- Сбой проверки внутри подтеста не прерывает выполнение теста, поэтому пользователи могут увидеть все сбои в одном отчёте.
Примечание
Изначально эта возможность была реализована в отдельном плагине pytest-subtests, но затем 9.0 был включён в ядро.
Реализация в ядре должна быть совместима с реализацией плагина, за исключением того, что в ней отсутствуют пользовательские параметры командной строки для управления выводом подтестов.
© 2015–2026 Holger Krekel and pytest-dev team
Licensed under the MIT License.
https://docs.pytest.org/en/stable/how-to/subtests.html