Cách thực thi ipdb.set_trace () theo ý muốn trong khi chạy các bài kiểm tra pytest


96

Tôi đang sử dụng pytest cho bộ thử nghiệm của mình. Trong khi bắt lỗi trong bài kiểm tra liên thành phần phức tạp, tôi muốn đặt import ipdb; ipdb.set_trace()ở giữa mã của mình để cho phép tôi gỡ lỗi nó.

Tuy nhiên, vì pytest bẫy sys.stdin / sys.stdout nên ipdb không thành công. Làm cách nào để sử dụng ipdb trong khi thử nghiệm với pytest.

Tôi không quan tâm đến việc chuyển sang pdb hoặc ipdb sau khi bị lỗi, nhưng để đặt các dấu ngắt ở bất kỳ đâu trong mã và có thể gỡ lỗi ở đó trước khi lỗi xảy ra.

Câu trả lời:


153

Lỗi xuất hiện do đầu ra chụp py.test.

Bạn nên chạy py.test với -stùy chọn (tắt đầu ra chụp). Ví dụ:

py.test -s my_test.py

10
Trong trường hợp một người muốn thực hiện việc này trong Django, hãy thêm addopts = -svào pytest.initệp.
Rahul Gupta

39

Rất tiếc, pytest-ipdb không được hỗ trợ nữa.

Giải pháp là chạy pytest my_test.py --pdb --pdbcls=IPython.terminal.debugger:Pdb

Từ lệnh trợ giúp:

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

Sự khác biệt chỉ là TerminalPdb dường như ném sai, nhưng Pdb thì không ( Ipython docs ).


1
TerminalPdbđang hoạt động trở lại và giải pháp ưa thích vì nó sẽ cung cấp cho bạn hoàn thành tab.
Uwe L. Korn

tìm kiếm ppdb, phần nội quan có chất lượng ipython
msudder

2

Đây là những gì tôi sử dụng

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


0

Kể từ ngày 11 tháng 11 năm 2019, đây là những gì sẽ sửa chữa nó:

pip install ipdb gnureadline ptpython

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

1
nếu bạn cài đặt prompt-toolkit phiên bản 2.0.10sau đó IPdb sẽ hoạt động tốt trở lại, bởi vì nó phá vỡ do cập nhật gần đây của gói này để 3.0.0
Pawel Barcik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.