La configuration d'une suite de tests pour votre code peut sembler être un obstacle auquel vous n'êtes pas prêt, mais cette bibliothèque prend beaucoup de temps.

Les tests sont une partie essentielle du développement logiciel. Cela aide à détecter les bogues tôt et réduit la probabilité d'erreurs sur toute la ligne.

Pytest est l'un des frameworks de test les plus populaires pour Python. Il vous permet d'écrire des tests petits et lisibles qui peuvent évoluer à mesure que votre application se développe. Découvrez comment configurer et utiliser Pytest avec votre code Python.

Configuration de Pytest

Avant d'installer Pytest, il est préférable de créer un environnement virtuel pour isoler votre environnement de test, afin d'éviter les conflits avec d'autres packages et dépendances.

Pour créer un environnement virtuel, exécutez la commande suivante avant d'installer Pytest.

test python -m venv

Cela créera un nouvel environnement virtuel nommé tests dans votre répertoire actuel. Pour activer l'environnement, exécutez cette commande si vous êtes sous Linux ou Mac :

sources tests/bin/activer

Pour Windows, exécutez cette commande :

tests\\Scripts\\activer

Pour installer Pytest, vous pouvez utiliser pip, le gestionnaire de packages Python, avec cette commande dans votre terminal :

pip installer pytest

Si vous n'avez pas de Pip, ne vous inquiétez pas; tu peux installer Pip sur Windows, Mac et Linux.

Exécutez la commande suivante pour vérifier si vous avez correctement installé Pytest.

pytest --version

Cela devrait renvoyer le numéro de version installée.

Création de votre premier test

Considérez la fonction suivante qui additionne deux nombres et renvoie le résultat.

définitivementadd_numbers(un B):
retour un + b

Plusieurs choses peuvent mal tourner avec cette fonction. Par exemple, considérez ce qui se passe si vous appelez la fonction avec des valeurs non numériques telles que Aucune ou une valeur de type chaîne. Ce sont quelques-uns des cas extrêmes potentiels qui peuvent entraîner l'échec de la fonction.

L'un des premiers tests que vous écrivez doit vérifier si la fonction renvoie le résultat attendu. Pour ce faire, vous pouvez utiliser le mot-clé assert pour comparer la sortie réelle de la fonction à la sortie attendue. Dans le cas de la fonction add_numbers, la fonction de test pourrait ressembler à ceci :

définitivementtest_add_numbers():
affirmer add_numbers(2, 3) == 5
affirmer add_numbers(-1, 1) == 0
affirmer add_numbers(0, 0) == 0

Cette fonction de test comprend trois instructions assert, chacune comparant la sortie de la fonction add_numbers à une valeur attendue. Le premier test vérifie que l'addition de 2 et 3 renvoie 5, le deuxième test vérifie que l'addition de -1 et 1 renvoie 0, et le troisième test vérifie que l'addition de 0 et 0 renvoie 0.

Comment exécuter des tests avec Pytest

Après avoir écrit vos tests, l'étape suivante consiste à les exécuter. Pour ce faire avec Pytest, accédez au répertoire contenant votre fichier de test et exécutez la commande pytest :

pytest

Si tout fonctionne comme prévu, vous verrez un message indiquant que tous les tests ont réussi. Cependant, si l'une des assertions échoue, Pytest signalera une erreur et vous montrera les valeurs d'entrée qui ont causé l'échec.

Par exemple, supposons que vous ayez exécuté la fonction de test suivante pour la fonction add_numbers :

définitivementtest_add_numbers():
affirmer add_numbers(2, 3) == 6
affirmer add_numbers(-1, 1) == 0
affirmer add_numbers(0, 0) == 0

La première assertion échouera car la valeur attendue était 6, mais la valeur réelle était 5 (la somme de 2 et 3). Pytest renverra le message suivant :

Ce message vous montre les valeurs d'entrée qui ont causé la valeur et vous indique également quelle devrait être la valeur réelle. Cela facilite l'identification et la correction rapides des erreurs dans votre code.

Utilisation de Pytest.raises pour affirmer des exceptions

Maintenant, écrivons un test pour couvrir l'un des cas extrêmes de la fonction add_numbers. Lorsque vous transmettez un argument non numérique tel que None à la fonction, Python doit déclencher une exception TypeError.

Vous devriez déjà être gérer les exceptions dans vos programmes Python, et vous pouvez tester que votre code les génère également correctement.

Pour ce faire, copiez la fonction de test suivante dans votre fichier. Il utilise le gestionnaire de contexte pytest.raises pour vérifier si l'appel de la fonction add_number avec "None" déclenche une exception TypeError.

importer pytest

définitivementtest_add_numbers_with_invalid_inputs():
avec pytest.raises (TypeError):
add_numbers(Aucun, 2)

Exécutez ensuite Pytest à partir de la ligne de commande. Si l'exception n'est pas levée, le test échouera.

Vous pouvez aller plus loin et vérifier les détails du message d'exception. Le gestionnaire de contexte produit un objet ExceptionInfo avec les détails.

Par exemple, dans cette fonction de test, affirmez le message d'exception comme ceci :

définitivementtest_add_numbers_with_invalid_inputs():
avec pytest.raises(Erreur-type) comme exc_info :
add_numbers(Aucun, 2)

affirmer exc_info.value.args[0] == "type(s) d'opérande non pris en charge pour +: 'NoneType' et 'int'"

Si le message ne correspond pas à celui du test, Pytest indiquera un échec.

Comment utiliser les tests paramétrés pour tester plusieurs entrées à la fois

Au lieu d'appeler manuellement une fonction avec plusieurs entrées comme celle-ci :

définitivementtest_add_numbers():
affirmer add_numbers(2, 3) == 6
affirmer add_numbers(-1, 1) == 0
affirmer add_numbers(0, 0) == 0

Pytest fournit une fonctionnalité de test paramétrée qui vous permet de faire la même chose plus facilement. Voici comment vous pouvez réécrire la fonction de test ci-dessus :

importer pytest

@pytest.mark.paramétrer("a, b, attendu", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0)
])
définitivementtest_add_numbers(a, b, attendu):
affirmeradd_numbers(un B)== attendu

Comment exécuter plusieurs tests

Jusqu'à présent, vous n'avez écrit que deux tests pour la fonction add_numbers. Pour les fonctions plus complexes avec plus de tests, vous pouvez les regrouper dans une classe.

Par exemple, voici comment créer une classe de test pour la fonction add.

classeTestAjouterFonction:
@pytest.mark.parametrize("a, b, attendu", [
(2, 3, 5),
(-1, 1, 0),
(0, 0, 0),
])
définitivementtest_addition_with_numbers(soi, a, b, attendu):
affirmer add_numbers (a, b) == attendu

définitivementtest_add_numbers_with_invalid_inputs(soi):
avec pytest.raises (TypeError) comme exc_info :
add_numbers(Aucun, 2)
affirmer exc_info.value.args[0] == "type(s) d'opérande non pris en charge pour +: 'NoneType' et 'int'"

Notez que vous devez préfixer le nom de la classe avec "Test" afin que Pytest puisse l'identifier comme une classe de test et l'exécuter.

Pytest a beaucoup plus de fonctionnalités

En utilisant Pytest, vous pouvez vérifier automatiquement que votre code fonctionne comme prévu. Pytest offre de nombreuses autres fonctionnalités telles que des montages qui vous permettent de configurer et de supprimer des données de test et des marques pour configurer des métadonnées sur vos fonctions de test.

De plus, vous pouvez intégrer Pytest dans votre pipeline CI et commencer à exécuter des tests automatiquement et en continu lorsque vous modifiez votre code.