Jak pominąć wewnętrzne ostrzeżenia o wycofaniu py.test

98

Czy istnieje sposób na pominięcie wewnętrznych ostrzeżeń pytest o przestarzałe?

Kontekst: chcę ocenić trudność przenoszenia zestawu testów z nosedo pytest. Zestaw jest dość duży i intensywnie używa generatorów testów opartych na nosestylu yield.

Chciałbym najpierw upewnić się, że istniejące testy przeszły pomyślnie z pytest, a następnie może zmienić generatory testów na parameterized.

Samo uruchomienie $ pytest path-to-test-folderz pytest 3.0.4 jest całkowicie zdominowane przez strony i strony

WC1 ~repos/numpy/numpy/lib/tests/test_twodim_base.py yield tests are deprecated, and scheduled to be removed in pytest 4.0

Czy istnieje sposób na wyłączenie tych ostrzeżeń?

ev-br
źródło

Odpowiedzi:

93

Od pytest --help:

--disable-pytest-warnings
                      disable warnings summary, overrides -r w flag
Kompilator
źródło
4
Jak mówi tekst pomocy, spowoduje to jedynie pominięcie podsumowania tekstowego. Wynik będzie nadal żółty i wskaże, że są ostrzeżenia.
David Pärsson
Lepiej umieścić w pliku pytest.ini, jak pokazano poniżej.
vy32
96

pytest -p no:warningslub dodaj następujące elementy do swojego pytest.ini lub tox.ini:

[pytest]
addopts = -p no:warnings

Wynik będzie zielony bez żadnych ostrzeżeń. Zobacz dokumentację pod adresem https://docs.pytest.org/en/latest/warnings.html#disiring-warnings-summary .

Może to być prawidłowy przypadek użycia zestawu testów, w którym chcesz uzyskać czysty wynik.

Należy pamiętać, że zawsze ukrywanie wszystkich ostrzeżeń może spowodować pominięcie ważnych ostrzeżeń. Jeśli chcesz ukryć tylko określone ostrzeżenia, spójrz na odpowiedź Cloca .

Blaise
źródło
2
addopts = -p no:warningsto NAPRAWDĘ ZŁY pomysł, a rozwiązanie CloC jest dużo rozsądniejsze, ale musiałem użyć twojego, gdy ignore::InsecureRequestWarningnie został rozpoznany, więc ty też dostajesz +1
Peter M. - oznacza Monikę.
Trwałe wyłączanie wszystkich ostrzeżeń (np. Przy użyciu pytest.ini) prawie nigdy nie jest dobrym pomysłem. Wyłączenie samego ostrzeżenia o wycofaniu (i według modułu), jak opisuje CloC, jest właściwym sposobem na zrobienie tego.
Neowizard
76

Myślę, że nie chcesz ukrywać wszystkich ostrzeżeń, ale tylko te, które nie są istotne. W tym przypadku ostrzeżenia o dezaktualizacji z zaimportowanych modułów Pythona.

Po przeczytaniu o pytest dokumentacji dotyczącej programu Warnings Capture :

Zarówno opcja wiersza poleceń -W, jak i opcja filterwarnings ini są oparte na własnej opcji -W Pythona i warnings.simplefilter , więc zapoznaj się z tymi sekcjami w dokumentacji Pythona, aby uzyskać inne przykłady i zaawansowane zastosowania.

Możesz więc filtrować ostrzeżenia za pomocą -Wopcji Pythona !

Wygląda na to, że pytestcałkowicie usuwa filtry, ponieważ pokazuje je wszystkie DeprecationWarningpodczas działania, a dokumentacja Pythona dotycząca domyślnych filtrów ostrzegawczych wyraźnie mówi:

W kompilacjach zwykłych wydań domyślny filtr ostrzeżeń zawiera następujące wpisy (w kolejności pierwszeństwa):

default::DeprecationWarning:__main__
ignore::DeprecationWarning
ignore::PendingDeprecationWarning
ignore::ImportWarning
ignore::ResourceWarning

Więc w twoim przypadku, jeśli chcesz, powiedzmy, filtrować typy ostrzeżeń, które chcesz zignorować, takie jak te DeprecationWarning, po prostu uruchom polecenie pytest z -Wopcją:

$ pytest path-to-test-folder -W ignore::DeprecationWarning

EDYCJA : Z komentarza coliniego można filtrować według modułu. Przykład ignorowania ostrzeżeń o wycofaniu ze wszystkich sqlalchemy:

ignore::DeprecationWarning:sqlalchemy.*:

Następnie możesz wyświetlić listę zainstalowanych modułów, które generują zbyt dużo szumu na wyjściu pytest

Użyj z plikiem zamiast w wierszu poleceń:

Możesz preferować listę tych filtrów w pliku pytest.ini:

[pytest]
filterwarnings =
    ignore::DeprecationWarning
CloC
źródło
12
Aby odfiltrować moduł, użyj wyrażenia regularnego. Przykład ignorowania ostrzeżeń o wycofaniu ze wszystkich modułów sqlalchemy:ignore::DeprecationWarning:sqlalchemy.*:
colini
@colini to zawiodło dla mnie jako argument do flagi -W, ale zadziałało u mnie w moim pliku pytest.ini.
WhiteHotLoveTiger
W pytest 6.1 końcowe wyrażenie regularne nie działa dla mnie, ale możesz wstawić wyrażenie w środku, aby dopasować je do początku komunikatu ostrzegawczego. ignore:.*U.*mode is deprecated:DeprecationWarningignoruje wszystkie ostrzeżenia typu DeprecationWarning, w których początek wiadomości jest zgodny z wyrażeniem regularnym „. * Tryb * U. * jest przestarzały”. więcej informacji
Matt Sanders
10

W pliku pytest.ini możesz dodać:

[pytest]
addopts = -p no:warnings

LUB przejście poniżej linii w linii poleceń. Może to być przydatne, jeśli zestawy testów obsługują ostrzeżenia przy użyciu systemu zewnętrznego.

-p nie: ostrzeżenia

LUB jeśli chcesz tylko ukryć określone przestarzałe ostrzeżenie, dodaj poniższą instrukcję w swoim pliku pytest.ini

[pytest]
filterwarnings =
    ignore:.*U.*mode is deprecated:DeprecationWarning

Spowoduje to zignorowanie wszystkich ostrzeżeń typu DeprecationWarning, w których początek wiadomości jest zgodny z wyrażeniem regularnym „. * Tryb * U. * jest przestarzały”.

LUB Chociaż nie jest to zalecane, możesz użyć

--disable-warnings

opcja wiersza polecenia, która całkowicie pomija podsumowanie ostrzeżenia z danych wyjściowych przebiegu testowego.

pk786
źródło
5

Nie chcę ukrywać wszystkich ostrzeżeń, więc wstawiam to pytest.ini

[pytest]
filterwarnings =
    ignore::DeprecationWarning
Polv
źródło