2014-10-14 22 views
13

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?

+0

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 ... –

+1

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

+0

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? –

Trả lời

1

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ô.

5

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.

+0

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

6

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

+2

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

2

Để trả lời câu hỏi

  1. Chạy bằng py.test -m trace --trace để nhận dấu vết lệnh python.

  2. 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

  3. Để 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ới pytest.py --verbose . . . https://pypi.python.org/pypi/pytest-sugar

0

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.

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