assertEqual en assertEquals in Python
- Was ist eine Assert-Anweisung in Python?
-
Die
assertEquals()
-Methode in Python -
Die
assertEqual()
-Methode in Python - Fazit
Beim Erstellen von Software müssen wir mithilfe des Codes Geschäftslogik implementieren.
Um sicherzustellen, dass wir alle Logik und Einschränkungen implementieren, verwenden wir die Assert-Anweisungen in unseren Programmen. In großen Anwendungen verwenden wir Unit-Tests mit Hilfe der assertEquals()
- und der assertEqual()
-Methode in Python.
Wir werden diskutieren, wie eine assert
Anweisung in Python funktioniert. Wir werden auch sehen, wie wir die Methoden assertEquals()
und assertEqual()
verwenden können, um die Geschäftslogik und die Einschränkungen in Python zu implementieren.
Was ist eine Assert-Anweisung in Python?
In Python prüft eine Assertion-Anweisung, ob ein Ausdruck True
oder False
ist. Die Syntax der Assert-Anweisung lautet wie folgt.
assert conditional_expression
assert
ist hier das Schlüsselwort. Der conditional_expression
ist eine bedingte Anweisung, die Aussagen als True
oder False
bewertet.
Wenn condition_expression
zu True
ausgewertet wird, geht die Ausführung des Programms zur nächsten Anweisung weiter. Wenn andererseits conditional_expression
zu False
ausgewertet wird, löst das Programm die Ausnahme AssertionError
aus.
Wir können all dies unten sehen.
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."
)
Ausgabe:
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
Hier können Sie beobachten, dass die erste Druckanweisung automatisch ausgeführt wird.
Die Anweisung assert num1 == num3
löst keinen Fehler aus, da 10==10
zu True
ausgewertet wird. Daher wird auch die zweite Druckanweisung ausgeführt.
Danach löst die Anweisung "assert num2 == num3"
den AssertionError
aus, da 5==10
zu False
ausgewertet wird. Aus diesem Grund stoppt die Programmausführung und die dritte Druckanweisung wird nie ausgeführt.
Wir können auch eine Nachricht anzeigen, wenn die Ausnahme AssertionError
auftritt. Dazu verwenden wir die folgende Syntax.
assert conditional_expression, message
Hier ist die message
ein String, der ausgegeben wird, wenn der conditional_expression
zu False
ausgewertet wird und der AssertionError
auftritt. Wir können dies unten sehen.
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."
)
Ausgabe:
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
Die Ausgabe 5 ist ungleich 10
wird auch nach Meldung des AssertionError
ausgegeben. Das Einfügen dieser Arten von Nachrichten hilft Ihnen, die Funktionen Ihres Programms einfacher zu testen, da Sie die Anforderung immer dann mit der Nachricht melden können, wenn die Ausnahme AssertionError
auftritt.
Wir können die assert-Anweisung verwenden, um Einschränkungen durchzusetzen oder Geschäftslogik in Python zu implementieren. Die Verwendung der Assert-Anweisung hat jedoch einen Nachteil: Sie stoppt die Ausführung des Programms, sobald die bedingte Anweisung in einer Assert
-Anweisung zu False
ausgewertet wird.
In großen Programmen mit Tausenden von Einschränkungen und Bedingungen müssen wir das Programm also so oft ausführen, wie die Ausnahme AssertionError
auftritt.
Um dies zu überwinden, können wir die Anweisung assertEquals()
oder assertEqual()
verwenden, wie oben besprochen.
Die assertEquals()
-Methode in Python
Um Einschränkungen und Geschäftslogik in der Software durchzusetzen, können wir das Modul unittest
verwenden.
Das Modul unittest
stellt uns viele Methoden zur Verfügung, mit denen wir Constraints erzwingen können. Um Behauptungen für Gleichheit zu implementieren, können wir die Methode assertEquals()
und die Methode assertEqual()
verwenden.
Um Gleichheitszusicherungen mit der Methode assertEquals()
zu implementieren, erstellen wir zunächst eine Klasse, die eine Unterklasse der im Modul unittest
definierten Klasse TestCase
ist. Dann können wir Behauptungen für Gleichheit definieren, indem wir die folgende Syntax der assertEquals()
-Methode verwenden.
self.assertEquals(self, first, second)
Dabei übernimmt der Parameter first
den ersten Wert als Eingabeargument. Der Parameter second
akzeptiert den zweiten Wert als Eingabeargument.
Wenn der Parameter first
gleich dem Wert im Parameter second
ist, wird der Unit-Test erfolgreich bestanden. Andernfalls wird in der aktuellen Zeile eine Ausnahme AssertionError
ausgelöst und der Benutzer über den Fehler informiert.
Daher schlägt der Testfall fehl, aber die Ausführung des Programms stoppt nicht wie im Fall der assert-Anweisung
. Das Programm führt alle Testfälle durch und benachrichtigt dann den Entwickler über alle Fehler.
Wir können dies unten sehen.
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()
Ausgabe:
/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:
Hier wird beim Ausführen der Methode unittest.main()
eine Instanz der Klasse Tester
erstellt. Danach wird die Methode setUp()
ausgeführt. Die Methode setUp()
initialisiert Variablen und importiert Werte aus anderen Modulen in die Klasse Tester
.
Sie können auch beobachten, dass wir die Methoden test_condition1()
und test_condition2()
implementiert haben. Hier haben wir test_
vor den Namen condition1
und condition2
eingefügt, um dem Interpreter verständlich zu machen, dass diese Methoden verwendet werden, um die Testfälle durchzusetzen.
Wenn wir den Methodennamen nicht mit test_
beginnend angeben, wird die Methode nicht vom Python-Interpreter ausgeführt.
Die Methode tearDown()
wird nach jedem Testfall ausgeführt. Sie können diese Methode verwenden, um Variablen und andere Werte neu zu initialisieren.
Nach der Ausführung aller Testfälle zeigt das Ergebnis, dass ein Testfall fehlgeschlagen ist. Wir können auch jedes Mal eine optionale Nachricht ausgeben, wenn die Methode assertEquals()
die Ausnahme AssertionError
auslöst (d. h. der Testfall schlägt fehl).
Dazu müssen wir den Nachrichtenstring als drittes Eingabeargument an die Methode assertEquals()
übergeben, wie unten gezeigt.
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()
Ausgabe:
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)
Hier können Sie beobachten, dass der Interpreter auch die Meldung 5 ist ungleich 10
ausgibt, wenn der zweite Testfall fehlschlägt.
Die Methode assertEquals()
wurde 2010 veraltet. Wenn Sie also die Methode assertEquals()
verwenden, erhalten Sie eine Warnung, dass die Methode veraltet ist, mit der Meldung DeprecationWarning: Please use assertEqual instead
.
Da Python uns vorschlägt, die Methode assertEqual()
zu verwenden, lassen Sie uns sie verwenden, um Behauptungen für Gleichheit in Python zu implementieren.
Die assertEqual()
-Methode in Python
Bis auf ein s
im Namen funktioniert die assertEqual()
-Methode völlig ähnlich wie die assertEquals()
-Methode. Auch die Syntax beider Methoden ist gleich.
Daher können Sie die Methode assertEqual()
anstelle der Methode assertEquals()
wie folgt verwenden.
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()
Ausgabe:
.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
In der Ausgabe können wir beobachten, dass das Programm genauso funktioniert wie die vorherigen Codes. Außerdem haben wir keine Warnung bezüglich der Wertminderung erhalten.
Sie können den Testfällen wie folgt Nachrichten hinzufügen.
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()
Ausgabe:
.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:
In diesem Artikel können Sie beobachten, dass wir eine Unterklasse der Klasse TestCase
implementiert haben, die im Modul unittest
definiert ist, um die Methoden assertEquals()
und assertEqual()
zu verwenden.
Während Sie Programme mit dem Django-Framework entwickeln, implementieren Sie möglicherweise eine Unterklasse der Klasse TestCase
, die im Modul Django.test
definiert ist. Das Programm läuft in einem solchen Fall auf einen Fehler, wie unten gezeigt.
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()
Ausgabe:
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)
Hier können Sie beobachten, dass das Programm auf einen Fehler stößt, wenn wir die Klasse TestCase
aus dem Modul django.test
verwenden. Daher wird kein Testfall ausgeführt.
Stellen Sie also sicher, dass Sie immer die Klasse TestCase
verwenden, die im Modul unittest definiert ist und nicht im Modul Django.test
.
Fazit
Wir haben die Verwendung der assert
-Anweisung, der assertEquals()
und der assertEqual()
Methoden zum Testen unserer Anwendung besprochen.
Hier wäre es hilfreich, wenn Sie bedenken, dass die Methode assert
-Anweisung und die Methode assertEqual()
in realen Anwendungen in der Produktionsumgebung nicht verwendet werden können. Sie können diese Methoden nur zum Testen Ihrer Anwendung verwenden, bevor Sie den Code in der Produktionsumgebung bereitstellen.
Stellen Sie außerdem sicher, dass Sie die Methode assertEqual()
anstelle der Methode assertEquals()
verwenden, da letztere in der Programmiersprache Python veraltet ist.
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