mengatur breakpoint dengan opsi nosetests --pdb

88

nosetests --pdbbiarkan saya berhenti karena kesalahan atau kegagalan, tetapi ini sudah terlambat untuk kebutuhan saya. Melangkah melalui kode selama eksekusi membantu saya men-debug di mana masalahnya.

Namun, nosetests sangat membantu karena memungkinkan pengujian yang mengandalkan impor relatif (yaitu pengujian dalam sebuah paket).

Bagaimana cara mengatur breakpoint sebelum pengujian dijalankan? Saat ini saya menggunakan:

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

Solusi ini tidak memadai. Nosetests mengganggu output pdb, dan kontrol keyboard saya (misalnya tombol panah) rusak.

Menggunakan import pdb; pdb.set_trace () sepertinya ide yang bagus, namun nosetests memblokir akses saya ke konsol pdb.

Devin
sumber

Jawaban:

120

Anda dapat menambahkan

import pdb; pdb.set_trace() 

di mana saja di sumber Anda yang ingin Anda hentikan di debugger.

Pastikan Anda lolos -ske hidung agar tidak menangkap stdout.

Ned Batchelder
sumber
Saya baru saja akan menambahkan ini ke pertanyaan saya. Ini juga bukan solusi yang dapat diterima. Saat menggunakan ini dengan nosetests, jelas ini benar-benar tidak dapat digunakan karena akses ke konsol pdb disaring, dan tidak ada perintah pdb yang dapat dijalankan.
Devin
26
Tambahkan tanda -s ke nosetests untuk mencegahnya menangkap stdout, dan Anda akan dapat menggunakan pdb dengan baik.
Ned Batchelder
1
Tidak bekerja. Gunakan ini:from nose.tools import set_trace; set_trace()
anilbey
143

Bahkan lebih baik daripada mengingat untuk menggunakan -sadalah menggunakan set_tracevarian yang disertakan dengan Hidung. Menambahkan

from nose.tools import set_trace; set_trace()

di mana pun Anda ingin masuk ke debugger. Pengalihan stdin / out akan diurus untuk Anda. Satu-satunya efek samping aneh yang saya hadapi adalah ketidakmampuan untuk memulai ulang kode Anda dari dalam pdb (menggunakan run) saat melakukan debug selama operasi hidung.

Matt Luongo
sumber
Apakah ada dokumentasi tentang ini? Bagaimana cara keluar dari lingkaran?
AJ
Maksud Anda bagaimana menavigasi setelah Anda mulai pdbberlari? Saya yakin ada dokumen, tetapi di luar kepala saya- s"melangkah ke" pemanggilan fungsi, npergi ke pernyataan "berikutnya", umemindahkan "ke atas" tumpukan, dan dmemindahkan "ke bawah". Anda dapat menggunakan buntuk menyetel breakpoint dan c"melanjutkan" serta keluar dari stepping debugger. Semoga membantu!
Matt Luongo
4
Ini harus menjadi jawaban yang diterima. Ini menyediakan semua fungsionalitas reguler dari perintah pdb.set_trace () asli.
tbm
Adakah kemungkinan untuk versi ipython / ipdb ini?
gerrit
5

Jika Anda memiliki ipython , untuk penggunaan luar biasa yang tidak terbatas:

import ipdb; ipdb.set_trace() 

* kedahsyatan tak terbatas: seperti ipython - pelengkapan otomatis, pewarnaan, dll.

Shubham Chaudhary
sumber
1

Jika Anda menggunakan pytest , Anda bisa menggunakan

import pytest; pytest.set_trace()

Lihat dokumentasi .

gerrit
sumber