assertEqual en assertEquals en Python
-
Qu’est-ce qu’une déclaration
assert
en Python -
La méthode
assertEquals()
en Python -
La méthode
assertEqual()
en Python - Conclusion
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.
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