Spec-Zone.ru › pytest

Как использовать подтесты

Добавлено в версии 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API