Bagaimana menjalankan ipdb.set_trace () sesuka hati saat menjalankan tes pytest

96

Saya menggunakan pytest untuk rangkaian pengujian saya. Saat menemukan bug dalam pengujian antar-komponen yang kompleks, saya ingin menempatkannya import ipdb; ipdb.set_trace()di tengah kode agar saya dapat men-debugnya.

Namun, karena pytest menjebak sys.stdin / sys.stdout ipdb gagal. Bagaimana saya bisa menggunakan ipdb saat menguji dengan pytest.

Saya tidak tertarik untuk beralih ke pdb atau ipdb setelah kegagalan, tetapi untuk menempatkan jeda di mana saja dalam kode dan dapat men-debugnya di sana sebelum kegagalan terjadi.

manu
sumber

Jawaban:

153

Kesalahan dimunculkan karena py.test menangkap keluaran.

Anda harus menjalankan py.test dengan -sopsi (matikan keluaran tangkapan). Sebagai contoh:

py.test -s my_test.py
petRUShka
sumber
10
Dalam kasus seseorang ingin melakukan ini di Django, tambahkan addopts = -ske pytest.inifile.
Rahul Gupta
39

pytest-ipdb sayangnya tidak didukung lagi.

Solusinya adalah lari pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

Dari perintah bantuan:

pytest -h
  --pdb                 start the interactive Python debugger on errors.
  --pdbcls=modulename:classname
                        start a custom interactive Python debugger on errors.
                        For example:
                        --pdbcls=IPython.terminal.debugger:TerminalPdb

Perbedaannya hanya TerminalPdb tampaknya membuat kesalahan, tetapi Pdb tidak ( dokumen Ipython ).

louis_guitton
sumber
1
TerminalPdbberfungsi kembali dan solusi yang disukai karena akan memberi Anda penyelesaian tab.
Uwe L. Korn
hati-hati untuk ppdb, yang punya introspeksi kualitas
ipython
2

Ini yang saya gunakan

py.test tests/ --pdbcls=IPython.core.debugger:Pdb -s

avoliva
sumber
0

Pada 2019-11, inilah yang harus memperbaikinya:

pip install ipdb gnureadline ptpython

export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'
sorin
sumber
1
jika Anda menginstal prompt-toolkit versi 2.0.10maka ipdb akan berfungsi dengan baik lagi, karena rusak karena pembaruan terbaru dari paket ini ke 3.0.0
Pawel Barcik