2013-04-15 36 views
50

Tôi đang sử dụng pytest cho bộ thử nghiệm của mình. Trong khi bắt lỗi trong các thử nghiệm 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 tôi để cho phép tôi gỡ lỗi nó.Làm thế nào để thực hiện ipdb.set_trace() theo ý muốn trong khi chạy thử nghiệm pytest

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

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

Trả lời

78

Lỗi được tăng lên do đầu ra chụp py.test.

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

py.test -s my_test.py 
+7

Trong trường hợp một người muốn làm điều này trong Django, thêm 'addopts = -s' vào tệp' pytest.ini'. –

20

Cài đặt plugin pytest-ipdb và sau đó sử dụng

pytest.set_trace() 
+7

Lưu ý rằng 'pytest-ipdb' không còn được duy trì, đề xuất [' pdbpp'] (https://pypi.python.org/pypi/pdbpp/) như một giải pháp thay thế. Tuy nhiên, pytest cũng hỗ trợ [shortcut 'pytest.set_trace()' nguyên bản] (http://doc.pytest.org/en/latest/usage.html?highlight=set_trace#setting-a-breakpoint-aka-set- dấu vết) và, [kể từ 3.0] (http://doc.pytest.org/en/latest/changelog.html#id7), cho phép chuyển một lớp trình gỡ rối tùy chỉnh như là '--pdbcls = IPython.core.debugger: Pdb '. – tutuDajuju

10

pytest-IPdb đang tiếc là không hỗ trợ nữa.

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

Từ lệnh 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 là chỉ là TerminalPdb dường như ném erros, nhưng PDB không (Ipython docs).

Các vấn đề liên quan