установка точек останова с помощью опции Nosetests --pdb


88

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

Тем не менее, носовые тесты полезны, поскольку они позволяют проводить тесты, основанные на относительном импорте (т. Е. Тесты в пакете).

Как я могу установить точки останова перед выполнением тестов? В настоящее время я использую:

python -m pdb /path/to/my/nosetests testfile.py

Это решение не подходит. Нозетесты мешают выводу pdb, и мои элементы управления с клавиатуры (например, клавиши со стрелками) не работают.

Используя import pdb; pdb.set_trace () может показаться хорошей идеей, однако ностесты блокируют мой доступ к консоли pdb.

Ответы:


120

Можете добавить

import pdb; pdb.set_trace() 

в любом месте вашего источника, которое вы хотите остановить в отладчике.

Убедитесь, что вы прошли -sк носу, чтобы он не захватил stdout.


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

26
Добавьте флаг -s в тесты носа, чтобы предотвратить захват stdout, и вы сможете использовать pdb.
Нед Батчелдер,

1
Не работает. Используйте это:from nose.tools import set_trace; set_trace()
anilbey

143

Даже лучше, чем не забывать использовать, -s- это использовать set_traceвариант, который поставляется с Nose. Добавить

from nose.tools import set_trace; set_trace()

куда бы вы ни хотели проникнуть в отладчик. О перенаправлении stdin / out позаботятся вы. Единственный странный побочный эффект, с которым я столкнулся, - это невозможность перезапустить ваш код из pdb (используя run) во время отладки во время пробежки по носу.


Есть ли на это документация? Как выйти из петли?
AJ

Вы имеете в виду, как ориентироваться, когда у вас есть pdb ? Я уверен, что есть документы, но, как мне кажется, s" nвходит " в вызов функции, переходит к "следующему" оператору, uперемещается "вверх" по стеку и dперемещается "вниз". Вы можете использовать bдля установки точек останова и cдля «продолжения» и выхода из пошагового отладчика. Надеюсь, это поможет!
Мэтт Луонго

4
Это должен быть принятый ответ. Он обеспечивает все обычные функции исходной команды pdb.set_trace ().
tbm

Есть ли возможность для версии ipython / ipdb?
gerrit

5

Если у вас есть ipython , для неограниченного использования возможностей:

import ipdb; ipdb.set_trace() 

* безграничная привлекательность: как в ipython - автозаполнение, раскраска и т. д.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.