Afin de pouvoir utiliser Pytest, vous devez au préalable l'installer. Pour cela, utilisez PyPI en exécutant la commande suivante dans le terminal :
pip install -U pytest
Vérifiez que Pytest est installé en tapant la commandepytest
. Pytest va alors lancer tous les tests de notre projet.
Comme vous pouvez le voir, aucun test n'est lancé. C'est normal, nous n'en avons pas écrit pour le moment !
Avant de le faire, commençons par créer un fichier de teststest.py
.
Écrivez un test avec Pytest
Afin de comprendre comment fonctionne Pytest, écrivons le code source ci-dessous dans un fichiersource.py
:
def reverse_str(initial_string):
final_string = ''
index = len(initial_string)
while index > 0:
final_string += initial_string[index - 2]
index = index - 1
return final_string
Ici, nous avons défini une fonction qui, lorsqu'elle sera exécutée, renverra l’inverse de la chaîne de caractères passée en paramètre.
J'ai écrit ensuite une nouvelle fonction, dans le fichiertest.py
, pour tester la fonctionreverse_str(initial_string)
.
Je commence en la nommanttest_should_reverse_string
car il s'agit d'un test qui permettra de vérifier si la fonction renvoie bien l’inverse de la chaîne de caractères. À l'intérieur, j'utilise le mot-cléassert
, puis un espace, et écris ce que je souhaite tester. Ainsi, si l’assertion n’est pas soulevée, le test passe !
Dans mon cas, je souhaite tester que le résultat de l'exécution de la fonctionreverse_str('abc')
renvoie bien une valeur égale à la chaîne de caractères"cba"
.
from source import reverse_str
def test_should_reverse_string():
assert reverse_str('abc') == 'cba'
Testons ! Lancez la commande :pytest test.py
.
Mince, cela ne fonctionne pas ! Mais Pytest a la bonne idée de nous indiquer la ligne défaillante, ainsi que la différence entre ce qui a été renvoyé par la fonction et ce que nous attendions.
La fonction a renvoyébac
, alors que nous souhaitions obtenircba
. Hum... 🤔
Allons vérifier de nouveau le code et voir si nous n’avons pas oublié une erreur.
En effet, j'ai fait une erreur à la ligne 5 ! Je m'empresse de la corriger.
def reverse_str(initial_string):
final_string = ''
index = len(initial_string)
while index > 0:
final_string += initial_string[index - 1] #Remplacer index - 2 par index - 1
index = index - 1
return final_string
Relançons les tests en entrant la commandepytest test.py
.
Tout est vert, nos tests sont bien validés !
Voici un screencast qui résume l’ensemble des étapes que nous avons vues ci-dessus afin de mettre en place votre premier test à l’aide de Pytest :
Organisez les fichiers de tests dans un projet
Avant même de commencer à écrire l’ensemble des tests de votre projet, il est important d’organiser l’architecture de notre projet afin de séparer le code source et les tests. Néanmoins, il existe quelques méthodes qui permettent tout de même facilement de retrouver le code source associé aux tests.
Vous pouvez tout d’abord créer une arborescence dédiée aux tests, cette méthode permettra de regrouper l’ensemble des tests de l’application au même endroit.
Quelques bonnes pratiques :
Créer une arborescence de tests calquée sur le répertoire des fichiers sources.
Nommer les fichiers de tests avec le même nom que le fichier source précédé de
test_
.
Pytest va en effet lancer les tests de tous les fichiers qui commencent partest_
ou qui finissent par_test
. Avec cette méthode, vous pouvez simplement lancer la commandepytest
pour lancer tous les tests de votre projet.
Écrivez les premiers tests du projet
Nous allons maintenant écrire nos propres tests sur le projet Calculatrice !
Le premier test va vérifier que le comportement de la méthodeaddition
dans la classeOperators
est correct.
Voyons les différentes étapes !
Avant tout, nous devons créer un fichier de test dans l’arborescence de test que nous nommeronstest_operators.py
. Ensuite, nous devons importer le module contenant le fichier source dans le fichier de test pour pouvoir en utiliser les différents éléments.
Pour cela, ajoutons la ligne d’importation suivante :
from calculate.operators import Operators
Écrivons maintenant le test associé.
def test_should_make_multiple_addition():
sut = Operators()
operation = "5.5 + 10 + 30 + 13.7"
expected_value = 59.2
assert sut.addition(operation) == expected_value
Vous pouvez maintenant lancer la commandepytest
à la racine de votre projet pour vérifier si le test passe :
Le test passe !
Je vous résume l’ensemble de ces étapes dans le screencast ci-dessous, vous pourrez suivre chacune de ces étapes pour mettre vous-même en place le premier test du projet.
À vous de jouer !
Vous allez devoir mettre en place l’ensemble des tests unitaires du projet super-calculatrice, qui permettent de vérifier la logique du code. Et nous souhaitons que vous implémentiez les tests en utilisant Pytest pour vous entraîner.
Votre mission :
Ajoutez un package de tests qui contiendra l’arborescence de tests.
Créez la suite de tests concernant le module view avec Pytest.
Créez la suite de tests concernant le module operators avec Pytest.
Retrouvez une proposition de correction sur GitHub !
En résumé
Il sera très utile d’organiser ses tests dans un répertoire dédié aux tests et en calquant l’arborescence du code source.
Pour implémenter un test, il faut définir une fonction commençant par le préfixe
test_
ou terminant par le suffixe_test
.Le mot-clé
assert
permet de vérifier les éléments que nous souhaitons valider.Lancez les tests d’un module de tests à l’aide de la commande
pytest nom_du_module.py
.
Vous savez maintenant écrire des tests unitaires à l’aide du framework Pytest. Il est tout de même intéressant de connaître les particularités du framework Unittest. Ainsi, nous verrons dans le prochain chapitre comment mettre en place des tests unitaires à l’aide du framework Unittest.