Contenu : guide
-
- avant-propos
- 1. De l'entrée à la maîtrise de la programmation Python
- 2. Combat réel du projet d'automatisation de l'interface
- 3. Combat réel du projet d'automatisation Web
- 4. Combat réel du projet d'automatisation des applications
- 5. CV des fabricants de premier rang
- 6. Tester et développer le système DevOps
- 7. Outils de test automatisés couramment utilisés
- Huit, test de performance JMeter
- 9. Résumé (petite surprise à la 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 True
pytest.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
2. Combat réel du projet d'automatisation de l'interface
3. Combat réel du projet d'automatisation Web
4. Combat réel du projet d'automatisation des applications
5. CV des fabricants de premier rang
6. Tester et développer le système DevOps
7. Outils de test automatisés couramment utilisés
Huit, test de performance JMeter
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.