definindo pontos de interrupção com a opção nosetests --pdb

88

nosetests --pdbdeixe-me parar em caso de erro ou falha, mas é tarde demais para minhas necessidades. Percorrer o código durante a execução me ajuda a depurar onde está o problema.

No entanto, nosetests são úteis, pois permitem testes que dependem de importações relativas (ou seja, testes em um pacote).

Como posso definir pontos de interrupção antes que os testes sejam executados? Atualmente estou usando:

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

Esta solução não é adequada. Nosetests interferem com a saída PDB e os controles do meu teclado (por exemplo, teclas de seta) estão quebrados.

Usando import pdb; pdb.set_trace () parece uma boa idéia, entretanto nosetests está bloqueando meu acesso ao console PDB.

Devin
fonte

Respostas:

118

Você pode adicionar

import pdb; pdb.set_trace() 

em qualquer lugar em sua fonte que você deseja parar no depurador.

Certifique-se de passar -spara o nariz para que não capture stdout.

Ned Batchelder
fonte
Eu estava prestes a adicionar isso à minha pergunta. Esta também não é uma solução aceitável. Ao usar isso com nosetests, é aparente que é literalmente inutilizável, pois o acesso ao console PDB é rastreado e nenhum comando PDB pode ser executado.
Devin
25
Adicione o sinalizador -s aos nosetests para evitar que capture stdout, e você poderá usar o pdb perfeitamente.
Ned Batchelder
1
Não funciona. Use isto:from nose.tools import set_trace; set_trace()
anilbey
142

Ainda melhor do que lembrar de usar -sé usar a set_tracevariante que vem com o Nose. Adicionar

from nose.tools import set_trace; set_trace()

onde você quiser entrar no depurador. O redirecionamento stdin / out será feito para você. O único efeito colateral estranho que encontrei é a incapacidade de reiniciar seu código de dentro do pdb (usando run) durante a depuração durante uma corrida pelo nariz.

Matt Luongo
fonte
Existe alguma documentação disso? Como sair do circuito?
AJ de
Você quer dizer como navegar depois de pdbcorrer? Tenho certeza de que há documentos, mas no topo da minha cabeça- s"entra em" uma chamada de função, nvai para a instrução "próxima", umove "para cima" na pilha e dmove "para baixo". Você pode usar bpara definir pontos de interrupção e c"continuar" e sair do depurador de revisão. Espero que ajude!
Matt Luongo
4
Esta deve ser a resposta aceita. Ele fornece todas as funcionalidades regulares do comando pdb.set_trace () original.
tbm
Alguma possibilidade de uma versão ipython / ipdb disso?
gerrit de
5

Se você tiver ipython , para uso de grandiosidade ilimitada:

import ipdb; ipdb.set_trace() 

* maravilha ilimitada: assim como ipython - preenchimento automático, coloração etc.

Shubham Chaudhary
fonte
1

Se você estiver usando o pytest , você pode usar

import pytest; pytest.set_trace()

Veja a documentação .

gerrit
fonte