Как напечатать сообщение после захвата исключения в pytest - PullRequest
0 голосов
/ 31 мая 2018

Предположим, этот пример кода:

def test_foo():
    dict = load_dict()
    try:
        value = dict[foo][bar]
    except KeyError:
        print('missing foo or bar')

Если он поднимает KeyError из-за того, что foo или bar не существует, тест не будет выполнен из-за захвата исключения.Если я добавлю raise SystemExit(1), он потерпит неудачу, напечатает сообщение и покажет всю трассировку.

Мой вопрос: как я могу сказать pytest, что если KeyError произошло, это означает, что тест не пройден, так чтоМне не нужно поднимать SystemExit?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Существует функция pytest.fail, которая явно не проходит тест:

import pytest

def test_foo():
    d1 = {'foo': 'bar'}
    try:
        value = d1['baz']
    except KeyError as err:
        pytest.fail('this was unexpected: {}'.format(err))

Однако идиоматическим способом будет использование контекста pytest.raisesМенеджер, который проверяет исключение, вызывается, собирая его для анализа с помощью некоторых удобных утилит:

import pytest

def test_foo():
    d1 = {'foo': 'bar'}
    with pytest.raises(KeyError) as excinfo:
        value = d1['baz']
    assert excinfo.type == KeyError
    assert excinfo.match('baz')

Ознакомьтесь с документами для получения дополнительных примеров.Если вы знакомы с unittest, pytest.raises - это подвеска для unittest.TestCase.assertRaises, а pytest.fail - это подвеска для unittest.TestCase.fail.

0 голосов
/ 31 мая 2018

Вы можете использовать конструктор with pytest.raises:

def test_connection_fails(self,):
    with pytest.raises(KeyError) as excinfo:
        buckets = list_all_buckets()

Тогда вы можете вызвать ошибку, не используя sys.exit

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