Finition de l'hématémèse, cadre de test automatisé Pytest - explication détaillée de la capture des informations d'avertissement (super fin)


avant-propos

capturer le message d'avertissement

À partir de la version 3.1, pytest détecte désormais automatiquement les avertissements lors de l'exécution des tests et les affiche à la fin de la session :

# content of test_show_warnings.py
import warnings

def api_v1():
    warnings.warn(UserWarning("api v1,should use functions from v2"))
    return 1

def test_one():
    assert api_v1() == 1

L'exécution de pytest produit maintenant cette sortie :

$ pytest test_show_warnings.py
=========================== test session starts ============================
platform linux -- Python 3.x.y,pytest-4.x.y,py-1.x.y,pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 1 item

test_show_warnings.py .                                             [100%]

============================= warnings summary =============================
test_show_warnings.py::test_one
  $REGENDOC_TMPDIR/test_show_warnings.py:5: UserWarning: api v1,should use functions from v2
    warnings.warn(UserWarning("api v1,should use functions from v2"))

-- Docs: https://docs.pytest.org/en/latest/warnings.html
=================== 1 passed,1 warnings in 0.12 seconds ===================

L'indicateur -W peut être passé pour contrôler quels avertissements seront affichés, et même les transformer en erreurs :

$ pytest -q test_show_warnings.py -W error::UserWarning
F                                                                    [100%]
================================= FAILURES =================================
_________________________________ test_one _________________________________

 def test_one():
>       assert api_v1() == 1

test_show_warnings.py:10:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

 def api_v1():
>       warnings.warn(UserWarning("api v1,should use functions from v2"))
E       UserWarning: api v1,should use functions from v2

test_show_warnings.py:5: UserWarning
1 failed in 0.12 seconds

La même option peut être définie dans le fichier pytest.ini à l'aide de l'option filterwarningsini. Par exemple, la configuration suivante ignorera tous les avertissements utilisateur, mais transformera tous les autres avertissements en erreurs.

[pytest]
filterwarnings =
 error
 ignore::UserWarning

Lorsqu'un avertissement correspond à plusieurs options de la liste, l'action de la dernière option correspondante sera exécutée.

L'option de ligne de commande -W et l'option filterwarningsINI sont basées sur Python

@pytest.mark.filterwarnings

Nouvelle fonction dans la version 3.2.

Vous pouvez ajouter des filtres d'avertissement à des éléments de test spécifiques à l'aide de @pytest.mark.filterwarnings pour avoir plus de contrôle sur les avertissements à intercepter au niveau du test, de la classe ou même du module :

import warnings

def api_v1():
    warnings.warn(UserWarning("api v1,should use functions from v2"))
    return 1

@pytest.mark.filterwarnings("ignore:api v1")
def test_one():
    assert api_v1() == 1

Les filtres appliqués à l'aide d'indicateurs ont priorité sur les filtres transmis sur la ligne de commande ou configurés par l'option filterwarningsini.

Vous pouvez appliquer tous les tests d'un module à tous les tests d'une classe en utilisant la marque filterwarnings comme décorateur de classe ou en définissant la variable pytestmark :

# turns all warnings into errors for this module
pytestmark = pytest.mark.filterwarnings("error")

Désactiver le résumé des avertissements

Bien que cela ne soit pas recommandé, vous pouvez supprimer complètement les résumés d'avertissement de la sortie du test à l'aide de l'option de ligne de commande --disable-warnings.

désactiver complètement la capture d'avertissement #
Ce plugin est activé par défaut, mais peut être complètement désactivé dans votre fichier pytest.ini :

[pytest]
addopts = -p no:warnings

Ou passez la ligne de commande. Cela peut être utile si la suite de tests gère les avertissements à l'aide d'un système externe. -pno : avertissements

Avertissements d'obsolescence et avertissements d'enregistrement de secours

Par défaut, pytest affichera les avertissements DeprecationWarning et PendingDeprecationWarning du code utilisateur et des bibliothèques tierces, comme suggéré dans [PEP-0565. Cela aide les utilisateurs à garder leur code moderne et à éviter les pannes tout en supprimant efficacement les avertissements obsolètes.

Parfois, il est utile de masquer certains avertissements de dépréciation qui se produisent dans du code hors de votre contrôle (par exemple, des bibliothèques tierces), auquel cas vous pouvez utiliser des options de filtre d'avertissement (ini ou flags) pour ignorer ces avertissements.

Par exemple:

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

Cela ignorera tous les types d'avertissements dont le message DeprecationWarning commence par une correspondance avec l'expression régulière. ".*U.*mode est obsolète"

Remarque :
Si vous configurez des avertissements au niveau de l'interpréteur, à l'aide de la variable d'environnement [PYTHONWARNINGS ou de l'option de ligne de commande -W, pytest ne configurera aucun filtre par défaut.

De plus, pytest ne suit pas la recommandation PEP-0506 de réinitialiser tous les filtres d'avertissement, car cela pourrait casser les suites de tests qui configurent elles-mêmes les filtres d'avertissement en appelant warnings.simplefilter (voir le problème [#2430 pour un exemple).

Assurez-vous que votre code déclenche des avertissements d'obsolescence

Vous pouvez également appeler l'assistant global pour vérifier si un certain appel de fonction déclenche unDeprecationWarning ou un PendingDeprecationWarning :

Vous pouvez également appeler l'assistant global pour vérifier si un certain appel de fonction déclenche unDeprecationWarning ou un PendingDeprecationWarning :

import pytest

def test_global():
    pytest.deprecated_call(myfunction,17)

Par défaut, DeprecationWarning et PendingDeprecationWarning ne sont pas interceptés lors de l'utilisation de pytest.warns ou recwarn car le filtre d'avertissement Python par défaut les masque. Si vous souhaitez les enregistrer dans votre propre code, utilisez la commande suivante warnings.simplefilter('always') :

import warnings
import pytest

def test_deprecation(recwarn):
    warnings.simplefilter("always")
    warnings.warn("deprecated",DeprecationWarning)
    assert len(recwarn) == 1
    assert recwarn.pop(DeprecationWarning)

Vous pouvez également l'utiliser comme gestionnaire de contexte :

def test_global():
    with pytest.deprecated_call():
        myobject.deprecated_method()

Faire valoir un avertissement avec la fonction d'avertissement

Vous pouvez vérifier si votre code déclenche un avertissement spécifique avec pytest.warns , qui fonctionne comme [ raises:

import warnings
import pytest

def test_warning():
    with pytest.warns(UserWarning):
        warnings.warn("my warning",UserWarning)

Le test échouera si aucun avertissement pertinent n'est émis. match affirme que l'exception correspond au texte ou à un argument de mot-clé d'expression régulière :

>>> with warns(UserWarning,match='must be 0 or None'):
...    warnings.warn("value must be 0 or None",UserWarning)

>>> with warns(UserWarning,match=r'must be \d+/pre>):
...    warnings.warn("value must be 42",UserWarning)

>>> with warns(UserWarning,match=r'must be \d+/pre>):
...    warnings.warn("this is not here",UserWarning)
Traceback (most recent call last):
  ...
Failed: DID NOT WARN. No warnings of type ...UserWarning... was emitted...

Vous pouvez également appeler la fonction ou la chaîne de code pytest.warns :

pytest.warns(expected_warning,func,*args,**kwargs)
pytest.warns(expected_warning,"func(*args,**kwargs)")

La fonction renvoie également une liste de tous les avertissements générés (en tant qu'objets warnings.WarningMessage), et vous pouvez demander des informations supplémentaires :

with pytest.warns(RuntimeWarning) as record:
    warnings.warn("another warning",RuntimeWarning)

# check that only one warning was raised
assert len(record) == 1
# check that the message matches
assert record[0].message.args[0] == "another warning"

message d'échec personnalisé

La journalisation des avertissements offre la possibilité de générer des messages d'échec de test personnalisés lorsque les avertissements ne sont pas émis ou que d'autres conditions sont remplies.

def test():
    with pytest.warns(Warning) as record:
        f()
        if not record:
            pytest.fail("Expected a warning!")

Si l'avertissement f n'est pas émis lors de l'appel de f, alors sera évalué à . Vous pouvez ensuite passer des appels avec des messages d'erreur personnalisés. pas d'enregistrement Truepytest.fail

Avertissements pytest internes

pytest peut générer ses propres avertissements dans certains cas, tels qu'une utilisation inappropriée ou des fonctions obsolètes.

Par exemple, pytest avertira s'il rencontre une classe qui correspond à python_classes mais définit également un constructeur __init__, car cela empêche l'instanciation de la classe :

# content of test_pytest_warnings.py
class Test:
    def __init__(self):
        pass

    def test_foo(self):
        assert 1 == 1
Ce qui suit est le diagramme de système d'architecture de connaissances d'ingénieur de test logiciel le plus complet en 2023 que j'ai compilé

1. De l'entrée à la maîtrise de la programmation Python

Veuillez ajouter une description de l'image

2. Combat réel du projet d'automatisation de l'interface

Veuillez ajouter une description de l'image

3. Combat réel du projet d'automatisation Web

Veuillez ajouter une description de l'image

4. Combat réel du projet d'automatisation des applications

Veuillez ajouter une description de l'image

5. CV des fabricants de premier rang

Veuillez ajouter une description de l'image

6. Tester et développer le système DevOps

Veuillez ajouter une description de l'image

7. Outils de test automatisés couramment utilisés

Veuillez ajouter une description de l'image

Huit, test de performance JMeter

Veuillez ajouter une description de l'image

9. Résumé (petite surprise à la fin)

Saisissez toutes les opportunités, osez prendre des risques, poursuivez vos rêves avec persévérance, même si le chemin à parcourir est cahoteux, vous devez aller de l'avant avec courage. Croyez en vos capacités, dépassez-vous et continuez à vous battre, vous commencerez votre propre vie brillante.

N'ayez pas peur de l'échec, car l'échec est le prélude au succès.Ce n'est qu'en vous efforçant constamment que vous pourrez créer votre propre éclat. Croyez en vos propres capacités, persévérez et poursuivez vos rêves, vous trouverez des possibilités et des réalisations infinies.

La vie est trop courte, ne perdez pas un temps précieux dans les regrets et les hésitations, poursuivez courageusement vos rêves et persistez dans la lutte. Ce n'est qu'en travaillant dur que vous pourrez créer votre propre vie brillante et rendre chaque jour plein de sens et d'accomplissement.

Acho que você gosta

Origin blog.csdn.net/m0_70102063/article/details/131853901
Recomendado
Clasificación