pytest fixture-重寫各種級別的fixture

2022-03-18 14:24 更新

在相對較大的測試套件中,您很可能需要用本地定義的??fixture??覆蓋全局或根??fixture??,以保持測試代碼的可讀性和可維護性。

覆蓋文件夾(conftest)級別上的fixture

假設(shè)測試文件結(jié)構(gòu)是:

tests/
    __init__.py

    conftest.py
        # content of tests/conftest.py
        import pytest

        @pytest.fixture
        def username():
            return 'username'

    test_something.py
        # content of tests/test_something.py
        def test_username(username):
            assert username == 'username'

    subfolder/
        __init__.py

        conftest.py
            # content of tests/subfolder/conftest.py
            import pytest

            @pytest.fixture
            def username(username):
                return 'overridden-' + username

        test_something.py
            # content of tests/subfolder/test_something.py
            def test_username(username):
                assert username == 'overridden-username'

正如您所看到的,具有相同名稱的??fixture??可以為特定的測試文件夾級別重寫。請注意,可以從上面示例中使用的覆蓋??fixture??輕松訪問基?本?fixture??或超級??fixture??

覆蓋測試模塊級別上的fixture

假設(shè)測試文件結(jié)構(gòu)是:

tests/
    __init__.py

    conftest.py
        # content of tests/conftest.py
        import pytest

        @pytest.fixture
        def username():
            return 'username'

    test_something.py
        # content of 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
        # content of 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'

在上面的示例中,可以為某些測試模塊重寫具有相同名稱的?fixture?。

覆蓋具有直接測試參數(shù)化的fixture

假設(shè)測試文件結(jié)構(gòu)是:

tests/
    __init__.py

    conftest.py
        # content of tests/conftest.py
        import pytest

        @pytest.fixture
        def username():
            return 'username'

        @pytest.fixture
        def other_username(username):
            return 'other-' + username

    test_something.py
        # content of tests/test_something.py
        import pytest

        @pytest.mark.parametrize('username', ['directly-overridden-username'])
        def test_username(username):
            assert username == 'directly-overridden-username'

        @pytest.mark.parametrize('username', ['directly-overridden-username-other'])
        def test_username_other(other_username):
            assert other_username == 'other-directly-overridden-username-other'

在上面的示例中,??fixture??值被測試參數(shù)值覆蓋。請注意,即使測試沒有直接使用??fixture??的值(在函數(shù)原型中沒有提到它),也可以通過這種方式重寫它。

用非參數(shù)化fixture覆蓋參數(shù)化fixture

假設(shè)測試文件結(jié)構(gòu)是:

tests/
    __init__.py

    conftest.py
        # content of tests/conftest.py
        import pytest

        @pytest.fixture(params=['one', 'two', 'three'])
        def parametrized_username(request):
            return request.param

        @pytest.fixture
        def non_parametrized_username(request):
            return 'username'

    test_something.py
        # content of tests/test_something.py
        import pytest

        @pytest.fixture
        def parametrized_username():
            return 'overridden-username'

        @pytest.fixture(params=['one', 'two', 'three'])
        def non_parametrized_username(request):
            return request.param

        def test_username(parametrized_username):
            assert parametrized_username == 'overridden-username'

        def test_parametrized_username(non_parametrized_username):
            assert non_parametrized_username in ['one', 'two', 'three']

    test_something_else.py
        # content of tests/test_something_else.py
        def test_username(parametrized_username):
            assert parametrized_username in ['one', 'two', 'three']

        def test_username(non_parametrized_username):
            assert non_parametrized_username == 'username'

在上面的例子中,參數(shù)化的??fixture??被非參數(shù)化版本覆蓋,非參數(shù)化的??fixture??被某個測試模塊的參數(shù)化版本覆蓋。這同樣適用于測試文件夾級別。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號