assertEqual y assertEquals en Python
-
¿Qué es una declaración
assert
en Python? -
El método
assertEquals()
en Python -
El método
assertEqual()
en Python - Conclusión
Mientras construimos software, necesitamos implementar la lógica de negocios usando el código.
Para asegurarnos de que implementamos toda la lógica y las restricciones, usamos declaraciones de afirmación en nuestros programas. En aplicaciones grandes, usamos pruebas unitarias con la ayuda de los métodos assertEquals()
y assertEqual()
en Python.
Discutiremos cómo funciona una declaración assert
en Python. También veremos cómo podemos usar el método assertEquals()
y assertEqual()
para implementar la lógica empresarial y las restricciones en Python.
¿Qué es una declaración assert
en Python?
En Python, una declaración assert
comprueba si una expresión es True
o False
. La sintaxis de la declaración assert
es la siguiente.
assert conditional_expression
Aquí, assert
es la palabra clave. La expresión_condicional
es una declaración condicional que evalúa las declaraciones como True
o False
.
Si conditional_expression
se evalúa como True
, la ejecución del programa avanza a la siguiente declaración. Por otro lado, si la conditional_expression
se evalúa como False
, el programa genera la excepción AssertionError
.
Podemos ver todo esto a continuación.
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."
)
Producción :
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
Aquí, puede observar que la primera declaración de impresión se ejecuta automáticamente.
La declaración assert num1 == num3
no genera ningún error ya que 10==10
se evalúa como True
. Entonces, la segunda declaración de impresión también se ejecuta.
Después de eso, la declaración "assert num2 == num3"
genera el AssertionError
ya que 5==10
se evalúa como False
. Debido a esto, la ejecución del programa se detiene y la tercera declaración de impresión nunca se ejecuta.
También podemos mostrar un mensaje cuando se produce la excepción AssertionError
. Para ello, utilizaremos la siguiente sintaxis.
assert conditional_expression, message
Aquí, el message
es una cadena que se imprime cuando la expresión_condicional
se evalúa como False
y se produce el AssertionError
. Esto lo podemos ver a continuación.
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."
)
Producción :
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 salida 5 is not equal to 10
también se imprime después de notificar el AssertionError
. Incluir este tipo de mensajes lo ayudará a probar las funciones de su programa más fácilmente, ya que puede notificar el requisito utilizando el mensaje siempre que ocurra la excepción AssertionError
.
Podemos usar la declaración assert
para hacer cumplir las restricciones o implementar lógica de negocio en Python. Sin embargo, el uso de la sentencia assert tiene un inconveniente: detiene la ejecución del programa una vez que la sentencia condicional en una afirmación assert
se evalúa a False
.
Así, en programas grandes con miles de restricciones y condiciones, tendremos que ejecutar el programa tantas veces como se produzca la excepción AssertionError
.
Para superar esto, podemos usar la declaración assertEquals()
o assertEqual()
como se explica más adelante.
El método assertEquals()
en Python
Para hacer cumplir las restricciones y la lógica comercial en el software, podemos usar el módulo unittest
.
El módulo unittest
nos proporciona muchos métodos que podemos usar para hacer cumplir las restricciones. Para implementar aserciones de igualdad, podemos utilizar el método assertEquals()
y el método assertEqual()
.
Para implementar afirmaciones de igualdad utilizando el método assertEquals()
, primero crearemos una clase que sea una subclase de la clase TestCase
definida en el módulo unittest
. Entonces, podemos definir aserciones para la igualdad usando la siguiente sintaxis del método assertEquals()
.
self.assertEquals(self, first, second)
Aquí, el parámetro first
acepta el primer valor como argumento de entrada. El parámetro second
acepta el segundo valor como argumento de entrada.
Si el parámetro first
es igual al valor del parámetro second
, la prueba unitaria pasará con éxito. En caso contrario, se lanza una excepción AssertionError
en la línea actual, y se notifica al usuario sobre el error.
Por lo tanto, el caso de prueba falla, pero la ejecución del programa no se detiene como lo hizo en el caso de la sentencia assert
. El programa ejecuta todos los casos de prueba y luego notifica al desarrollador de todos los errores.
Esto lo podemos ver a continuación.
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()
Producción :
/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:
Aquí, cuando se ejecuta el método unittest.main()
, se crea una instancia de la clase Tester
. Después de eso, se ejecuta el método setUp()
. El método setUp()
inicializa variables e importa valores de otros módulos a la clase Tester
.
También puedes observar que hemos implementado los métodos test_condition1()
y test_condition2()
. Aquí, hemos incluido test_
antes del nombre condition1
y condition2
para que el intérprete comprenda que estos métodos se utilizan para hacer cumplir los casos de prueba.
Si no especificamos el nombre del método que comienza con test_
, el intérprete de python no ejecutará el método.
El método tearDown()
se ejecuta después de cada caso de prueba. Puede utilizar este método para reinicializar variables y otros valores.
Después de ejecutar todos los casos de prueba, el resultado muestra que un caso de prueba ha fallado. También podemos imprimir un mensaje opcional cada vez que el método assertEquals()
genera la excepción AssertionError
(es decir, el caso de prueba falla).
Para ello, tenemos que pasar la cadena del mensaje como tercer argumento de entrada al método assertEquals()
, como se muestra a continuación.
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()
Producción :
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)
Aquí, puede observar que el intérprete también imprime el mensaje 5 no es igual a 10
cuando falla el segundo caso de prueba.
El método assertEquals()
quedó en desuso en 2010. Por lo tanto, al utilizar el método assertEquals()
, recibirá una advertencia de que el método ha quedado en desuso con un mensaje DeprecationWarning: Please use assertEqual instead
.
Como Python nos sugiere que usemos el método assertEqual()
, usémoslo para implementar afirmaciones de igualdad en Python.
El método assertEqual()
en Python
Excepto por una s
en su nombre, el funcionamiento del método assertEqual()
es completamente similar al método assertEquals()
. La sintaxis de ambos métodos también es la misma.
Por lo tanto, puede usar el método assertEqual()
en lugar del método assertEquals()
de la siguiente manera.
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()
Producción :
.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
En la salida, podemos observar que el programa funciona igual que los códigos anteriores. Además, no hemos recibido ningún aviso sobre la depreciación.
Puede agregar mensajes a los casos de prueba de la siguiente manera.
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()
Producción :
.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:
En este artículo, puedes observar que hemos implementado una subclase de la clase TestCase
definida en el módulo unittest
para usar el método assertEquals()
y el método assertEqual()
.
Mientras desarrolla programas con el framework Django, puede terminar implementando una subclase de la clase TestCase
definida en el módulo Django.test
. El programa se ejecutará en un error en tal caso, como se muestra a continuación.
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()
Producción :
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)
Aquí puedes observar que el programa da error cuando usamos la clase TestCase
del módulo django.test
. Por lo tanto, no se ejecuta ningún caso de prueba.
Por lo tanto, asegúrese de usar siempre la clase TestCase
definida en el módulo unittest y no en el módulo Django.test
.
Conclusión
Discutimos el uso de la sentencia assert
, assertEquals()
y assertEqual()
para probar nuestra aplicación.
En este caso, sería útil que recordara que la declaración assert
y el método assertEqual()
no se pueden utilizar en aplicaciones reales en el entorno de producción. Solo puede usar estos métodos para probar su aplicación antes de implementar el código en el entorno de producción.
Además, asegúrese de utilizar el método assertEqual()
en lugar del método assertEquals()
ya que este último ha quedado obsoleto en el lenguaje de programación 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