assertEqual en assertEquals in Python

Aditya Raj 3 April 2022
  1. Was ist eine Assert-Anweisung in Python?
  2. Die assertEquals()-Methode in Python
  3. Die assertEqual()-Methode in Python
  4. Fazit
assertEqual en assertEquals in Python

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.

Autor: 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