pytest: как пропустить тестовые сценарии и сразу перейти к очистке, если что-то идет не так в настройке? - PullRequest
5 голосов
/ 18 января 2020

Я понимаю, что в pytest предпочтительным способом настройки и очистки является использование yield, например

class TestSomething():
    @pytest.fixture(scope="class", autouse=True)
    def setup_cleanup(self, request):
        ...
        yield
        ...

    def test_something(self):
        ...

Проблема в том, что в части установки произошел сбой до yield произойдет, код очистки не получит шанса на запуск.

Возможно ли, что при возникновении какого-либо критического сбоя в настройке все тестовые сценарии пропускаются, и управление переходит к очистке (после yield в методе setup_cleanup)?

1 Ответ

4 голосов
/ 19 января 2020

setup_cleanup вызывает тестовую функцию, но она все еще является функцией. Исключение, возникшее на любом шаге, предотвратит возбуждение остальной части.

Обходным путем будет использование try finally. Это позволит запустить тест и демонтаж без проглатывания исключения

@pytest.fixture(scope="class", autouse=True)
def setup_cleanup(self, request):
    try:
        print('Setup')
        raise Exception("Setup Exception")
        yield
    finally:
        print('Teardown')

def test_example_test(self):
    print('Test')

За исключением

Setup
Teardown

test setup failed
self = <ExampleTest.TestSomething object at 0x045E6230>
request = <SubRequest 'setup_cleanup' for <Function test_something>>

    @pytest.fixture(scope="class", autouse=True)
    def setup_cleanup(self, request):
        print()
        try:
            print('Setup')
>           raise Exception("Setup Exception")
E           Exception: Setup Exception

И без

Setup
.Test
Teardown
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...