Trong khi sử dụng py.test, tôi có một số thử nghiệm chạy tốt với SQLite nhưng treo âm thầm khi tôi chuyển sang Postgresql. Làm thế nào tôi sẽ đi về gỡ lỗi một cái gì đó như thế? Có chế độ "tiết" tôi có thể chạy thử nghiệm của mình hay đặt điểm ngắt không? Nói chung, kế hoạch tấn công tiêu chuẩn là gì khi pytest im lặng? Tôi đã thử sử dụng các pytest-timeout, và chạy thử nghiệm với $ py.test - timeout = 300, nhưng các xét nghiệm vẫn treo mà không có hoạt động trên màn hình nàoLàm gì khi py.test treo âm thầm?
Trả lời
Không biết những gì đang phá vỡ trong mã, tốt nhất cách là để cô lập các thử nghiệm đó là không và thiết lập một breakpoint trong nó để có một cái nhìn. Lưu ý: Tôi sử dụng pudb thay vì pdb, bởi vì nó thực sự là cách tốt nhất để gỡ lỗi python nếu bạn không sử dụng một IDE.
Ví dụ, bạn có thể điều sau đây trong tập tin thử nghiệm của bạn:
import pudb
...
def test_create_product(session):
pudb.set_trace()
# Create the Product instance
# Create a Price instance
# Add the Product instance to the session.
...
Sau đó chạy nó với
py.test -s --capture=no test_my_stuff.py
Bây giờ bạn sẽ có thể nhìn thấy chính xác nơi kịch bản khóa lên, và kiểm tra ngăn xếp và cơ sở dữ liệu tại thời điểm thực hiện cụ thể này. Nếu không, nó giống như tìm kiếm một cây kim trong đống cỏ khô.
Tôi đã gặp sự cố tương tự với pytest và Postgresql trong khi thử nghiệm ứng dụng Flask sử dụng SQLAlchemy. Dường như có một thời gian khó khăn khi chạy một teardown bằng cách sử dụng phương thức request.addfinalizer của nó với Postgresql.
Trước đây tôi đã có:
@pytest.fixture
def db(app, request):
def teardown():
_db.drop_all()
_db.app = app
_db.create_all()
request.addfinalizer(teardown)
return _db
(_db là một thể hiện của SQLAlchemy tôi nhập khẩu từ extensions.py) Nhưng nếu tôi thả các cơ sở dữ liệu mỗi khi cố cơ sở dữ liệu được gọi là:
@pytest.fixture
def db(app, request):
_db.app = app
_db.drop_all()
_db.create_all()
return _db
Sau đó, pytest sẽ không treo sau khi thử nghiệm đầu tiên của bạn.
Có cùng vấn đề với Flask, pytest & factory-boy. Giải pháp trên khắc phục được sự cố. – Burnash
Tôi chạy vào cùng một vấn đề SQLite/Postgres với Flask và SQLAlchemy, tương tự như Gordon Fierce. Tuy nhiên, giải pháp của tôi thì khác. Postgres là nghiêm ngặt về các khóa bảng và các kết nối, vì vậy một cách rõ ràng đóng kết nối phiên trên teardown giải quyết vấn đề cho tôi.
mã làm việc của tôi:
@pytest.yield_fixture(scope='function')
def db(app):
# app is an instance of a flask app, _db a SQLAlchemy DB
_db.app = app
with app.app_context():
_db.create_all()
yield _db
# Explicitly close DB connection
_db.session.close()
_db.drop_all()
SQLAlchemy tài liệu tham khảo: "Làm thế nào tôi sẽ đi về gỡ lỗi một cái gì đó như thế" http://docs.sqlalchemy.org/en/rel_0_8/faq.html#my-program-is-hanging-when-i-say-table-drop-metadata-drop-all
Vị trí mới nhất của tham chiếu SQLAlchemy là ở đây ngay bây giờ: http://docs.sqlalchemy.org/en/latest/faq/metadata_schema.html#my-program-is-hanging-when-i-say-table-drop- siêu dữ liệu thả-tất cả – Mani
Để trả lời câu hỏi
Chạy bằng py.test -m trace --trace để nhận dấu vết lệnh python.
Một tùy chọn (hữu ích cho bất kỳ nhị phân unix bị mắc kẹt) nào được đính kèm vào quy trình sử dụng
strace -p <PID>
. Xem những gì hệ thống gọi nó có thể bị mắc kẹt trên hoặc vòng lặp của các cuộc gọi hệ thống. ví dụ. gọi điện thoại bị kẹt gettimeofdayĐể biết thêm chi tiết về việc cài đặt đầu ra pytest.
pip install pytest-sugar
Và chạy thử nghiệm vớipytest.py --verbose . . .
https://pypi.python.org/pypi/pytest-sugar
Trong trường hợp của tôi ứng dụng Flask không kiểm tra if __name__ == '__main__':
để nó thực hiện app.start()
khi đó không phải là ý định của tôi.
Bạn có thể đọc thêm chi tiết here.
- 1. sleep() âm thầm ho CPU CPU
- 2. Git Hook không âm thầm
- 3. TSQL khiến kích hoạt không âm thầm
- 4. Lệnh conda không hoạt động âm thầm
- 5. Làm thế nào để âm thầm bắt đầu Sinatra + Thin?
- 6. Cập nhật âm thầm một dịch vụ Windows
- 7. imagecreatefromjpeg là âm thầm chấm dứt các kịch bản
- 8. Thực hiện một chức năng trở về âm thầm
- 9. hg-git đẩy âm thầm không thành công
- 10. Chọn một máy in và in âm thầm
- 11. Sửa nhúng dữ liệu excel âm thầm, trong PowerPoint 2010
- 12. Khởi động dịch vụ uWSGI không hoạt động âm thầm
- 13. Cài đặt Dot net 4.5 âm thầm như phụ thuộc
- 14. pandas python: pivot_table âm thầm giảm chỉ số với nans
- 15. Ứng dụng .NET âm thầm không khởi động khi assembly bị thiếu
- 16. Làm thế nào để tạo các chương trình Jar runnable mà không thất bại âm thầm?
- 17. Làm cách nào để gỡ lỗi các plugin đang được bỏ qua âm thầm?
- 18. Làm thế nào để cài đặt Microsoft VC++ redistributables âm thầm trong Inno Setup?
- 19. làm thế nào để âm thầm "Lưu tất cả bộ đệm" trong Emacs?
- 20. Mở các ứng dụng Java không hoạt động âm thầm trên OS X Mavericks
- 21. Ví dụ về việc gửi một biểu mẫu POST (CSRF) một cách âm thầm
- 22. Tại sao dữ liệu số nguyên tràn âm thầm thay vì ném ngoại lệ
- 23. gỡ cài đặt ứng dụng âm thầm với các đặc quyền hệ thống
- 24. PHP (Apache) âm thầm chuyển đổi HTTP 429 và những người khác thành 500
- 25. Có cách nào để âm thầm chạy lệnh bash sau khi tệp được lưu trong vim không?
- 26. execCommand ('copy') âm thầm không thành công trong IE khi người dùng trả lời lời nhắc với 'Don't allow'
- 27. Làm thế nào để làm cho bộ xử lý tín hiệu Django không âm thầm khi một ngoại lệ gặp phải trong bộ xử lý tín hiệu?
- 28. Máy chủ SQL an toàn truyền chuỗi và không hoạt động âm thầm
- 29. R DocumentTermMatrix danh sách điều khiển không làm việc, âm thầm bỏ qua tham số chưa biết
- 30. JFileChooser treo đôi khi
tôi muốn tìm kiếm một số loại chức năng thời gian chờ - Tôi không biết nếu một điều như vậy được xây dựng-in để py.test ... –
Tôi rất vui vì bạn đã mang này lên, bởi vì tôi quên đề cập đến rằng tôi đã cài đặt các mô-đun thời gian chờ pytest, và thiết lập nó để thời gian ra sau một 6 giây, nhưng vẫn còn các bài kiểm tra treo vô thời hạn. – Hexatonic
Bạn đã thử cả hai phương thức 'time' và' signal' timeout chưa? Cả hai đều giống nhau không? Bạn đã có thể cô lập một thử nghiệm cụ thể mà treo dưới PostgreSQL nhưng không phải là SQLite? –