Vez ou outra, um teste falha ou dá erro de forma misteriosa. Nestes momentos, o traceback parece inútil e por mais que o programador olhe o código, não consegue enxergar o problema.
Para momentos como este, usar um debugger facilita a identificação do problema ao mesmo tempo em que ajuda a manter o desenvolvedor são. Assim, o programador troca especulações e mudanças aleatórias no código, pela busca de evidências observando o programa sendo executado passo à passo.
Fazer isso em Python é fácil! A linguagem Python já vem com um debugger interativo chamado Pdb (Python DeBugger) que utiliza o interpretador de linha de comando padrão. Isso é ótimo, mas melhor ainda é o iPython, um interpretador de linha de comando altamente turbinado dentre muitas coisas, estende a capacidade do Pdb, adicionando syntax highlight, tab completion e muitas outras vantagens.
Para instalar o iPython e o iPdb, execute:
pip install ipython ipdb
Voltando ao bug misterioso, quando a execução do programa é interrompida por um erro, o interpretador Python imprime um traceback indicando o erro e a linha onde ele se manifestou. Assim, o programador pode ir até o código e inserir o comando na linha anterior para que o iPdb seja acionado na próxima vez que o programa for executado:
import ipdb; ipdb.set_trace()
Após identificar e solucionar o problema, basta remover este código para seguir em frente.
Esta prática, apesar de eficaz, tem alguns inconvenientes:
- Repetir muitas vezes o processo de inserir e remover o comando que ativa debugger é entedidante. O tédio, ou fará o programador evitar este procedimento, ou o deixará displicente, induzindo-o a esquecer o
set_traceno código. - Eventualmente, o programador poderá inserir o
set_traceno código do projeto ao invés do código de teste, correndo o risco de bloquear o servidor de produção se esquecer de removê-lo.
Para evitar estes riscos desnecessários, uma boa estratégia é utilizar a ferramenta de teste Nose com o Plugin Nose-iPdb:
pip install nose git+http://github.com/flavioamieiro/nose-ipdb.git
Desta forma, você pode executar seus testes normalmente, deixando que o Nose acione o iPdb caso ocorra um erro:
nosetests --ipdb
Ou caso um teste falhe:
nosetests --ipdb-failure
O Plugin Nose-iPdb é fortemente baseado no Plugin Debug que já vem com o Nose. A diferença é que o Nose-iPdb disponibiliza todas as comodidades das extensões que o iPython agrega ao Python Debugger.
[]‘s!








#1 por Yuri Malheiros - 21 de julho de 2010 em 14:13
Ótima dica. Eu já usava o nosetests, mas não conhecia esse plugin, acho que ele vai cair como uma luva e nunca mais eu esquecerei um set_trace num código.