Recherche de site Web

Python unittest - exemple de test unitaire


Aujourd'hui, nous allons apprendre à propos de unittest en Python et examiner des exemples de programmes de tests unitaires en Python. Dans le tutoriel précédent, nous avons appris à propos de la fonction zip en Python.

Python unittest

Le module unittest de Python 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 va renvoyer. Après avoir écrit un gros 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 comparer 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 avec un code simple. Dans ce tutoriel, nous allons discuter de l'utilisation de base du module unittest de Python et écrire quelques cas de tests unitaires en Python pour tester les fonctions d'une classe.

Exemple de source 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. Ainsi, 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 de unittest en Python

Maintenant, apprenons à coder pour les tests unitaires. Un cas de test individuel est créé en sous-classant unittest.TestCase. En redéfinissant ou en ajoutant des fonctions appropriées, nous pouvons ajouter de la logique pour tester. 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 unittest de 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, nous avons nommé le fichier pour les tests unitaires Basic_Test.py. Donc, la commande pour exécuter python unittest sera : $python3.6 -m unittest Basic_Test.Testing Si vous souhaitez voir le mode verbeux, alors la commande sera : $python3.6 -m unittest -v Basic_Test.Testing En utilisant PyCharm, nous obtenons la sortie ci-dessous.

Résultat des tests unitaires Python et fonctions de base

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

  1. D'accord : Si tous les cas de test sont réussis, la sortie affiche D'accord.
  2. Échec : Si l'un des cas de test échoue et soulève une exception AssertionError
  3. Erreur : Si une exception autre qu'une exception AssertionError est levée.

Il y a plusieurs fonctions dans le module unittest. Elles sont énumérées ci-dessous.

MéthodeVérifie que
assertÉgal(a,b)a==b
assertNotEqual(a,b)a != b
assertTrue(x)bool(x) est vrai
assertFalse(x)bool(x) est Faux
assertIs(a,b)a est b
assertIs(a,b)a est b
assertIsNot(a, b)a n'est pas b
assertIsNone(x)x est None
assertIsNotNone(x)x n'est pas None
assertIn(a, b)un dans b
assertNotIn(a, b)a n'est pas dans b
assertIsInstance(a, b)estinstance(a, b)
assertNotIsInstance(a, b)n'est pas une instance de(a, b)

Exemple de test unitaire Python

Maintenant, il est 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 œil au code suivant, vous 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()

Veuillez noter 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.

Exemple de sortie de 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 sur le tutoriel unittest de Python. Pour en savoir plus, consultez la documentation officielle. Pour toute question supplémentaire, veuillez utiliser la zone de commentaire. :)