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

Как передавать fixture в тест: через аргументы функции, autouse, usefixtures?

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

Fixture можно передавать в тест тремя способами: через аргументы функции, используя параметр autouse=True в декораторе @pytest.fixture, или через декоратор @pytest.mark.usefixtures. Аргументы функции позволяют явно указать, какие фикстуры требуются для конкретного теста. autouse=True автоматически применяет фикстуру ко всем тестам в области видимости. @pytest.mark.usefixtures позволяет применять фикстуры к тестам или классам без необходимости указывать их в аргументах функции.

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

В pytest фикстуры — это мощный инструмент для подготовки и очистки тестовой среды. Они позволяют создавать повторно используемые компоненты, которые могут быть применены к тестам для настройки начальных условий или выполнения завершающих действий. Рассмотрим три способа передачи фикстур в тесты.

1. Передача через аргументы функции

Это наиболее явный и часто используемый способ. Фикстура передается в тестовую функцию как аргумент. pytest автоматически распознает и вызывает фикстуру перед выполнением теста.

import pytest
​
@pytest.fixture
def sample_fixture():
    return "Hello, World!"
​
def test_example(sample_fixture):
    # sample_fixture передается как аргумент функции
    assert sample_fixture == "Hello, World!"
  • @pytest.fixture: Декоратор, который определяет функцию как фикстуру.
  • sample_fixture: Имя фикстуры, которое используется как аргумент в test_example.
  • test_example: Тестовая функция, которая принимает sample_fixture как аргумент.

2. Использование autouse=True

Фикстура с параметром autouse=True применяется автоматически ко всем тестам в области видимости (модуль, класс или функция), без необходимости указывать ее в аргументах тестовой функции.

import pytest
​
@pytest.fixture(autouse=True)
def auto_fixture():
    print("Setup code executed")
​
def test_one():
    # auto_fixture применяется автоматически
    assert True
​
def test_two():
    # auto_fixture также применяется автоматически
    assert True
  • autouse=True: Параметр, который указывает, что фикстура должна применяться автоматически.
  • auto_fixture: Фикстура, которая выполняется перед каждым тестом в модуле.

3. Использование @pytest.mark.usefixtures

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

import pytest
​
@pytest.fixture
def setup_fixture():
    print("Setup code executed")
​
@pytest.mark.usefixtures("setup_fixture")
def test_example():
    # setup_fixture применяется через декоратор
    assert True
  • @pytest.mark.usefixtures: Декоратор, который указывает, какие фикстуры должны быть применены к тесту.
  • setup_fixture: Фикстура, которая выполняется перед test_example.

Применение и выбор метода

  • Аргументы функции: Используйте, когда результат фикстуры необходим в тесте.
  • autouse=True: Применяйте, когда фикстура должна выполняться для всех тестов в области видимости без явного указания.
  • @pytest.mark.usefixtures: Подходит для случаев, когда фикстура нужна для настройки, но ее результат не используется в тесте.

Каждый из этих методов имеет свои преимущества и может быть выбран в зависимости от конкретных требований теста и структуры проекта.

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

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

Твои заметки