thiết lập các điểm ngắt với tùy chọn nosetests --pdb


88

nosetests --pdbHãy để tôi dừng lại khi có lỗi hoặc thất bại, nhưng điều này là quá muộn đối với nhu cầu của tôi. Bước qua mã trong khi thực thi giúp tôi gỡ lỗi vấn đề ở đâu.

Tuy nhiên, các phép thử rất hữu ích vì chúng cho phép các phép thử dựa vào các phép nhập tương đối (tức là các phép thử trong một gói hàng).

Làm cách nào để tôi có thể đặt các điểm ngắt trước khi thực hiện kiểm tra? Hiện tại tôi đang sử dụng:

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

Giải pháp này không phù hợp. Nosetests can thiệp vào đầu ra pdb và điều khiển bàn phím của tôi (ví dụ: phím mũi tên) bị hỏng.

Sử dụng pdb nhập khẩu; pdb.set_trace () có vẻ là một ý tưởng hay, tuy nhiên các nosetests đang chặn quyền truy cập của tôi vào bảng điều khiển pdb.

Câu trả lời:


118

Bạn có thể thêm

import pdb; pdb.set_trace() 

bất kỳ nơi nào trong nguồn của bạn mà bạn muốn dừng trong trình gỡ lỗi.

Hãy chắc chắn rằng bạn vượt qua -smũi để nó không bị bắt stdout.


Tôi chỉ muốn thêm điều này vào câu hỏi của tôi. Đây cũng không phải là một giải pháp chấp nhận được. Khi sử dụng điều này với nosetests, rõ ràng đây là nghĩa đen không thể sử dụng được vì quyền truy cập vào bảng điều khiển pdb được kiểm tra và không có lệnh pdb nào có thể được thực hiện.
Devin

25
Thêm cờ -s vào nosetests để ngăn nó bắt stdout và bạn sẽ có thể sử dụng pdb tốt.
Ned Batchelder

1
Không hoạt động. Sử dụng cái này:from nose.tools import set_trace; set_trace()
anilbey

142

Thậm chí tốt hơn việc nhớ sử dụng -slà sử dụng set_tracebiến thể đi kèm với Nose. Thêm vào

from nose.tools import set_trace; set_trace()

bất cứ nơi nào bạn muốn truy cập vào trình gỡ lỗi. Việc chuyển hướng stdin / out sẽ được chăm sóc cho bạn. Tác dụng phụ kỳ lạ duy nhất mà tôi gặp phải là không có khả năng khởi động lại mã của bạn từ bên trong pdb (đang sử dụng run) trong khi gỡ lỗi trong thời gian sửa chữa.


Có tài liệu nào về điều này không? Làm thế nào để di chuyển ra khỏi vòng lặp?
AJ

Ý bạn là làm thế nào để điều hướng sau khi bạn đã pdbchạy? Tôi chắc chắn rằng có tài liệu, nhưng ngoài đầu tôi - s"bước vào" một lệnh gọi hàm, nchuyển đến câu lệnh "tiếp theo", udi chuyển "lên" ngăn xếp và ddi chuyển "xuống". Bạn có thể sử dụng bđể đặt các điểm ngắt và cđể "tiếp tục" và thoát khỏi trình gỡ lỗi bước. Hy vọng rằng sẽ giúp!
Matt Luongo

4
Đây phải là câu trả lời được chấp nhận. Nó cung cấp tất cả các chức năng thông thường của lệnh pdb.set_trace () ban đầu.
tbm

Bất kỳ khả năng cho một phiên bản ipython / ipdb của điều này?
gerrit

5

Nếu bạn có ipython , để sử dụng tuyệt vời không giới hạn:

import ipdb; ipdb.set_trace() 

* tuyệt vời không giới hạn: giống như ipython - tự động hoàn thành, tô màu, v.v.


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.