Фон
Я запускаю py.test с fixture в файле conftest. Вы можете увидеть код ниже (все работает нормально):
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"
Проблема
Теперь я хочу иметь возможность пропустить некоторые тесты, которые не относятся к моему текущему тестированию. В моем примере я запускаю тесты для iOS или Android (это только для демонстрационных целей и может быть любым другим выражением).
К сожалению, я не могу получить (мое внешнее приспособление) platform_external
в операторе skipif
. Когда я запускаю приведенный ниже код, я получаю следующее исключение: NameError: name 'platform_external' is not defined
. Я не знаю, является ли это ошибкой py.test, так как приборы, определенные локально, работают.
надстройка для 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')
Итак, я подумал, что просто создам свой собственный декоратор, просто чтобы убедиться, что он не получит фикстуры в качестве параметров:
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')
Вопрос
Как я могу определить прибор в conftest файле и использовать его, чтобы (условно) пропустить тест?