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

В чем разница между Yield и Return в PyTest

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

В PyTest yield используется в фикстурах для выполнения кода после теста, а return — для передачи значения из фикстуры в тест. yield позволяет разделить код на части до и после теста, в то время как return завершает выполнение фикстуры после передачи значения.

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

В PyTest фикстуры — это функции, которые подготавливают тестовую среду и предоставляют необходимые данные для тестов. Они помогают управлять состоянием и ресурсами, которые могут быть необходимы для выполнения тестов. В фикстурах PyTest можно использовать как yield, так и return, но они имеют разные цели и поведение.

Использование return в фикстурах

Когда в фикстуре используется return, это означает, что фикстура завершает свою работу после передачи значения тесту. Это значение может быть использовано в тесте для выполнения проверок или других операций.

Пример фикстуры с return:

import pytest
​
@pytest.fixture
def sample_data():
    # Подготовка данных
    data = {"key": "value"}
    # Возврат данных в тест
    return data
​
def test_example(sample_data):
    # Использование данных в тесте
    assert sample_data["key"] == "value"
  • @pytest.fixture: Декоратор, который определяет функцию как фикстуру.
  • sample_data: Имя фикстуры, которая подготавливает данные.
  • return data: Возвращает подготовленные данные в тест.
  • test_example: Тестовая функция, использующая данные из фикстуры.

Использование yield в фикстурах

yield позволяет разделить фикстуру на две части: код, который выполняется до теста, и код, который выполняется после теста. Это полезно для освобождения ресурсов или выполнения действий, которые должны произойти после завершения теста.

Пример фикстуры с yield:

import pytest
​
@pytest.fixture
def resource():
    # Подготовка ресурса
    res = open("file.txt", "w")
    # Передача ресурса в тест
    yield res
    # Освобождение ресурса после теста
    res.close()
​
def test_resource(resource):
    # Использование ресурса в тесте
    resource.write("Hello, World!")
    resource.flush()
  • @pytest.fixture: Декоратор, который определяет функцию как фикстуру.
  • resource: Имя фикстуры, которая подготавливает и освобождает ресурс.
  • yield res: Передает ресурс в тест и приостанавливает выполнение фикстуры.
  • res.close(): Код, который выполняется после завершения теста для освобождения ресурса.
  • test_resource: Тестовая функция, использующая ресурс из фикстуры.

Зачем это нужно

Использование yield в фикстурах позволяет управлять жизненным циклом ресурсов, обеспечивая их корректное освобождение после использования. Это особенно важно для работы с файлами, сетевыми соединениями и другими ресурсами, которые требуют явного закрытия или очистки. return же используется, когда необходимо просто передать данные в тест без дополнительных действий после его выполнения.

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

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

Твои заметки