Aujourd’hui, nous allons apprendre sur python unittest et examiner des exemples de programmes de test unitaire en python. Dans le didacticiel précédent, nous avons appris sur la fonction zip en python .
Python unittest
Le module Python unittest est utilisé pour tester une unité de code source. Supposons que vous ayez besoin de tester votre projet. Vous savez quel type de données la fonction renverra. Après avoir écrit un code volumineux, vous devez le vérifier pour savoir si la sortie est correcte ou non. Normalement, ce que nous faisons, c’est afficher la sortie et la comparer avec le fichier de sortie de référence ou vérifier la sortie manuellement. Pour réduire cette difficulté, Python a introduit le module unittest. En utilisant ce module, vous pouvez vérifier la sortie de la fonction avec un code simple. Dans ce didacticiel, nous discuterons de l’utilisation de base du module Python unittest et rédigerons des cas de test unitaires en python pour tester les fonctions d’une classe.
Exemple de code source de test unitaire Python
Tout d’abord, nous devons écrire du code pour les tester. Nous aurons une classe Python. Le but principal de la classe est de stocker et récupérer le nom d’une personne. Nous écrivons donc la fonction set_name()
pour stocker les données et la fonction get_name()
pour récupérer le nom de la classe.
class Person:
name = []
def set_name(self, user_name):
self.name.append(user_name)
return len(self.name) - 1
def get_name(self, user_id):
if user_id >= len(self.name):
return 'There is no such user'
else:
return self.name[user_id]
if __name__ == '__main__':
person = Person()
print('User Abbas has been added with id ', person.set_name('Abbas'))
print('User associated with id 0 is ', person.get_name(0))
Nous avons nommé le fichier de classe Person.py
. Et la sortie du code ci-dessus sera comme suit.
$ python3.6 Person.py
User Abbas has been added with id 0
User associated with id 0 is Abbas
$
Structure de test unitaire Python
Maintenant, apprenons à coder pour les tests unitaires. Un test individuel est créé en sous-classant unittest.TestCase
. En remplaçant ou en ajoutant des fonctions appropriées, nous pouvons ajouter de la logique pour les tests. Le code suivant réussira si a est égal à b.
import unittest
class Testing(unittest.TestCase):
def test_string(self):
a = 'some'
b = 'some'
self.assertEqual(a, b)
def test_boolean(self):
a = True
b = True
self.assertEqual(a, b)
if __name__ == '__main__':
unittest.main()
Comment exécuter le module de test unitaire Python
Si vous utilisez l’IDE PyCharm, vous pouvez simplement appuyer sur ctrl+shift+F10 pour exécuter le module unittest. Sinon, vous pouvez utiliser l’invite de commande pour exécuter ce module. Par exemple, si nous avons nommé le fichier pour les tests unitaires Basic_Test.py
, la commande pour exécuter les tests unitaires Python sera : $python3.6 -m unittest Basic_Test.Testing
Si vous voulez voir le détail, alors la commande sera : $python3.6 -m unittest -v Basic_Test.Testing
En utilisant PyCharm, nous obtenons la sortie suivante.
Résultat du Test Unitaire Python & Fonctions Basiques
Ce test unitaire a 3 résultats possibles. Ils sont mentionnés ci-dessous :
- OK : Si tous les cas de test sont réussis, la sortie affiche OK.
- Échec : Si l’un des cas de test échoue et soulève une exception AssertionError
- Erreur : Si une exception autre que l’exception AssertionError est levée.
Il existe plusieurs fonctions sous le module unittest. Elles sont énumérées ci-dessous.
Method | Checks that |
---|---|
assertEqual(a,b) | a==b |
assertNotEqual(a,b) | a != b |
assertTrue(x) | bool(x) is True |
assertFalse(x) | bool(x) is False |
assertIs(a,b) | a is b |
assertIs(a,b) | a is b |
assertIsNot(a, b) | a is not b |
assertIsNone(x) | x is None |
assertIsNotNone(x) | x is not None |
assertIn(a, b) | a in b |
assertNotIn(a, b) | a not in b |
assertIsInstance(a, b) | isinstance(a, b) |
assertNotIsInstance(a, b) | not isinstance(a, b) |
Exemple de test unitaire Python
Maintenant, il est temps d’écrire des tests unitaires pour notre classe source Personne
. Dans cette classe, nous avons implémenté deux fonctions – get_name()
et set_name()
. Maintenant, nous allons tester ces fonctions en utilisant unittest
. Nous avons donc conçu deux cas de test pour ces deux fonctions. Jetez un œil au code suivant, vous le comprendrez facilement.
import unittest
# Ceci est la classe que nous voulons tester. Donc, nous devons l'importer
import Person as PersonClass
class Test(unittest.TestCase):
"""
The basic class that inherits unittest.TestCase
"""
person = PersonClass.Person() # instantiate the Person Class
user_id = [] # variable that stores obtained user_id
user_name = [] # variable that stores person name
# fonction de cas de test pour vérifier la fonction Personne.set_name
def test_0_set_name(self):
print("Start set_name test\n")
"""
Any method which starts with ``test_`` will considered as a test case.
"""
for i in range(4):
# initialiser un nom
name = 'name' + str(i)
# stocker le nom dans la variable de liste
self.user_name.append(name)
# obtenir l'identifiant utilisateur obtenu à partir de la fonction
user_id = self.person.set_name(name)
# vérifier si l'identifiant utilisateur obtenu est nul ou non
self.assertIsNotNone(user_id) # null user id will fail the test
# stocker l'identifiant utilisateur dans la liste
self.user_id.append(user_id)
print("user_id length = ", len(self.user_id))
print(self.user_id)
print("user_name length = ", len(self.user_name))
print(self.user_name)
print("\nFinish set_name test\n")
# fonction de cas de test pour vérifier la fonction Personne.get_name
def test_1_get_name(self):
print("\nStart get_name test\n")
"""
Any method that starts with ``test_`` will be considered as a test case.
"""
length = len(self.user_id) # total number of stored user information
print("user_id length = ", length)
print("user_name length = ", len(self.user_name))
for i in range(6):
# si je ne dépasse pas la longueur totale alors vérifier le nom retourné
if i < length:
# si les deux noms ne correspondent pas, le cas de test échouera
self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))
else:
print("Testing for get_name no user test")
# si la longueur dépasse, alors vérifier le message de type 'aucun utilisateur trouvé'
self.assertEqual('There is no such user', self.person.get_name(i))
print("\nFinish get_name test\n")
if __name__ == '__main__':
# commencer unittest.main()
unittest.main()
Remarquez que le module unittest exécute les fonctions de test dans l’ordre de leur nom, pas dans l’ordre où elles sont définies. Et comme nous voulons que notre test set_name s’exécute en premier, nous avons nommé nos fonctions de cas de test comme test_0_set_name
et test_1_get_name
.
Exemple de sortie du test unitaire Python
Les images ci-dessous montrent la sortie produite par notre programme de test unitaire, à la fois en mode normal et en mode verbeux.
$ python3.6 -m unittest -v PersonTest.Test
test_0_set_name (PersonTest.Test) ... Start set_name test
user_id length = 4
[0, 1, 2, 3]
user_name length = 4
['name0', 'name1', 'name2', 'name3']
Finish set_name test
ok
test_1_get_name (PersonTest.Test) ...
Start get_name test
user_id length = 4
user_name length = 4
Testing for get_name no user test
Testing for get_name no user test
Finish get_name test
ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
$
C’est tout pour le tutoriel sur les tests unitaires Python. Pour en savoir plus, consultez la Documentation officielle. Pour toute question supplémentaire, veuillez utiliser la boîte de commentaire. 🙂
Source:
https://www.digitalocean.com/community/tutorials/python-unittest-unit-test-example