Recherche de site Web

Python unittest - exemple de test unitaire


Aujourd'hui, nous allons en apprendre davantage sur les tests unitaires python et examiner les exemples de programmes de tests unitaires python. Dans le didacticiel précédent, nous avons découvert la fonction python zip.

Test unitaire Python

Le module Python unittest est utilisé pour tester une unité de code source. Supposons que vous deviez tester votre projet. Vous savez quel type de données la fonction renverra. Après avoir écrit un énorme code, vous devez vérifier si la sortie est correcte ou non. Normalement, ce que nous faisons est d'imprimer la sortie et de la faire correspondre avec le fichier de sortie de référence ou de vérifier la sortie manuellement. Pour réduire cette douleur, Python a introduit le module unittest. En utilisant ce module, vous pouvez vérifier la sortie de la fonction par un code simple. Dans ce didacticiel, nous discuterons de l'utilisation de base du module Python unittest et écrirons quelques cas de test unitaire Python pour tester les fonctions d'une classe.

Source de l'exemple de test unitaire Python

Tout d'abord, nous devons écrire du code pour les tester unitairement. Nous aurons une classe Python. Le but principal de la classe est de stocker et de récupérer le nom d'une personne. Donc, nous écrivons 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 ci-dessous.

$ python3.6 Person.py 
User Abbas has been added with id  0
User associated with id 0 is  Abbas
$

Structure des tests unitaires Python

Maintenant, apprenons à coder pour les tests unitaires. Un cas de test individuel est créé en sous-classant unittest.TestCase. En remplaçant ou en ajoutant des fonctions appropriées, nous pouvons ajouter une logique à tester. Le code suivant sera réussi 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 python unittest

Résultat du test unitaire Python et fonctions de base

Ce test unitaire a 3 résultats possibles. Ils sont mentionnés ci-dessous :

  1. OK : si tous les scénarios de test sont réussis, la sortie indique OK.
  2. Échec : si l'un des cas de test a échoué et a généré une exception AssertionError
  3. Erreur : si une exception autre que l'exception AssertionError est déclenchée.

Il existe plusieurs fonctions sous le module unittest. Ils sont listés 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

Il est maintenant temps d'écrire des tests unitaires pour notre classe source Person. 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 oeil au code suivant, vous le comprendrez facilement.

import unittest

# This is the class we want to test. So, we need to import it
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

    # test case function to check the Person.set_name function
    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):
            # initialize a name
            name = 'name' + str(i)
            # store the name into the list variable
            self.user_name.append(name)
            # get the user id obtained from the function
            user_id = self.person.set_name(name)
            # check if the obtained user id is null or not
            self.assertIsNotNone(user_id)  # null user id will fail the test
            # store the user id to the list
            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")

    # test case function to check the Person.get_name function
    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):
            # if i not exceed total length then verify the returned name
            if i < length:
                # if the two name not matches it will fail the test case
                self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))
            else:
                print("Testing for get_name no user test")
                # if length exceeds then check the 'no such user' type message
                self.assertEqual('There is no such user', self.person.get_name(i))
        print("\nFinish get_name test\n")


if __name__ == '__main__':
    # begin the unittest.main()
    unittest.main()

Notez que le module unittest exécute les fonctions de test dans l'ordre de leur nom, et non dans l'ordre dans lequel elles sont définies. Et puisque 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.

Sortie d'exemple de test unitaire Python

$ 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 sur le tutoriel Python unittest. Pour en savoir plus, lisez la documentation officielle. Pour toute autre question, veuillez utiliser la zone de commentaire. :)

Articles connexes: