Сообщить об ошибке.

Переопределение фикстур в тестах модуля pytest в Python

Переопределение фикстур на различных уровнях

В относительно большом наборе тестов фреймворка 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'

Обратите внимание, что значение фикстуры может быть переопределено таким способом, деже если тесты не используют фикстуру напрямую (смотрите Автоматические фикстуры).