Передача параметров в fixture Pytest: работа с DLL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

В pytest может быть создана фабрика фикстур для динамического передачи параметров. Определите функцию фикстуры таким образом, чтобы она принимала параметры через request.param. Используйте декоратор @pytest.mark.parametrize со значением indirect=True для передачи параметров следующим образом:

Python
Скопировать код
import pytest

@pytest.fixture
def parameterized_fixture(request):
    # Обработка параметров: безопасно и надежно
    return setup_with(request.param)

@pytest.mark.parametrize('parameterized_fixture', ['value'], indirect=True)
def test_example(parameterized_fixture):
    # Если тест не прошел, в нем что-то особенное
    assert process(parameterized_fixture) == expected_outcome

В данном примере, строка 'value' будет передана как параметр в parameterized_fixture, который затем используется в test_example. Для более сложных сценариев можно использовать следующую схему:

Python
Скопировать код
@pytest.fixture
def configurable_fixture(request):
    # request.param – это ключ к настройке. Непредсказуемо, что получится в итоге.
    config = {'param': request.param}
    return create_object_with_config(config)

values_for_test = [('setting1',), ('setting2',), ('setting3',)]
@pytest.mark.parametrize('configurable_fixture', values_for_test, indirect=True)
def test_configurable(configurable_fixture):
    # Проверяем состояние, как мою последовательность посещений спортзала.
    assert configurable_fixture.is_valid()
Кинга Идем в IT: пошаговый план для смены профессии

Углубимся в использование параметризованных фикстур

Оптимизация выполнения теста с помощью опциональных аргументов

Вы можете использовать опциональные аргументы в фикстурах для оптимизации выполнения тестов:

Python
Скопировать код
@pytest.fixture
def smart_fixture(request):
    # Параметр request.param здесь необязателен, как ненужный наставник в спортзале
    param = getattr(request, 'param', 'default')
    return complex_setup(param)

Сбор и обновление ссылок

Для эффективного управления состоянием в сложных тестовых сценариях можно использовать класс внутри фикстуры:

Python
Скопировать код
class RadioStation:
    def __init__(self, frequency):
        # Настройка выбранной радиостанции
        self.frequency = frequency
    # Раздача ваших любимых хитов...

@pytest.fixture
def radio_station(request):
    return RadioStation(request.param)

@pytest.mark.parametrize('radio_station', ['96.7'], indirect=True)
def test_station_listener(radio_station):
    # Во время тестирования ни одна радиоволна не пострадала
    assert radio_station.frequency == '96.7' # Обновление частоты – легко и эффективно

Использование замыканий для настройки фикстур

Замыкания внутри фикстур могут обеспечивать именованные параметры, улучшая контроль над созданием объектов и делая конфигурацию тестов гибкее:

Python
Скопировать код
def my_fixture_setup(parameter):
    def fixture():
        return setup_object_with(parameter)
    return fixture

@pytest.fixture
def closure_fixture(request):
    return my_fixture_setup(request.param)()

@pytest.mark.parametrize('closure_fixture', ['parameters'], indirect=True)
def test_closure(closure_fixture):
    # PyTests – ярки, замыкания – модни, тесты замечательны!
    assert closure_fixture.has_setup_correctly()

Глубокая настройка фикстур

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

Python
Скопировать код
@pytest.fixture
def dynamic_fixture(request):
    def configure_test(env):
        return setup_env_for_tests(env, request.param)
    return configure_test

@pytest.mark.parametrize('dynamic_fixture', ['production'], indirect=True)
def test_dynamic_environment(dynamic_fixture):
    test_env = dynamic_fixture('QA')
    # Здесь test_env настраивается и спрашивает: "Вы готовы встретиться со мной?"
    assert test_env.is_ready_for_tests()

Визуализация

Фикстура без параметров, как радио:

Python
Скопировать код
@pytest.fixture
def radio_station():
    return "Стандартная частота 🎶"

У нас всегда настроена одна и та же станция.

Фикстура с параметром, как настраиваемое радио:

Python
Скопировать код
@pytest.fixture
def radio_station(request):
    return f"Частота {request.param} 🎵"

И, применяя pytest.mark.parametrize, мы можем выбрать любую станцию по вкусу! 🎚️🎶

Python
Скопировать код
@pytest.mark.parametrize('radio_station', ['89.1', '102.2'], indirect=True)
def test_radio(radio_station):
    assert radio_station in ['Частота 89.1 🎵', 'Частота 102.2 🎵']

Бонусы параметризации

Оптимизация настройки тестов

Даже фикстуры стремятся к идеалу. Используем на них декораторы такие как @fixture и @parametrize для удобства и быстроты настройки.

Унифицированное управление журналами тестов

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

Широкие возможности настройки

Розы красные, фиалки синие, тесты гибкие — и благодаря косвенной параметризации, они еще быстрые!

Полезные материалы

  1. Использование фикстур в Pytest — документация — научитесь работать с фикстурами, и многое другое в Pytest.
  2. Параметризация тестов — документация по Pytest — здесь параметризация тестов оживает в Pytest.
  3. Тестирование на Python с помощью Pytest: Просто, Быстро, Эффективно и Масштабируемо — Брайан Оккен — это, по сути, библия Pytest без ковчега и моря.
  4. Майкл Том-Винг, Кристи Уилсон — Введение в unit-тестирование на Python с Pytest — PyCon 2016 — YouTube — здесь вы можете увидеть фикстуры Pytest в действии, приготовьте что-то перекусить!
  5. Продвинутые фикстуры Pytest — использование параметризованных фикстур (блог) — место, где фикстуры идут вместе с параметрами.