альтернатива pytest.config.getoption терпит неудачу

#python #python-3.x #pytest

#python #python-3.x #pytest

Вопрос:

Моя настройка такова, что; pytest test.py ничего не выполняется во время pytest --first-test test.py выполнения целевой функции test_skip .

Чтобы определить, следует ли проводить определенный тест или нет, это то, что я использовал:

 skip_first = pytest.mark.skipif(
        not (
                pytest.config.getoption("--first-test")
                or os.environ.get('FULL_AUTH_TEST')
                ), reason="Skipping live"
)

@skip_first
def test_skip():
    assert_something
  

Теперь, pytest.config.getoption когда он устарел, я пытаюсь обновить свой код. Это то, что я написал:

 @pytest.fixture
def skip_first(request):
    def _skip_first():
        return pytest.mark.skipif(
            not (
                request.config.getoption("--first-test")
                or os.environ.get('FULL_AUTH_TEST')),
            reason="Skipping"
            )
    return _skip_first()

# And, to call:

def test_skip(skip_first):
   assert 1==2
  

Однако, независимо от того, делаю ли я pytest test.py или pytest --first-test test.py , test_skip всегда будет выполняться. Но, похоже, skip_first работает нормально — вставка инструкции print показывает, skip_first = MarkDecorator(mark=Mark(name='skipif', args=(False,), kwargs={'reason': 'Skipping first'})) когда --first-test задано, и аргументы = (True), когда задано. (То же самое наблюдалось при использовании первой настройки).

Я что-то упускаю?? Я даже пытался вернуть функцию _skip_first вместо ее вывода в def skip_first , но никакой разницы.

При использовании тестового класса в руководстве указано, что нам нужно использовать @pytest.mark.usefixtures("fixturename") но это также оказалось бесполезным (с классами).

Идеи? Это моя система: platform linux -- Python 3.6.7, pytest-4.0.2, py-1.7.0, pluggy-0.8.0

Ответ №1:

Для того, чтобы вызвать SKIP из прибора, вы должны вызвать pytest.skip . Вот пример использования вашего кода выше:

 import os

import pytest

@pytest.fixture
def skip_first(request):
    if (
            request.config.getoption("--first-test")
            or os.environ.get('FULL_AUTH_TEST')
    ):
        raise pytest.skip('Skipping!')

# And, to call:

def test_skip(skip_first):
   assert 1==2
  

Если вы хотите, вы можете практически заменить свой исходный код, выполнив:

 @pytest.fixture
def skip_first_fixture(request): ...

skip_first = pytest.mark.usefixtures('skip_first_fixture')

@skip_first
def test_skip(): ...
  

Вот выполнение, показывающее, что это работает:

 $ pytest t.py -q
F                                                                        [100%]
=================================== FAILURES ===================================
__________________________________ test_skip ___________________________________

skip_first = None

    def test_skip(skip_first):
>      assert 1==2
E      assert 1 == 2
E        -1
E         2

t.py:16: AssertionError
1 failed in 0.03 seconds


$ pytest t.py --first-test -q
s                                                                        [100%]
1 skipped in 0.01 seconds