assertEqual en assertEquals en Python

Aditya Raj 30 janvier 2023
  1. Qu’est-ce qu’une déclaration assert en Python
  2. La méthode assertEquals() en Python
  3. La méthode assertEqual() en Python
  4. Conclusion
assertEqual en assertEquals en Python

Lors de la création de logiciels, nous devons implémenter une logique métier à l’aide du code.

Pour nous assurer que nous implémentons toute la logique et les contraintes, nous utilisons les déclarations assert dans nos programmes. Dans les grandes applications, nous utilisons les tests unitaires à l’aide des méthodes assertEquals() et assertEqual() en Python.

Nous discuterons du fonctionnement d’une instruction assert en Python. Nous verrons également comment utiliser les méthodes assertEquals() et assertEqual() pour implémenter la logique métier et les contraintes en Python.

Qu’est-ce qu’une déclaration assert en Python

En Python, une instruction assert vérifie si une expression est True ou False. La syntaxe de l’instruction assert est la suivante.

assert conditional_expression

Ici, assert est le mot-clé. L’expression_conditionnelle est une instruction conditionnelle qui évalue les instructions comme True ou False.

Si l’conditional_expression est évaluée à True, l’exécution du programme passe à l’instruction suivante. D’un autre côté, si conditional_expression est évalué à False, le programme lève l’exception AssertionError.

Nous pouvons voir tout cela ci-dessous.

num1 = 10
num2 = 5
num3 = 10
print("This statement will get printed")
assert num1 == num3
print(
    "This statement will also get printed as the expression in the above assert statement is True."
)
assert num2 == num3
print(
    "This statement will not get printed as the expression in the above assert statement is False. This line of code is unreachable."
)

Production :

This statement will get printed
This statement will also get printed as the expression in the above assert statement is True.

Traceback (most recent call last):
  File "tempy.py", line 9, in <module>
    assert num2 == num3
AssertionError

Ici, vous pouvez observer que la première instruction d’impression est exécutée automatiquement.

L’instruction assert num1 == num3 ne génère aucune erreur car 10==10 est évalué à True. Ainsi, la deuxième instruction d’impression est également exécutée.

Après cela, l’instruction "assert num2 == num3" lève le AssertionError car 5==10 est évalué à False. Pour cette raison, l’exécution du programme s’arrête et la troisième instruction d’impression n’est jamais exécutée.

Nous pouvons également afficher un message lorsque l’exception AssertionError se produit. Pour cela, nous utiliserons la syntaxe suivante.

assert conditional_expression, message

Ici, le message est une chaîne qui est imprimée lorsque conditional_expression est évalué à False et que AssertionError se produit. Nous pouvons voir cela ci-dessous.

num1 = 10
num2 = 5
num3 = 10
print("This statement will get printed")
assert num1 == num3, "{} is not equal to {}".format(num1, num2)
print(
    "This statement will also get printed as the expression in the above assert statement is True."
)
assert num2 == num3, "{} is not equal to {}".format(num2, num3)
print(
    "This statement will not get printed as the expression in the above assert statement is False. This line of code is unreachable."
)

Production :

This statement will get printed
This statement will also get printed as the expression in the above assert statement is True.

Traceback (most recent call last):
  File "tempy.py", line 9, in <module>
    assert num2 == num3, "{} is not equal to {}".format(num2, num3)
AssertionError: 5 is not equal to 10

La sortie 5 n'est pas égal à 10 est également imprimée après la notification de AssertionError. L’inclusion de ces types de messages vous aidera à tester plus facilement les fonctions de votre programme car vous pouvez notifier l’exigence à l’aide du message chaque fois que l’exception AssertionError se produit.

Nous pouvons utiliser l’instruction assert pour appliquer des contraintes ou implémenter une logique métier en Python. Cependant, l’utilisation de l’instruction assert présente un inconvénient : elle arrête l’exécution du programme une fois que l’instruction conditionnelle d’une instruction assert est évaluée à False.

Ainsi, dans les grands programmes avec des milliers de contraintes et de conditions, nous devrons exécuter le programme autant de fois que l’exception AssertionError se produit.

Pour surmonter cela, nous pouvons utiliser l’instruction assertEquals() ou assertEqual() comme indiqué ci-dessus.

La méthode assertEquals() en Python

Pour faire respecter les contraintes et la logique métier dans le logiciel, on peut utiliser le module unittest.

Le module unittest nous fournit de nombreuses méthodes que nous pouvons utiliser pour imposer des contraintes. Pour implémenter des assertions d’égalité, nous pouvons utiliser la méthode assertEquals() et la méthode assertEqual().

Pour implémenter des assertions d’égalité à l’aide de la méthode assertEquals(), nous allons d’abord créer une classe qui est une sous-classe de la classe TestCase définie dans le module unittest. Ensuite, nous pouvons définir des assertions d’égalité en utilisant la syntaxe suivante de la méthode assertEquals().

self.assertEquals(self, first, second)

Ici, le paramètre first accepte la première valeur comme argument d’entrée. Le paramètre second accepte la seconde valeur comme argument d’entrée.

Si le paramètre first est égal à la valeur du paramètre second, le test unitaire réussira. Sinon, une exception AssertionError est déclenchée à la ligne en cours et l’utilisateur est averti de l’erreur.

Par conséquent, le cas de test échoue, mais l’exécution du programme ne s’arrête pas comme dans le cas de l’instruction assert. Le programme exécute tous les cas de test, puis informe le développeur de toutes les erreurs.

Nous pouvons voir cela ci-dessous.

import unittest


class Tester(unittest.TestCase):
    def setUp(self):
        self.num1 = 10
        self.num2 = 5
        self.num3 = 10

    def tearDown(self):
        print("\nTest case completed. Result:")

    def test_condition1(self):
        self.assertEquals(self.num1, self.num3)

    def test_condition2(self):
        self.assertEquals(self.num2, self.num3)


if __name__ == "__main__":
    unittest.main()

Production :

/home/aditya1117/PycharmProjects/pythonProject/webscraping.py:14: DeprecationWarning: Please use assertEqual instead.
  self.assertEquals(self.num1, self.num3)
.F
======================================================================
FAIL: test_condition2 (__main__.Tester)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/webscraping.py", line 17, in test_condition2
    self.assertEquals(self.num2, self.num3)
AssertionError: 5 != 10

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)

Test case completed. Result:

Test case completed. Result:

Ici, lorsque la méthode unittest.main() est exécutée, une instance de la classe Tester est créée. Après cela, la méthode setUp() est exécutée. La méthode setUp() initialise les variables et importe les valeurs des autres modules vers la classe Tester.

Vous pouvez également observer que nous avons implémenté les méthodes test_condition1() et test_condition2(). Ici, nous avons inclus test_ avant le nom condition1 et condition2 pour faire comprendre à l’interpréteur que ces méthodes sont utilisées pour appliquer les cas de test.

Si nous ne spécifions pas le nom de la méthode commençant par test_, la méthode ne sera pas exécutée par l’interpréteur python.

La méthode tearDown() est exécutée après chaque cas de test. Vous pouvez utiliser cette méthode pour réinitialiser des variables et d’autres valeurs.

Après l’exécution de tous les cas de test, le résultat indique qu’un cas de test a échoué. Nous pouvons également imprimer un message optionnel chaque fois que la méthode assertEquals() lève l’exception AssertionError (c’est-à-dire que le cas de test échoue).

Pour cela, nous devons passer la chaîne de message comme troisième argument d’entrée à la méthode assertEquals(), comme indiqué ci-dessous.

import unittest


class Tester(unittest.TestCase):
    def setUp(self):
        self.num1 = 10
        self.num2 = 5
        self.num3 = 10

    def tearDown(self):
        print("\nTest case completed. Result:")

    def test_condition1(self):
        message = "{} is not equal to {}".format(self.num1, self.num3)
        self.assertEquals(self.num1, self.num3, message)

    def test_condition2(self):
        message = "{} is not equal to {}".format(self.num2, self.num3)
        self.assertEquals(self.num2, self.num3, message)


if __name__ == "__main__":
    unittest.main()

Production :

Test case completed. Result:

Test case completed. Result:
/home/aditya1117/PycharmProjects/pythonProject/webscraping.py:15: DeprecationWarning: Please use assertEqual instead.
  self.assertEquals(self.num1, self.num3,message)
.F
======================================================================
FAIL: test_condition2 (__main__.Tester)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/webscraping.py", line 19, in test_condition2
    self.assertEquals(self.num2, self.num3,message)
AssertionError: 5 != 10 : 5 is not equal to 10

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)

Ici, vous pouvez observer que l’interpréteur affiche également le message 5 n'est pas égal à 10 lorsque le deuxième cas de test échoue.

La méthode assertEquals() est obsolète en 2010. Ainsi, lors de l’utilisation de la méthode assertEquals(), vous recevrez un avertissement indiquant que la méthode est obsolète avec un message DeprecationWarning: Please use assertEqual instead.

Comme Python nous suggère d’utiliser la méthode assertEqual(), utilisons-la pour implémenter des assertions d’égalité en Python.

La méthode assertEqual() en Python

A l’exception d’un s dans son nom, le fonctionnement de la méthode assertEqual() est tout à fait similaire à la méthode assertEquals(). La syntaxe des deux méthodes est également la même.

Par conséquent, vous pouvez utiliser la méthode assertEqual() au lieu de la méthode assertEquals() comme suit.

import unittest


class Tester(unittest.TestCase):
    def setUp(self):
        self.num1 = 10
        self.num2 = 5
        self.num3 = 10

    def tearDown(self):
        print("\nTest case completed. Result:")

    def test_condition1(self):
        self.assertEqual(self.num1, self.num3)

    def test_condition2(self):
        self.assertEqual(self.num2, self.num3)


if __name__ == "__main__":
    unittest.main()

Production :

.F
======================================================================
FAIL: test_condition2 (__main__.Tester)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/webscraping.py", line 17, in test_condition2
    self.assertEqual(self.num2, self.num3)
AssertionError: 5 != 10

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (failures=1)

Test case completed. Result:

Test case completed. Result:

Process finished with exit code 1

Dans la sortie, nous pouvons observer que le programme fonctionne de la même manière que les codes précédents. De plus, nous n’avons reçu aucun avertissement concernant la dépréciation.

Vous pouvez ajouter des messages aux scénarios de test comme suit.

import unittest


class Tester(unittest.TestCase):
    def setUp(self):
        self.num1 = 10
        self.num2 = 5
        self.num3 = 10

    def tearDown(self):
        print("\nTest case completed. Result:")

    def test_condition1(self):
        message = "{} is not equal to {}".format(self.num1, self.num3)
        self.assertEqual(self.num1, self.num3, message)

    def test_condition2(self):
        message = "{} is not equal to {}".format(self.num2, self.num3)
        self.assertEqual(self.num2, self.num3, message)


if __name__ == "__main__":
    unittest.main()

Production :

.F
======================================================================
FAIL: test_condition2 (__main__.Tester)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/pythonProject/webscraping.py", line 19, in test_condition2
    self.assertEqual(self.num2, self.num3, message)
AssertionError: 5 != 10 : 5 is not equal to 10

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)

Test case completed. Result:

Test case completed. Result:

Dans cet article, vous pouvez observer que nous avons implémenté une sous-classe de la classe TestCase définie dans le module unittest pour utiliser la méthode assertEquals() et la méthode assertEqual().

Lors du développement de programmes avec le framework Django, vous pourriez finir par implémenter une sous-classe de la classe TestCase définie dans le module Django.test. Le programme rencontrera une erreur dans un tel cas, comme indiqué ci-dessous.

import unittest
from django.test import TestCase


class Tester(TestCase):
    def setUp(self):
        self.num1 = 10
        self.num2 = 5
        self.num3 = 10

    def tearDown(self):
        print("\nTest case completed. Result:")

    def test_condition1(self):
        message = "{} is not equal to {}".format(self.num1, self.num3)
        self.assertEqual(self.num1, self.num3, message)

    def test_condition2(self):
        message = "{} is not equal to {}".format(self.num2, self.num3)
        self.assertEqual(self.num2, self.num3, message)


if __name__ == "__main__":
    unittest.main()

Production :

E
======================================================================
ERROR: setUpClass (__main__.Tester)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/test/testcases.py", line 1201, in setUpClass
    super().setUpClass()
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/test/testcases.py", line 187, in setUpClass
    cls._add_databases_failures()
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/test/testcases.py", line 209, in _add_databases_failures
    cls.databases = cls._validate_databases()
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/test/testcases.py", line 195, in _validate_databases
    if alias not in connections:
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/utils/connection.py", line 73, in __iter__
    return iter(self.settings)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/utils/functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/utils/connection.py", line 45, in settings
    self._settings = self.configure_settings(self._settings)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/db/utils.py", line 144, in configure_settings
    databases = super().configure_settings(databases)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/utils/connection.py", line 50, in configure_settings
    settings = getattr(django_settings, self.settings_name)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/conf/__init__.py", line 84, in __getattr__
    self._setup(name)
  File "/home/aditya1117/.local/lib/python3.8/site-packages/django/conf/__init__.py", line 65, in _setup
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Requested setting DATABASES, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

----------------------------------------------------------------------
Ran 0 tests in 0.003s

FAILED (errors=1)

Ici, vous pouvez observer que le programme rencontre une erreur lorsque nous utilisons la classe TestCase du module django.test. Par conséquent, aucun cas de test n’est exécuté.

Veillez donc à toujours utiliser la classe TestCase définie dans le module unittest et non dans le module Django.test.

Conclusion

Nous avons discuté de l’utilisation des méthodes assert statement, assertEquals() et assertEqual() pour tester notre application.

Ici, il serait utile que vous vous souveniez que la déclaration assert et la méthode assertEqual() ne peuvent pas être utilisées dans des applications réelles dans l’environnement de production. Vous ne pouvez utiliser ces méthodes que pour tester votre application avant de déployer le code dans l’environnement de production.

Assurez-vous également que vous utilisez la méthode assertEqual() au lieu de la méthode assertEquals() car cette dernière a été obsolète du langage de programmation python.

Auteur: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.

GitHub