[Python] How to skip a pytest using an external fixture?

Discussão em 'Python' iniciado por Stack, Maio 27, 2025.

  1. Stack

    Stack Membro Participativo

    Background


    I am running a py.test with a fixture in a conftest file. You can see the code below(this all works fine):

    example_test.py

    import pytest

    @pytest.fixture
    def platform():
    return "ios"

    @pytest.mark.skipif("platform == 'ios'")
    def test_ios(platform):
    if platform != 'ios':
    raise Exception('not ios')

    def test_android_external(platform_external):
    if platform_external != 'android':
    raise Exception('not android')


    conftest.py

    import pytest

    @pytest.fixture
    def platform_external():
    return "android"

    Problem


    Now I want to be able to skip some tests that do not apply to my current test-run. In my example I am running tests either for iOS or Android (This is just for demonstration purposes only and could be any other expression).

    Unfortunately I cannot get ahold of (my externally defined fixture) platform_external in the skipif statement. When I run the code below I receive the following exception: NameError: name 'platform_external' is not defined. I don't know if this is a py.test bug as locally defined fixtures are working.

    add-on for example_test.py

    @pytest.mark.skipif("platform_external == 'android'")
    def test_android(platform_external):
    """This test will fail as 'platform_external' is not available in the decorator.
    It is only available for the function parameter."""
    if platform_external != 'android':
    raise Exception('not android')


    So I thought I will just create my own decorator, just to see that it won't receive the fixtures as parameters:

    from functools import wraps

    def platform_custom_decorator(func):
    @wraps(func)
    def func_wrapper(*args, **kwargs):
    return func(*args, **kwargs)
    return func_wrapper

    @platform_custom_decorator
    def test_android_2(platform_external):
    """This test will also fail as 'platform_external' will not be given to the
    decorator."""
    if platform_external != 'android':
    raise Exception('not android')

    Question


    How can I define a fixture in a conftest file and use it to (conditionally) skip a test?

    Continue reading...

Compartilhe esta Página