วิธีดำเนินการ ipdb.set_trace () ตามต้องการในขณะที่รันการทดสอบ pytest


99

ฉันใช้ pytest สำหรับชุดทดสอบของฉัน ในขณะที่จับข้อบกพร่องในการทดสอบระหว่างส่วนประกอบที่ซับซ้อนฉันต้องการวางimport ipdb; ipdb.set_trace()ไว้ตรงกลางรหัสเพื่อให้ฉันแก้ไขข้อบกพร่องได้

อย่างไรก็ตามเนื่องจาก pytest traps sys.stdin / sys.stdout ipdb ล้มเหลว ฉันจะใช้ ipdb ในขณะทดสอบด้วย pytest ได้อย่างไร

ฉันไม่สนใจที่จะข้ามไปที่ pdb หรือ ipdb หลังจากเกิดความล้มเหลว แต่จะทำการแบ่งที่ใดก็ได้ในโค้ดและสามารถดีบักที่นั่นก่อนที่ความล้มเหลวจะเกิดขึ้น

คำตอบ:


155

ข้อผิดพลาดเกิดขึ้นเนื่องจาก py.test จับเอาต์พุต

คุณควรเรียกใช้ py.test พร้อม-sตัวเลือก (ปิดเอาต์พุตการจับภาพ) ตัวอย่างเช่น:

py.test -s my_test.py

11
ในกรณีที่ต้องการทำใน Django ให้เพิ่มลงaddopts = -sในpytest.iniไฟล์
Rahul Gupta

41

pytest-ipdb ไม่รองรับอีกต่อไป

วิธีแก้ปัญหาคือการเรียกใช้ pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

จากคำสั่งช่วยเหลือ:

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

ความแตกต่างคือ TerminalPdb ดูเหมือนจะโยน erros แต่ Pdb ไม่ใช่ ( เอกสาร Ipython )


1
TerminalPdbกำลังทำงานอีกครั้งและโซลูชันที่ต้องการเนื่องจากจะทำให้แท็บเสร็จสมบูรณ์
Uwe L. Korn

มองหา ppdb มีวิปัสสนาคุณภาพระดับ ipython
msudder


0

ตั้งแต่วันที่2019-11นี่คือสิ่งที่ควรแก้ไข:

pip install ipdb gnureadline ptpython

export PYTEST_ADDOPTS='--pdb --pdbcls=IPython.terminal.debugger:Pdb'

1
หากคุณติดตั้งprompt-toolkit เวอร์ชัน2.0.10แล้ว ipdb จะทำงานได้ดีอีกครั้งเนื่องจากมันหยุดทำงานเนื่องจากการอัปเดตล่าสุดของแพ็คเกจนี้เป็น 3.0.0
Pawel Barcik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.