Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Mocking und Testisolation | Testing with unittest and pytest
Python Fortgeschrittene Konzepte

Mocking und Testisolation

Swipe um das Menü anzuzeigen

Mocking ist eine leistungsstarke Technik im Unit Testing, mit der Teile des zu testenden Systems durch Mock-Objekte oder Funktionen ersetzt werden können. Ziel ist es, die zu testende Codeeinheit von ihren Abhängigkeiten wie Datenbanken, APIs oder anderen komplexen Systemen zu isolieren. Durch den Einsatz von Mocks kann das Verhalten von Abhängigkeiten gesteuert werden, sodass die Logik des eigenen Codes in einer kontrollierten Umgebung getestet werden kann.

Testisolation ist wichtig, da sie sicherstellt, dass Tests sich nicht gegenseitig beeinflussen und nicht von Faktoren außerhalb ihres Geltungsbereichs betroffen sind. Isolierte Tests sind zuverlässiger und leichter zu debuggen, da ihre Ergebnisse nur vom getesteten Code und den spezifisch eingerichteten Bedingungen abhängen, nicht vom Zustand oder Verhalten externer Systeme.

In Python stellt das Modul unittest.mock Werkzeuge zum Mocken von Objekten und Funktionen bereit. Beim Mocking kann eine echte Funktion oder ein echtes Objekt durch einen Mock ersetzt werden, der kontrollierte Werte zurückgibt oder aufzeichnet, wie er verwendet wurde. Dies ist besonders nützlich, wenn der eigene Code mit Ressourcen interagiert, die langsam, unvorhersehbar oder während des Tests nicht verfügbar sind.

12345678910111213141516171819202122232425
import unittest from unittest.mock import patch def check_the_sky(): # Simulate a slow or unreliable API raise ConnectionError("API not available") def get_advice(): if check_the_sky(): return "Take an umbrella." else: return "Enjoy the sunshine!" class TestWeather(unittest.TestCase): @patch('__main__.check_the_sky') def test_advice_when_rainy(self, mock_check): mock_check.return_value = True self.assertEqual(get_advice(), "Take an umbrella.") @patch('__main__.check_the_sky') def test_advice_when_clear(self, mock_check): mock_check.return_value = False self.assertEqual(get_advice(), "Enjoy the sunshine!") unittest.main(argv=[''], exit=False)

In diesem Codebeispiel simuliert die Funktion check_the_sky eine externe Abhängigkeit, die unzuverlässig oder defekt ist, wie etwa eine Wetter-API, die nicht immer verfügbar ist. Die Funktion get_advice enthält die zu testende Logik — sie ruft check_the_sky auf und gibt je nach Ergebnis einen Ratschlag zurück.

Die unittest-Testklasse verwendet Mocking, um die echte Funktion check_the_sky durch einen Mock zu ersetzen, der kontrollierte Werte zurückgibt. Dadurch kann getestet werden, wie sich get_advice in verschiedenen Szenarien verhält, zum Beispiel bei klarem Himmel oder Regen, ohne auf das tatsächliche externe System angewiesen zu sein.

Der @patch-Decorator wird verwendet, um die echte Funktion check_the_sky während jeder Testmethode vorübergehend durch ein Mock-Objekt zu ersetzen. Das Mock-Objekt wird der Testmethode als Parameter mock_check übergeben. Mit mock_check wird der gewünschte Rückgabewert für den jeweiligen Test festgelegt, sodass das Verhalten und die Rückgabe des Codes in jedem Szenario gezielt gesteuert werden können.

Note
Hinweis

Die Funktion unittest.main() in dieser Lektion enthält einige zusätzliche Parameter, die nur für diese Lernumgebung erforderlich sind. Sie sorgen dafür, dass der Code auf der Plattform korrekt ausgeführt wird, und sind kein Bestandteil der grundlegenden Python-Konzepte, die du jetzt lernen musst.

Durch den Einsatz von Mocking werden Tests von externen Systemen isoliert, die langsam oder unzuverlässig sein können. Dadurch werden die Tests schnell, wiederholbar und deterministisch, da du genau kontrollierst, was die Abhängigkeit in jedem Testfall zurückgibt.

question mark

Wann solltest du Mocking in Unit-Tests verwenden?

Wählen Sie alle richtigen Antworten aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 5. Kapitel 4

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 5. Kapitel 4
some-alt