Python unittest – exemple de test unitaire

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 :

  1. OK : Si tous les cas de test sont réussis, la sortie affiche OK.
  2. Échec : Si l’un des cas de test échoue et soulève une exception AssertionError
  3. 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