ustawianie punktów przerwania z opcją nosetests --pdb

88

nosetests --pdbpozwól mi zatrzymać się w przypadku błędu lub niepowodzenia, ale na moje potrzeby jest już za późno. Przechodzenie przez kod podczas wykonywania pomaga mi debugować, gdzie jest problem.

Jednak testy nosowe są pomocne, ponieważ pozwalają na testy, które opierają się na imporcie względnym (tj. Testy w pakiecie).

Jak ustawić punkty przerwania przed wykonaniem testów? Obecnie używam:

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

To rozwiązanie nie jest adekwatne. Nosetesty kolidują z wyjściem pdb, a moje elementy sterujące na klawiaturze (np. Klawisze strzałek) są zepsute.

Korzystanie z importu pdb; pdb.set_trace () wydaje się dobrym pomysłem, jednak nosetests blokuje mi dostęp do konsoli pdb.

Devin
źródło

Odpowiedzi:

120

Możesz dodać

import pdb; pdb.set_trace() 

w dowolnym miejscu źródła, które chcesz zatrzymać w debugerze.

Upewnij się, że przechodzisz -sprzez nos, aby nie złapał stdout.

Ned Batchelder
źródło
Właśnie miałem to dodać do mojego pytania. To też nie jest akceptowalne rozwiązanie. Używając tego z nosetestami, widać, że jest to dosłownie bezużyteczne, ponieważ dostęp do konsoli pdb jest sprawdzany i żadne polecenia pdb nie mogą być wykonywane.
Devin,
26
Dodaj flagę -s do nosetests, aby zapobiec przechwytywaniu standardowego wyjścia, a będziesz mógł używać pdb w porządku.
Ned Batchelder
1
Nie działa. Użyj tego:from nose.tools import set_trace; set_trace()
anilbey
143

Nawet lepiej niż pamiętanie o użyciu -sjest skorzystanie z set_tracewariantu dołączonego do Nosa. Dodaj

from nose.tools import set_trace; set_trace()

gdziekolwiek chcesz włamać się do debuggera. Zadbamy o przekierowanie stdin / out. Jedynym dziwnym efektem ubocznym, na jaki się natknąłem, jest niemożność ponownego uruchomienia kodu z poziomu pdb (przy użyciu run) podczas debugowania podczas kataru.

Matt Luongo
źródło
Czy jest jakaś dokumentacja tego? Jak wyjść z pętli?
AJ
Masz na myśli, jak nawigować po pdburuchomieniu? Jestem pewien, że są dokumenty, ale z góry mojej głowy - s„wchodzi” do wywołania funkcji, nprzechodzi do instrukcji „next”, uprzesuwa „w górę” stosu i dprzesuwa „w dół”. Możesz użyć bdo ustawiania punktów przerwania i c"kontynuowania" oraz wyjścia z debugera krokowego. Mam nadzieję, że to pomoże!
Matt Luongo,
4
To powinna być akceptowana odpowiedź. Zapewnia wszystkie standardowe funkcje oryginalnego polecenia pdb.set_trace ().
tbm
Jest jakaś możliwość dla wersji ipython / ipdb tego?
gerrit
5

Jeśli masz ipython , użyj nieograniczonej niesamowitości :

import ipdb; ipdb.set_trace() 

* nieograniczona niesamowitość: podobnie jak ipython - automatyczne uzupełnianie, kolorowanie itp.

Shubham Chaudhary
źródło
1

Jeśli korzystasz z pytest , możesz użyć

import pytest; pytest.set_trace()

Zobacz dokumentację .

gerrit
źródło