Передача параметров в fixture Pytest: работа с DLL
Быстрый ответ
В pytest может быть создана фабрика фикстур для динамического передачи параметров. Определите функцию фикстуры таким образом, чтобы она принимала параметры через request.param
. Используйте декоратор @pytest.mark.parametrize
со значением indirect=True
для передачи параметров следующим образом:
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
. Для более сложных сценариев можно использовать следующую схему:
@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()
Углубимся в использование параметризованных фикстур
Оптимизация выполнения теста с помощью опциональных аргументов
Вы можете использовать опциональные аргументы в фикстурах для оптимизации выполнения тестов:
@pytest.fixture
def smart_fixture(request):
# Параметр request.param здесь необязателен, как ненужный наставник в спортзале
param = getattr(request, 'param', 'default')
return complex_setup(param)
Сбор и обновление ссылок
Для эффективного управления состоянием в сложных тестовых сценариях можно использовать класс внутри фикстуры:
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' # Обновление частоты – легко и эффективно
Использование замыканий для настройки фикстур
Замыкания внутри фикстур могут обеспечивать именованные параметры, улучшая контроль над созданием объектов и делая конфигурацию тестов гибкее:
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()
Глубокая настройка фикстур
Если вам нужен углубленный уровень настройки фикстур, используйте функциональный подход:
@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()
Визуализация
Фикстура без параметров, как радио:
@pytest.fixture
def radio_station():
return "Стандартная частота 🎶"
У нас всегда настроена одна и та же станция.
Фикстура с параметром, как настраиваемое радио:
@pytest.fixture
def radio_station(request):
return f"Частота {request.param} 🎵"
И, применяя pytest.mark.parametrize
, мы можем выбрать любую станцию по вкусу! 🎚️🎶
@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
для удобства и быстроты настройки.
Унифицированное управление журналами тестов
Все стремятся к вниманию, даже динамически подгружаемые библиотеки. Представьте их списком в параметризации и сделайте их звездами тестового анализа.
Широкие возможности настройки
Розы красные, фиалки синие, тесты гибкие — и благодаря косвенной параметризации, они еще быстрые!
Полезные материалы
- Использование фикстур в Pytest — документация — научитесь работать с фикстурами, и многое другое в Pytest.
- Параметризация тестов — документация по Pytest — здесь параметризация тестов оживает в Pytest.
- Тестирование на Python с помощью Pytest: Просто, Быстро, Эффективно и Масштабируемо — Брайан Оккен — это, по сути, библия Pytest без ковчега и моря.
- Майкл Том-Винг, Кристи Уилсон — Введение в unit-тестирование на Python с Pytest — PyCon 2016 — YouTube — здесь вы можете увидеть фикстуры Pytest в действии, приготовьте что-то перекусить!
- Продвинутые фикстуры Pytest — использование параметризованных фикстур (блог) — место, где фикстуры идут вместе с параметрами.