Как я могу заставить pytest не ловить исключения - PullRequest
3 голосов
/ 17 июня 2020

Когда я запускаю pytest в отладчике vscode с установленным флажком «Неперехваченные исключения» и есть ошибки теста, неперехваченных исключений не происходит, потому что pytest перехватывает их и отправляет отчеты о результатах. Как я могу сказать pytest, чтобы исключение происходило просто так? Чтобы я мог поймать их в отладчике vscode?

В основном мне нужно поведение, подобное --pdb, но я хочу, чтобы он запускал отладчик vscode, а не pdb. Флаг --pdbcls звучит многообещающе, но не уверен, что <module>:<class> ему дать.

Примечание: Обычно я бы просто отключил его при возникновении исключений. Но в нашем коде есть множество исключений, которые возникают, но обнаруживаются, поэтому этот параметр бесполезен.

Вот видео, в котором vscode не срабатывает при срабатывании AssertionError во время отладки теста pytest:

enter image description here

@rioV8's suggestion below does break the on the exception, but for some reason there is no stack which means you can't debug from there:

введите описание изображения здесь

Мне, должно быть, чего-то не хватает, потому что, похоже, эта возможность никому не нужна. Но мне это кажется абсолютно c самой простой вещью, которую можно сделать с помощью тестовой среды и отладчика: как разработчик я хочу отлаживать с момента возникновения ошибки.

Должен быть совершенно другим способом, которым люди используют отладчик с pytest, это очевидная техника, которую я упускаю.

Ответы [ 2 ]

3 голосов
/ 24 июня 2020

Я поднял проблему с pytest, и они сделали предложение, которое работает. Добавьте это в свой conftest.py:

if os.getenv('_PYTEST_RAISE', "0") != "0":

    @pytest.hookimpl(tryfirst=True)
    def pytest_exception_interact(call):
        raise call.excinfo.value

    @pytest.hookimpl(tryfirst=True)
    def pytest_internalerror(excinfo):
        raise excinfo.value

Затем в вашем "request": "test" launch. json вы можете переключить эту переменную env:

    {
        "name": "Debug Tests",
        "type": "python",
        "request": "test",
        "console": "integratedTerminal",
        "justMyCode": true,
        "env": {
            "_PYTEST_RAISE": "1"
        },
    }

Если _PYTEST_RAISE установлено и вы проверяете только поле Неперехваченные исключения , вы сломаетесь прямо там, где неперехваченное исключение возникло не ранее.

Я также открыл проблему с debugpy, и они были идеи, но решения сегодня нет. Уловка _PYTEST_RAISE работает на 100%, решает эту проблему для меня.

0 голосов
/ 22 июня 2020

Поведение не идентично, но средство запуска тестов останавливается на неперехваченном исключении.

Добавьте файл conftest.py в каталог с вашими тестами.

# conftest.py
def pytest_exception_interact(node, call, report):
  print( call.excinfo.traceback[0] )
  pass

Это добавляет ловушку для любых неперехваченных исключений.

Поместите точку останова в строку с pass.

Затем Debug тест.

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

test_example.py F  File 'path\\test_example.py':4 in test_example
  assert False

И отладчик останавливается на строке pass.

Вы можете сделать эту функцию перехвата по своему усмотрению.

...