Можно ли отлаживать отладчик python при использовании py.test?
Я использую py.test для модульного тестирования моей программы python. Я хочу отлаживать свой тестовый код с отладчиком python обычным способом (под которым я имею в виду pdb.set_trace() в коде), но я не могу заставить его работать.
Помещение pdb.set_trace() в код не работает (вызывает IOError: чтение из stdin во время вывода). Я также попытался запустить py.test с параметром -pdb, но это, похоже, не делает трюк, если я хочу изучить, что происходит до моего утверждения. Он прерывается, когда утверждение терпит неудачу, и переход от этой линии означает завершение программы.
Кто-нибудь знает способ получения отладки или отладки, а py.test просто не предназначен для совместной работы?
Ответы
Ответ 1
it real simple: поставьте assert 0
, где вы хотите начать отладку своего кода и запустить свои тесты с помощью:
py.test --pdb
сделано:)
В качестве альтернативы, если вы используете pytest-2.0.1 или выше, также есть помощник pytest.set_trace()
, который вы можете поместить в любом месте тестового кода. Вот docs. Он позаботится о том, чтобы внутреннее отключение захвата перед отправкой в командную строку отладчика pdb.
Ответ 2
Я обнаружил, что я могу запустить py.test с отключенным захватом, а затем использовать pdb.set_trace(), как обычно.
> py.test --capture=no
============================= test session starts ==============================
platform linux2 -- Python 2.5.2 -- pytest-1.3.3
test path 1: project/lib/test/test_facet.py
project/lib/test/test_facet.py ...> /home/jaraco/projects/project/lib/functions.py(158)do_something()
-> code_about_to_run('')
(Pdb)
Ответ 3
Самый простой способ - использовать механизм py.test для создания точки останова
http://pytest.org/latest/usage.html#setting-a-breakpoint-aka-set-trace
import pytest
def test_function():
...
pytest.set_trace() # invoke PDB debugger and tracing
Или, если вы хотите отлаживать отладчик pytest
как однострочный, измените import pdb; pdb.set_trace()
на import pytest; pytest.set_trace()
Ответ 4
Я не знаком с py.test, поставьте для unittest, вы делаете следующее. Возможно, py.test похож:
В тестовом модуле (mytestmodule.py):
if __name__ == "__main__":
unittest.main(module="mytestmodule")
Затем запустите тест с помощью
python -m pdb mytestmodule.py
Вы получите интерактивную оболочку pdb.
Глядя на документы, похоже, что py.test имеет параметр командной строки --pdb
:
http://codespeak.net/py/dist/test/features.html