Можно ли как-то отлаживать с помощью отладчика python при использовании py.test? - PullRequest
57 голосов
/ 21 апреля 2010

Я использую py.test для модульного тестирования моей программы на Python. Я хочу отладить свой тестовый код с помощью отладчика Python обычным способом (под словом я имею в виду pdb.set_trace () в коде), но я не могу заставить его работать.

Помещение pdb.set_trace () в код не работает (вызывает IOError: чтение из stdin, пока вывод получен). Я также попытался запустить py.test с опцией --pdb, но, похоже, это не сработало, если я хочу изучить, что происходит до моего утверждения. Он прерывается, когда утверждение не выполняется, и переход от этой строки означает завершение программы.

Кто-нибудь знает способ получить отладку, или отладка и py.test просто не должны быть вместе?

Ответы [ 4 ]

83 голосов
/ 15 июля 2010

это действительно просто: поместите assert 0, где вы хотите начать отладку в своем коде, и запустите свои тесты с:

py.test --pdb 

сделано :)

В качестве альтернативы, если вы используете pytest-2.0.1 или выше, есть также помощник pytest.set_trace(), который вы можете поместить в любом месте вашего тестового кода. Вот документы . Прежде чем отправлять вас в командную строку отладчика pdb, он позаботится о том, чтобы отключить захват.

31 голосов
/ 05 августа 2010

Я обнаружил, что могу запустить 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)
18 голосов
/ 11 июля 2013

Самый простой способ - использовать механизм 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()

1 голос
/ 21 апреля 2010

Я не знаком с 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

...