2010-04-20 1 views
33

Ich benutze py.test für das Unit-Testen meines Python-Programms. Ich möchte meinen Testcode mit dem Python-Debugger auf normale Weise debuggen (womit ich pdb.set_trace() im Code meine), aber ich kann es nicht funktionieren lassen.Kann ich mit Python Debugger debuggen, wenn Sie py.test irgendwie benutzen?

Putd pdb.set_trace() in den Code funktioniert nicht (löst IOError: Lesen von Stdin, während die Ausgabe erfasst wird). Ich habe auch versucht, py.test mit der Option --pdb auszuführen, aber das scheint nicht der Trick zu sein, wenn ich herausfinden möchte, was vor meiner Behauptung passiert. Es bricht ab, wenn eine Assertion fehlschlägt, und das Fortfahren von dieser Zeile bedeutet das Beenden des Programms.

Kennt jemand eine Möglichkeit, Debuggen zu bekommen, oder ist Debugging und py.test nur nicht zusammen gedacht?

Antwort

0

Ich bin nicht vertraut mit py.test, setzen für unittest, Sie tun folgendes. Vielleicht py.test ist ähnlich:

In Ihrem Testmodul (mytestmodule.py):

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

Dann führen Sie den Test mit

python -m pdb mytestmodule.py 

Sie eine interaktive pdb Shell erhalten.

bei der Dokumentation der Suche, es sieht aus wie eine py.test --pdb Befehlszeilenoption hat:

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

+0

Peter, danke für Ihre Vorschläge. Die Alternative python -m pdb führt mich durch das Skript, ruft aber nicht die Funktionen auf. Obwohl es für meine Python-Entwicklung nützlich ist, sehe ich nicht, wie ich das funktionieren lassen kann. Ich erwähnte die Option --pdb, aber wenn jemand nicht daran denken kann, wie man es benutzt, kann ich auch nicht weiter damit gehen. – Joel

+0

Ich schlage vor, das Handbuch auf pdb zu lesen und die Tastenanschläge zu lernen. pdb wird die Funktion drucken, die als nächstes ausgeführt wird. Wenn Sie "s" eingeben, treten Sie in diese Funktion ein. Wenn Sie "n" eingeben, was der Standard ist, gehen Sie einfach zur nächsten Codezeile.Es ist sehr wahrscheinlich, dass Sie "n" statt "s" drücken, wenn Sie in Ihre "Haupt" -Routine treten wollen. –

+2

So funktioniert py.test nicht. Kleiner, aber gültiger Prüfcode für py.test: def test_arithmetik: assert 2 + 2 == 4 Das reicht für einen Komponententest. Keine "Haupt" -Routine, nur eine Funktion, die mit "test_" beginnt. Wenn Sie das mit normalem Python ausführen, würde es test_arithmetic nur definieren, nicht ausführen. Aber py.test findet Funktionen, die mit test_ beginnen, und führt sie für mich aus, kümmert sich um fehlgeschlagene Behauptungen usw. – Joel

57

es ist wirklich einfach: ein assert 0 setzen, wo Sie das Debuggen in Code gestartet werden soll, und führen Sie Ihre Tests mit:

py.test --pdb 

:)

Alternativ getan, wenn Sie pyt verwenden est-2.0.1 oder höher, gibt es auch den pytest.set_trace() Helfer, den Sie irgendwo in Ihren Testcode einfügen können. Hier sind die docs. Es wird darauf achten, die Erfassung intern zu deaktivieren, bevor Sie an die Debugger-Befehlszeile von pdb gesendet werden.

+0

Das ist großartig, wenn Sie nur debuggen wollen, was bis zur Behauptung passiert. Es wäre auch schön, wenn es ein py.test.set_trace() geben würde (was die stdin wieder aktivieren und pdb.set_trace() (oder ähnliches) aufrufen würde. Das Problem mit assert 0 ist, dass es nicht möglich ist, (AFAIK) zu unterdrücken Sie die Ausnahme und fahren Sie fort, mit dem Debugger zu arbeiten. Eine Methode, die den Debugger aufruft, der den logischen Fluss nicht ändert, wäre vorzuziehen. –

+0

Hey Jason. Ich sehe und stimme zu. Es sollte ein "py.test.pdb() "oder etwas Ähnliches, das gerade funktioniert, mit oder ohne" -s ". Wenn Sie ein Problem einreichen, werde ich sehen, um es zu implementieren. – hpk42

+3

Hey Jason. Ich habe gerade hinzugefügt py.test.set_trace(), zu sehen http://bitbucket.org/hpk42/py-trunk/changeset/1d7b0838917f und Sie können möglicherweise die Entwicklungsversion mit z. B. "pip install URL" installieren, wobei URL die zip-Datei ist: http: //hudson.testrun. org/view/pytest/job/py-trunk-sdist/(Sorry, StackOverflow schneidet URLs schlecht ab, daher kann die vollständige URL nicht eingefügt werden) – hpk42

22

Ich habe festgestellt, dass ich py.test mit deaktivierter Erfassung ausführen kann, dann benutze pdb.set_trace() wie gewohnt.

> 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

das ist genau wie ich pdb (anstatt --pdb) festlegen. Hinweis: Sie können "-s" anstelle von "--capture = no" verwenden – alfredodeza

+1

Seit vielen Jahren ist es nicht mehr notwendig, die Erfassung zu deaktivieren. Fügen Sie einfach Ihre 'pdb.set_trace()' -Anweisung irgendwo im Run-Stack hinzu. –

12

Der einfachste Weg, um die py.test Mechanismus verwendet

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 

Breakpoint zu erstellen, oder wenn Sie pytest ‚s Debugger als Ihre import pdb; pdb.set_trace() Einzeiler möchten, ändern Sie in import pytest; pytest.set_trace()

+0

kleine Bearbeitung benötigt für '' 'import ipdb; ipdb.set_trace()' '' – Michael

Verwandte Themen