Depurando código Python com segurança usando Nose e iPdb

1

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:

  1. 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_trace no código.
  2. Eventualmente, o programador poderá inserir o set_trace no 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!

você pode gostar também
1 comentário
  1. Yuri Malheiros Diz

    Ó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.

Deixe uma resposta

Seu endereço de email não será publicado.