2010-04-20 13 views
33

Estoy usando py.test para pruebas unitarias de mi programa python. Deseo depurar mi código de prueba con el depurador de python de la manera normal (me refiero a pdb.set_trace() en el código) pero no puedo hacerlo funcionar.¿Puedo depurar con depurador de python cuando se utiliza py.test de alguna manera?

Poner pdb.set_trace() en el código no funciona (IOError plantea: la lectura de la entrada estándar mientras que la producción es capturado). También intenté ejecutar py.test con la opción --pdb, pero eso no parece ser el truco si quiero explorar lo que sucede antes de mi afirmación. Se rompe cuando una afirmación falla, y pasar de esa línea significa terminar el programa.

¿Alguien sabe una manera de conseguir la depuración, o es la depuración y py.test no destinados a estar juntos?

Respuesta

0

no estoy familiarizado con py.test, puestos a unittest, hace lo siguiente. Tal vez py.test es similar:

En el módulo de prueba (mytestmodule.py):

if __name__ == "__main__": 
    unittest.main(module="mytestmodule") 

A continuación, ejecute la prueba con

python -m pdb mytestmodule.py 

Usted recibirá una cáscara AP interactiva.

En cuanto a la documentación, parece que py.test tiene una opción de línea de comandos --pdb:

http://codespeak.net/py/dist/test/features.html

+0

Pedro, gracias por sus sugerencias. La alternativa python -m pdb me guía por el script pero no llama a las funciones, por lo que aunque es útil para mi desarrollo de Python, no veo cómo puedo hacer que funcione. Mencioné la opción --pdb, pero a menos que alguien pueda pensar cómo usarla, tampoco puedo ir más allá. – Joel

+0

Sugiero leer el manual en pdb y aprender las teclas. pdb imprimirá la función que se ejecutará a continuación. Si escribe "s", ingresará a esa función. Si escribe "n", que es el valor predeterminado, simplemente vaya a la siguiente línea de código.Es muy probable que esté presionando "n" en lugar de "s" cuando quiera ingresar a su rutina "principal". –

+2

No es así como funciona py.test. Código de prueba pequeño pero válido para py.test: def test_arithmetic: assert 2 + 2 == 4 Eso es suficiente para tener una prueba unitaria. Sin rutina "principal", solo una función que comienza con "prueba_". Si ejecuta esto con python normal, simplemente definiría test_arithmetic, no lo ejecutará. Pero py.test encuentra funciones que comienzan con test_ y las ejecuta para mí, ocupándose de afirmaciones fallidas, etc. – Joel

57

es realmente simple: poner assert 0 donde desea iniciar la depuración en el código y ejecutar su pruebas con:

py.test --pdb 

hecho :)

Alternativamente, si está utilizando pyt est-2.0.1 o superior, también está el ayudante pytest.set_trace() que puede colocar en cualquier parte del código de prueba. Aquí están los docs. Tendrá cuidado de deshabilitar internamente la captura antes de enviarlo a la línea de comandos del depurador pdb.

+0

Esto es genial si solo quieres depurar lo que sucede hasta la afirmación. También sería bueno si hubiera py.test.set_trace() (que volvería a habilitar el stdin e invocar pdb.set_trace() (o similar). El problema con assert 0 es que no es posible (AFAIK) suprima la excepción y proceda a trabajar con el depurador. Sería preferible un método que invoca el depurador que no altera el flujo lógico. –

+0

Hola Jason. Veo y acepto. Debería haber un "py.test.pdb() "o algo similar que simplemente funciona, con o sin" -s ". Si presenta un problema, intentaré implementarlo. – hpk42

+3

Hola, Jason. Acabo de agregar py.test.set_trace(), ver http://bitbucket.org/hpk42/py-trunk/changeset/1d7b0838917f y es posible que pueda instalar la versión de desarrollo con, por ejemplo, "pip install URL" donde URL es el archivo zip aquí: http: //hudson.testrun. org/view/pytest/job/py-trunk-sdist/(lo siento, parece que StackOverflow trunca mal las URL, por lo que no puede pegar la URL completa) – hpk42

22

He descubierto que puedo correr py.test con captura desactivada, a continuación, utilizar pdb.set_trace(), como de costumbre.

> py.test --capture=no 
============================= test session starts ============================== 
platform linux2 -- Python 2.5.2 -- pytest-1.3.3 
test path 1: project/lib/test/test_facet.py 

project/lib/test/test_facet.py ...> /home/jaraco/projects/project/lib/functions.py(158)do_something() 
-> code_about_to_run('') 
(Pdb) 
+2

así es como configuré pdb (en lugar de --pdb). Nota: puede usar "-s" en lugar de "--capture = no" – alfredodeza

+1

Durante muchos años ya no es necesario deshabilitar la captura. Simplemente agregue su declaración 'pdb.set_trace()' en algún lugar de la pila de ejecución. –

12

La forma más fácil es usar el mecanismo para crear py.test punto de interrupción

http://pytest.org/latest/usage.html#setting-a-breakpoint-aka-set-trace

import pytest 
def test_function(): 
    ... 
    pytest.set_trace() # invoke PDB debugger and tracing 

O si desea pytest 's como un depurador de una sola línea, cambie su import pdb; pdb.set_trace() en import pytest; pytest.set_trace()

+0

pequeña edición necesaria para '' 'importar ipdb; ipdb.set_trace()' '' – Michael

Cuestiones relacionadas