Сбой теста после teardown_method, выполненного в pytest - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь выяснить, как написать плагин pytest, который можно использовать для провала теста после его запуска (для тех, кто хочет больше контекста, это связано с astropy / pytest-openfiles # 28 ). Давайте рассмотрим следующий простой тестовый файл:

class TestClass:

    def setup_method(self, method):
        print("In setup_method")

    def teardown_method(self, method):
        print("In teardown_method")

    def test_simple(self):
        print("In test")

Теперь я могу определить файл conftest.py, который содержит:

def pytest_runtest_teardown(item, nextitem):
    print("In pytest_runtest_teardown")

В этом хуке я могу выполнять проверки - например в случае, если меня интересует, мы проверяем наличие открытых файловых дескрипторов. Однако проблема в том, что этот хук запускается после setup_method и после самого теста (test_simple), но до teardown_method:

% pytest test.py -vs
...
collected 1 item                                                                                                                                      

test.py::TestClass::test_simple In setup_method
In test
PASSEDIn pytest_runtest_teardown
In teardown_method

Я рассмотрел вместо этого использование:

def pytest_runtest_makereport(item, call):

    if call.when != 'teardown':
        return

    print("In pytest_runtest_makereport")

, который выполняется после teardown_method, но в этот момент, если я вызову исключение, pytest выдаст INTERNALERROR и все равно будет считать тест успешным.

Есть ли способ потерпеть неудачу / Ошибка теста после teardown_method был вызван?

1 Ответ

0 голосов
/ 16 января 2020

После того, как test_simple закончится, Pytest примет во внимание, что все, что теперь принадлежит, будет выходить за рамки теста. Вы можете добавить @pytest.fixture аннотацию к функции, это предоставит вам pytest функцию настройки и удаления. Сам тест считается задницей пройденным, но не всем набором. TestClass будет помечено как сбой, за исключением того, что teardown_method

class TestClass:

    @pytest.fixture
    def run_for_test(self):
        self.setup_method()
        yield
        self.teardown_method()

    def setup_method(self, method):
        print("In setup_method")

    def teardown_method(self, method):
        print("In teardown_method")
        # just for the example
        if not method:
            raise AssertionError

    def test_simple(self):
        print("In test")

Выход

In setup_method
.In test
In teardown_method
>           raise AssertionError
E           AssertionError
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...