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?
Odpowiedz
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.
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.
Miał ten sam problem z Flask, pytest & factory-boy. Powyższe rozwiązanie naprawiło problem. – Burnash
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
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
Aby odpowiedzieć na pytanie
Run z py.test -m śladowej --trace dostać ślad wywołań Pythona.
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 gettimeofdayAby uzyskać bardziej szczegółowy wynik py.test, zainstaluj pytest-sugar.Test
pip install pytest-sugar
i biegać zpytest.py --verbose . . .
https://pypi.python.org/pypi/pytest-sugar
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.
- 1. Co zrobić, gdy rubygems.org nie działa?
- 2. Co zrobić, gdy: - java.io.FileNotFoundException: brak dostawcy treści?
- 3. Co zrobić, gdy funkcja zostanie upuszczona w ostatniej chwili?
- 4. Logowanie w testach py.test
- 5. wisi w Xcode
- 6. Jak emitować sygnał z QPushButton, gdy mysz na nim wisi?
- 7. Co zrobić, gdy "wycieki pamięci" są spowodowane przez strukturę Foundation?
- 8. Co zrobić, gdy poprawka do importu Mercurial nie powiedzie się?
- 9. Co zrobić, gdy ServerSocket zgłasza wyjątek IOException i utrzymuje serwer?
- 10. Generowanie testów py.test w python
- 11. Co zrobić, gdy trzeba przechowywać (bardzo) dużą liczbę?
- 12. Java zrobić, gdy, podczas
- 13. Co robi? zrobić w Elixir
- 14. Co robi/[\ []/zrobić w JavaScript?
- 15. py.test: error: nierozpoznane argumenty
- 16. Instalacja Gem wisi w nieskończoność
- 17. Co robi :: zrobić?
- 18. Co ciągnie git. zrobić?
- 19. Co może zrobić glStencil?
- 20. co tutaj "zrobić"? (java)
- 21. Co mogę zrobić z RaisePropertyChanged?
- 22. py.test klasy testowania parametrami
- 23. polecenia openssl wisi
- 24. Co zrobić, jeśli ["x"! = X] zrobić w bash?
- 25. IUIAutomation :: RemoveAllEventHandlers wisi
- 26. Instalacja VS2015 wisi w zawieszeniu
- 27. py.test: Pokaż zmienne lokalne w Jenkins
- 28. git wisi na pchnięciu
- 29. Uszkodzenie segmentacji samo wisi
- 30. Py.test: parametrize przypadki testowe z klas
Poszukuję jakiejś funkcji limitu czasu - nie wiem, czy coś takiego jest wbudowane w py.test ... –
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
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? –