establecer puntos de interrupción con la opción nosetests --pdb

88

nosetests --pdbdéjeme detenerme en caso de error o falla, pero esto es demasiado tarde para mis necesidades. Pasar por el código durante la ejecución me ayuda a depurar dónde está el problema.

Sin embargo, las pruebas de nariz son útiles ya que permiten pruebas que dependen de importaciones relativas (es decir, pruebas en un paquete).

¿Cómo puedo establecer puntos de interrupción antes de que se ejecuten las pruebas? Actualmente estoy usando:

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

Esta solución no es adecuada. Las pruebas de nariz interfieren con la salida de pdb y los controles de mi teclado (por ejemplo, las teclas de flecha) están rotos.

Usando import pdb; pdb.set_trace () parecería una buena idea, sin embargo nosetests está bloqueando mi acceso a la consola pdb.

Devin
fuente

Respuestas:

118

Puedes añadir

import pdb; pdb.set_trace() 

en cualquier lugar de su fuente que desee detener en el depurador.

Asegúrate de pasar -sa la nariz para que no capture stdout.

Ned Batchelder
fuente
Estaba a punto de agregar esto a mi pregunta. Esta tampoco es una solución aceptable. Cuando se usa esto con nosetests, es evidente que es literalmente inutilizable ya que se filtra el acceso a la consola pdb y no se pueden ejecutar comandos pdb.
Devin
25
Agregue la marca -s a nosetests para evitar que capture stdout, y podrá usar pdb sin problemas.
Ned Batchelder
1
No funciona. Utilice esto:from nose.tools import set_trace; set_trace()
anilbey
142

Incluso mejor que recordar usar -ses usar la set_tracevariante que viene con Nose. Añadir

from nose.tools import set_trace; set_trace()

donde quiera ingresar al depurador. La redirección stdin / out se encargará de usted. El único efecto secundario extraño con el que me he encontrado es la imposibilidad de reiniciar su código desde dentro de pdb (usando run) mientras depuraba durante una ejecución nasal.

Matt Luongo
fuente
¿Existe alguna documentación de esto? ¿Cómo salir del círculo?
AJ
¿Te refieres a cómo navegar una vez que estás pdbcorriendo? Estoy seguro de que hay documentos, pero en la parte superior de mi cabeza: s"entra" en una llamada de función, nva a la declaración "siguiente", se umueve "hacia arriba" en la pila y d"hacia abajo". Puede utilizar bpara establecer puntos de interrupción y c"continuar" y salir del depurador paso a paso. ¡Espero que ayude!
Matt Luongo
4
Esta debería ser la respuesta aceptada. Proporciona toda la funcionalidad normal del comando pdb.set_trace () original.
tbm
¿Alguna posibilidad de una versión ipython / ipdb de esto?
gerrit
5

Si tiene ipython , para una genialidad ilimitada, use:

import ipdb; ipdb.set_trace() 

* genialidad ilimitada: como ipython: autocompletar, colorear, etc.

Shubham Chaudhary
fuente
1

Si está usando pytest , puede usar

import pytest; pytest.set_trace()

Ver documentación .

gerrit
fuente