#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