В относительно большом наборе тестов фреймворка pytest
, чтобы код теста оставался читабельным и удобным в сопровождении, скорее всего, потребуется переопределить глобальную или корневую фикстуру локально определенной.
Переопределять фикстуры можно в файлах conftest.py
, расположенных в каталогах на уровень ниже:
tests/ __init__.py conftest.py # содержание файла tests/conftest.py import pytest @pytest.fixture def username(): """Фикстура верхнего уровня""" return 'username' test_something.py # содержание файла tests/test_something.py def test_username(username): assert username == 'username' subfolder/ __init__.py conftest.py # содержание файла tests/subfolder/conftest.py import pytest @pytest.fixture def username(username): """Переопределение фикстуры верхнего уровня""" return 'overridden-' + username test_something.py # содержание файла tests/subfolder/test_something.py def test_username(username): # тестируем переопределение assert username == 'overridden-username'
Из кода можно сделать вывод, что фикстура с одним и тем же именем может быть переопределена на уровне конкретного подкаталога. При этом "базовая" фикстура будет доступна в переопределенной фикстуре.
Пример показывает, как можно переопределить фикстуру с одним и тем же именем в конкретном тестовом модуле.
tests/ __init__.py conftest.py # содержание файла tests/conftest.py import pytest @pytest.fixture def username(): return 'username' test_something.py # содержание файла tests/test_something.py import pytest @pytest.fixture def username(username): """Переопределение фикстуры верхнего уровня""" return 'overridden-' + username def test_username(username): # тестируем переопределение assert username == 'overridden-username' test_something_else.py # содержание файла tests/test_something_else.py import pytest @pytest.fixture def username(username): """Переопределение фикстуры верхнего уровня""" return 'overridden-else-' + username def test_username(username): # тестируем переопределение assert username == 'overridden-else-username'
В этом варианте значение фикстуры переопределяется значением параметра.
tests/ __init__.py conftest.py # содержание файла tests/conftest.py import pytest @pytest.fixture def username(): """Базовая фикстура""" return 'username' @pytest.fixture def other_username(username): """Переопределенная базовая фикстура""" return 'other-' + username test_something.py # содержание файла tests/test_something.py import pytest # переопределяем базовую фикстуру `username()` # в передаваемых параметрах к тесту @pytest.mark.parametrize('username', ['directly-overridden-username']) def test_username(username): # тестируем переопределение параметрами assert username == 'directly-overridden-username' # переопределяем базовую фикстуру `username()` @pytest.mark.parametrize('username', ['directly-overridden-username-other']) # обратите внимание, что передается переопределенная фикстура def test_username_other(other_username): # тестируем переопределение параметрами assert other_username == 'other-directly-overridden-username-other'
Обратите внимание, что значение фикстуры может быть переопределено таким способом, деже если тесты не используют фикстуру напрямую (смотрите Автоматические фикстуры).