Я пытаюсь выяснить, как пример кода в документах pytest, использующих маркер приращения для пропуска тестов, найден здесь в разделе "инкрементное тестирование - шаги теста".
IЯ пытаюсь понять, как это работает, так как я хочу изменить его для запуска с немного другим поведением.
Моя конечная цель будет изменить код так, чтобы, если бы у меня был класс с 6 функциями, например, сделатьчто-то любит функции 2 и 3 в случае сбоя 1 и пропуска 5 и 6 в случае сбоя 4, но не в случае сбоя 1.
Код внизу полностью из примера позволяет вам добавить маркер Pytest @pytest.mark.incremental
для тестовой функции или класса.Если в классе, помеченном инкрементным маркером, произойдет сбой, все остальные функции в классе будут пропущены.
Как я понимаю, код в файле conftest.py вызывается при каждом запуске тестовой функции.Я думаю, что pytest_runtest_makereport
запускается после завершения теста, и каким-то образом с помощью 'excinfo' узнает, прошел тест или нет.
Я не совсем понимаю, как работают следующие строки:
parent = item.parent
parent._previousfailed = item
Что такое item
и item.parent
?Почему атрибут parent._previousfailed
имеет значение item
?
pytest_runtest_setup
Проверяет, есть ли item.parent
этот атрибут _previousfailed
и, если это так, не проходит тест.
IЯ запутался относительно того, что передают аргументы элемента и вызова.Я нашел следующее справочное руководство , в котором упоминается тип элемента, но на самом деле мало что проясняется.
Также почему вызываются функции pytest_runtest_makereport
и pytest_runtest_setup
.Являются ли они специальными «ключевыми» именами функций в среде pytest?
# content of conftest.py
import pytest
def pytest_runtest_makereport(item, call):
if "incremental" in item.keywords:
if call.excinfo is not None:
parent = item.parent
parent._previousfailed = item
def pytest_runtest_setup(item):
if "incremental" in item.keywords:
previousfailed = getattr(item.parent, "_previousfailed", None)
if previousfailed is not None:
pytest.xfail("previous test failed (%s)" % previousfailed.name)
# content of test_step.py
import pytest
@pytest.mark.incremental
class TestUserHandling(object):
def test_login(self):
pass
def test_modification(self):
assert 0
def test_deletion(self):
pass
def test_normal():
pass