Comment supprimer les avertissements d'obsolescence internes de py.test

94

Existe-t-il un moyen de supprimer les avertissements de dépréciation internes du pytest?

Contexte: je cherche à évaluer la difficulté de porter une suite de tests de nosevers pytest. La suite est assez grande et utilise beaucoup nose-style yieldgénérateurs de test basés.

Je voudrais d'abord m'assurer que les tests existants réussissent avec pytest, puis peut-être changer les générateurs de test en parameterized.

Le $ pytest path-to-test-foldersimple fonctionnement avec pytest 3.0.4 est complètement dominé par les pages et les pages de

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

Existe-t-il un moyen de désactiver ces avertissements?

ev-br
la source

Réponses:

85

De pytest --help:

--disable-pytest-warnings
                      disable warnings summary, overrides -r w flag
Le compilateur
la source
4
Comme l'indique le texte d'aide, cela n'omettra que le résumé textuel. Le résultat sera toujours jaune et indiquera qu'il y a des avertissements.
David Pärsson
Mieux vaut mettre dans le fichier pytest.ini, comme indiqué ci-dessous.
vy32
93

pytest -p no:warnings, ou ajoutez ce qui suit à votre pytest.ini ou tox.ini:

[pytest]
addopts = -p no:warnings

Le résultat sera vert sans aucune indication d'avertissement. Consultez la documentation sur https://docs.pytest.org/en/latest/warnings.html#disabling-warnings-summary .

Cela peut être un cas d'utilisation valide pour une suite de tests où vous voulez une sortie propre.

Sachez que toujours cacher tous les avertissements peut vous faire manquer des avertissements importants. Si vous souhaitez masquer uniquement des avertissements spécifiques, regardez la réponse de Cloc .

Blaise
la source
2
addopts = -p no:warningsest VRAIMENT MAUVAISE idée, et la solution CloC est beaucoup plus saine, mais j'ai dû utiliser la vôtre lorsqu'elle ignore::InsecureRequestWarningn'était pas reconnue, vous obtenez donc +1 aussi
Peter M. - signifie Monica le
La désactivation permanente de tous les avertissements (c'est-à-dire en utilisant pytest.ini) n'est presque jamais une bonne idée. Désactiver uniquement l'avertissement de dépréciation (et par module) comme le décrit CloC est la bonne façon de le faire.
Neowizard
71

Je pense que vous ne voulez pas cacher tous les avertissements, mais seulement ceux qui ne sont pas pertinents. Et dans ce cas, les avertissements de dépréciation des modules python importés.

Lire la documentation pytest sur Warnings Capture :

L'option de ligne de commande -W et l'option ini filterwarnings sont basées sur l' option -W et warnings.simplefilter de Python , veuillez donc vous référer à ces sections dans la documentation Python pour d'autres exemples et une utilisation avancée.

Ainsi, vous pouvez filtrer les avertissements avec python -W option !

Il semble que cela pytestsupprime complètement les filtres, car il montre tous ceux DeprecationWarninglors de l'exécution, et la documentation de Python sur les filtres d'avertissement par défaut dit clairement:

Dans les versions de version standard, le filtre d'avertissement par défaut contient les entrées suivantes (par ordre de priorité):

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

Donc, dans votre cas, si vous voulez laisser dire à filtrer les types d'avertissement que vous souhaitez ignorer, tels que ceux-ci DeprecationWarning, exécutez simplement la commande pytest avec l' -Woption:

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

EDIT : A partir du commentaire de colini , il est possible de filtrer par module. Exemple pour ignorer les avertissements d'obsolescence de tous les sqlalchemy:

ignore::DeprecationWarning:sqlalchemy.*:

Vous pouvez ensuite lister vos modules installés qui créent trop de bruit dans la sortie de pytest

À utiliser avec un fichier plutôt qu'en ligne de commande:

Vous pouvez préférer lister ces filtres dans le fichier pytest.ini:

[pytest]
filterwarnings =
    ignore::DeprecationWarning
CloC
la source
9
Pour filtrer sur le module, vous utilisez une regex. Exemple pour ignorer les avertissements d'obsolescence de tous les modules sqlalchemy:ignore::DeprecationWarning:sqlalchemy.*:
colini
@colini qui a échoué pour moi en tant qu'argument du drapeau -W, mais cela a fonctionné pour moi dans mon fichier pytest.ini.
WhiteHotLoveTiger
6

Dans le fichier pytest.ini, vous pouvez ajouter:

[pytest]
addopts = -p no:warnings

OU en passant sous la ligne dans la ligne de commande. Cela peut être utile si vos suites de tests gèrent les avertissements à l'aide d'un système externe.

-p non: avertissements

OU si vous souhaitez uniquement masquer un avertissement obsolète spécifique, ajoutez l'instruction ci-dessous dans votre fichier pytest.ini

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

Cela ignorera tous les avertissements de type DeprecationWarning où le début du message correspond à l'expression régulière ". * U. * mode is deprecation".

OU Bien que non recommandé, vous pouvez utiliser le

--disable-warnings

option de ligne de commande pour supprimer entièrement le résumé des avertissements de la sortie du test.

pk786
la source
5

Je ne veux pas cacher tous les avertissements, alors je mets ça pytest.ini

[pytest]
filterwarnings =
    ignore::DeprecationWarning
Polv
la source