← Назад ко всем вопросам

Как сделать teardown в PyTest: yield-fixture vs finalizer? Когда что выбирать?

1️⃣ Как кратко ответить

В PyTest для выполнения teardown логики можно использовать yield в фикстурах или метод addfinalizer. yield-фикстуры предпочтительнее, так как они обеспечивают более читаемый и линейный код. addfinalizer используется, когда требуется несколько финализаторов или когда teardown логика зависит от условий, определяемых во время выполнения теста.

2️⃣ Подробное объяснение темы

В тестировании с использованием PyTest часто возникает необходимость в выполнении действий после завершения теста, таких как освобождение ресурсов или очистка данных. Это называется "teardown". PyTest предлагает два основных способа для реализации teardown логики: yield-фикстуры и метод addfinalizer.

Yield-фикстуры

yield-фикстуры позволяют определить как setup, так и teardown логику в одном месте. Это делает код более линейным и легким для понимания.

Пример использования yield-фикстуры:

import pytest
​
@pytest.fixture
def resource():
    # Setup: создаем ресурс
    print("Setup: создаем ресурс")
    resource = "Ресурс"
​
    # Передаем ресурс в тест
    yield resource
​
    # Teardown: освобождаем ресурс
    print("Teardown: освобождаем ресурс")
  • Setup: Выполняется до yield. Здесь создается или настраивается ресурс, который будет использоваться в тесте.
  • Yield: Передает ресурс в тестовую функцию.
  • Teardown: Выполняется после завершения теста. Здесь освобождаются ресурсы или выполняется очистка.

Addfinalizer

Метод addfinalizer используется для добавления функций, которые будут вызваны после завершения теста. Это может быть полезно, если необходимо добавить несколько финализаторов или если teardown логика зависит от условий, определяемых во время выполнения теста.

Пример использования addfinalizer:

import pytest
​
@pytest.fixture
def resource(request):
    # Setup: создаем ресурс
    print("Setup: создаем ресурс")
    resource = "Ресурс"
​
    # Определяем функцию для финализации
    def teardown():
        print("Teardown: освобождаем ресурс")
​
    # Добавляем финализатор
    request.addfinalizer(teardown)
​
    return resource
  • Setup: Аналогично yield-фикстуре, здесь создается ресурс.
  • Addfinalizer: Метод request.addfinalizer(teardown) добавляет функцию teardown в список финализаторов, которые будут вызваны после завершения теста.
  • Teardown: Функция teardown выполняется после завершения теста, освобождая ресурсы.

Когда что выбирать

  • Yield-фикстуры: Используйте, когда teardown логика проста и не зависит от условий, определяемых во время выполнения теста. Они обеспечивают более читаемый и линейный код.
  • Addfinalizer: Используйте, когда требуется несколько финализаторов или когда teardown логика зависит от условий, определяемых во время выполнения теста. Это может быть полезно в сложных сценариях, где необходимо динамически определять, какие действия выполнять после теста.

Оба подхода имеют свои преимущества и могут быть выбраны в зависимости от конкретных требований теста и предпочтений разработчика.

Тема: PyTest
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки