2014-10-14 18 views
13

Podczas korzystania z py.test, mam kilka testów, które działają dobrze z SQLite, ale zawiesić się cicho, gdy przejdę do PostgreSQL. W jaki sposób chciałbym debugować coś takiego? Czy istnieje tryb "gadatliwy"? Mogę uruchomić testy lub ustawić punkt przerwania? Bardziej ogólnie, jaki jest standardowy plan ataku, gdy pytest zatrzymuje się po cichu? Próbowałem użyć pytest-timeout i uruchomiłem test za pomocą $ py.test --timeout = 300, ale testy nadal zawieszają się bez żadnej aktywności na ekranie, niezależnie od tego,Co zrobić, gdy py.test wisi w milczeniu?

+0

Poszukuję jakiejś funkcji limitu czasu - nie wiem, czy coś takiego jest wbudowane w py.test ... –

+1

Cieszę się, że to przyniosłeś, bo zapomniałem wspomnieć że zainstalowałem moduł pytest-timeout i ustawię go na time-out po 6 sekundach, ale testy wciąż trwają w nieskończoność. – Hexatonic

+0

Czy próbowałeś już metod timeout 'thread' i' signal'? Czy oboje powieszają to samo? Czy udało Ci się wyizolować konkretny test, który zawiesza się w PostgreSQL, ale nie SQLite? –

Odpowiedz

1

Nie wiedząc, co łamie kod, najlepiej sposób polega na odizolowaniu testu, który się nie powiódł i ustawieniu punktu przerwania, aby rzucił okiem. Uwaga: Używam pudb zamiast pdb, ponieważ to naprawdę najlepszy sposób na debugowanie Pythona, jeśli nie korzystasz z IDE.

Na przykład, można następujące w pliku testowego:

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

następnie uruchomić go z

py.test -s --capture=no test_my_stuff.py 

Teraz będzie można zobaczyć, gdzie dokładnie skrypt blokuje się, a sprawdź stos i bazę danych w tym konkretnym momencie wykonania. W przeciwnym razie przypomina szukanie igły w stogu siana.

5

Miałem podobny problem z pytest i Postgresql podczas testowania aplikacji Flask, która używała SQLAlchemy. Wygląda na to, że pytest ma problem z uruchomieniem odmiany za pomocą metody request.addfinalizer z PostgreSQL.

Wcześniej miałem:

@pytest.fixture 
def db(app, request): 
    def teardown(): 
     _db.drop_all() 

    _db.app = app 
    _db.create_all() 

    request.addfinalizer(teardown) 

    return _db 

(_db jest instancją SQLAlchemy importować z extensions.py) Ale jeśli usunąć bazę danych za każdym razem urządzenie bazy danych nazywa się:

@pytest.fixture 
def db(app, request): 
    _db.app = app 
    _db.drop_all() 
    _db.create_all() 
    return _db 

Pestest nie zawiesza się po pierwszym teście.

+0

Miał ten sam problem z Flask, pytest & factory-boy. Powyższe rozwiązanie naprawiło problem. – Burnash

6

Wpadłem na ten sam problem SQLite/Postgres z Flask i SQLAlchemy, podobnie jak Gordon Fierce. Jednak moje rozwiązanie było inne. Postgres jest ścisły o blokadach i połączeniach tabel, więc jawne zamknięcie połączenia sesji po rozpadzie rozwiązało problem dla mnie.

Mój kod roboczych:

@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() 

odniesienia SQLAlchemy: "W jaki sposób przejść o debugowanie coś takiego" http://docs.sqlalchemy.org/en/rel_0_8/faq.html#my-program-is-hanging-when-i-say-table-drop-metadata-drop-all

+2

Najnowsza lokalizacja odnośnika SQLAlchemy znajduje się tutaj: http://docs.sqlalchemy.org/en/latest/faq/metadata_schema.html#my-program-is-hanging-when-i-say-table-drop- metadata-drop-all – Mani

2

Aby odpowiedzieć na pytanie

  1. Run z py.test -m śladowej --trace dostać ślad wywołań Pythona.

  2. Jedną z opcji (przydatne dla zablokowanego binarnego systemu Unix) jest dołączenie do procesu za pomocą strace -p <PID>. Zobacz, jakie wywołanie systemowe może utknąć w lub pętli wywołań systemowych. na przykład zablokowane wywoływanie gettimeofday

  3. Aby uzyskać bardziej szczegółowy wynik py.test, zainstaluj pytest-sugar.Test pip install pytest-sugar i biegać z pytest.py --verbose . . . https://pypi.python.org/pypi/pytest-sugar

0

w moim przypadku aplikacja Kolba nie sprawdzić if __name__ == '__main__': więc wykonywane app.start() kiedy to nie było moim zamiarem.

Możesz przeczytać o wiele więcej szczegółów here.