Как пример кода приращения pytest работает, чтобы пропустить тесты (объект pytest и объекты вызова?) - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь выяснить, как пример кода в документах 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
...