Wie man Async-Funktionen in Python mockt
James Reed
Infrastructure Engineer · Leapcell

Mocking async
Funktionen in Python ist eine übliche Anforderung beim Schreiben von Unit-Tests für Codebasen, die asynchrone Programmierung nutzen. Diese Vorgehensweise stellt sicher, dass Sie Funktionen testen können, die von async
-Operationen abhängen, ohne tatsächliche Netzwerkaufrufe, Datenbankabfragen oder andere Prozesse mit Nebeneffekten durchzuführen.
Warum Async-Funktionen mocken?
- Isolation: Mocking hilft, die zu testende Einheit von externen Systemen zu isolieren, um sicherzustellen, dass sich der Test auf die spezifische Logik konzentriert.
- Performance: Tests laufen schneller, weil Mocks langsame I/O-Operationen vermeiden.
- Determinismus: Mocking vermeidet potenzielle Instabilität, die durch reale Abhängigkeiten verursacht wird.
Tools zum Mocken von Async-Funktionen
Python's unittest.mock
Modul bietet Hilfsprogramme zum Mocken, einschließlich Unterstützung für asynchrone Funktionen über AsyncMock
. Wenn Sie Python 3.8 oder höher verwenden, ist AsyncMock
der empfohlene Ansatz. Für frühere Versionen kann MagicMock
angepasst werden, um async
-Funktionen zu mocken.
Key Takeaways
- Das Mocken von
async
-Funktionen isoliert Tests und verbessert die Performance, indem reale Abhängigkeiten vermieden werden. AsyncMock
ist das empfohlene Tool zum Mocken in Python 3.8 und höher.- Vermeiden Sie übermäßiges Mocking, um die Zuverlässigkeit und Klarheit der Tests zu erhalten.
Mocken von Async-Funktionen mit AsyncMock
Hier ist eine Schritt-für-Schritt-Anleitung zum Mocken von async
-Funktionen mit AsyncMock
:
import unittest from unittest.mock import AsyncMock, patch # Zu testende Funktion def process_data(data_fetcher): async def wrapper(): data = await data_fetcher() return f"Processed: {data}" return wrapper class TestProcessData(unittest.TestCase): @patch("path.to.data_fetcher", new_callable=AsyncMock) def test_process_data(self, mock_fetcher): # Konfiguriere den Mock, um einen bestimmten Wert zurückzugeben mock_fetcher.return_value = "Mocked Data" # Teste die Funktion async def test_logic(): result = await process_data(mock_fetcher)() self.assertEqual(result, "Processed: Mocked Data") # Führe den Async-Test aus import asyncio asyncio.run(test_logic()) if __name__ == "__main__": unittest.main()
Wichtige Punkte:
- Verwenden Sie
new_callable=AsyncMock
, wenn Sie eineasync
-Funktion patchen. - Konfigurieren Sie den Mock-Rückgabewert mit
.return_value
. - Stellen Sie zum Testen von Async-Logik sicher, dass die Testfunktion innerhalb einer Ereignisschleife ausgeführt wird.
Verwenden von MagicMock
für ältere Python-Versionen
Wenn Sie mit Python-Versionen vor 3.8 arbeiten, können Sie MagicMock
verwenden, um async
-Verhalten zu simulieren:
from unittest.mock import MagicMock # Mocken einer Async-Funktion mit MagicMock mock_fetcher = MagicMock() mock_fetcher.return_value = "Mocked Data" mock_fetcher.__aenter__.return_value = "Mocked Data" async def test(): result = await mock_fetcher() print(result) # Output: Mocked Data import asyncio asyncio.run(test())
Obwohl MagicMock
verwendet werden kann, ist es weniger intuitiv und weniger robust im Vergleich zu AsyncMock
zum Mocken von async
-Funktionen.
Diskussion
- Wann mocken: Mocking sollte sparsam und nur für Komponenten außerhalb der zu testenden Einheit verwendet werden. Übermäßiges Mocken kann zu brüchigen Tests führen.
- Alternativen zum Mocken: Anstatt zu mocken, sollten Sie die Verwendung von In-Memory-Alternativen oder Lightweight Fakes für Abhängigkeiten in Betracht ziehen.
- Testlesbarkeit: Stellen Sie sicher, dass die Mocks und das Testsetup klar und aussagekräftig sind. Komplizierte Mocks können den Zweck des Tests verschleiern.
FAQs
AsyncMock
ist für das Mocken von async
-Funktionen konzipiert, während MagicMock
eine zusätzliche Konfiguration für asynchrones Verhalten erfordert.
Nein, AsyncMock
ist nur in Python 3.8 und höher verfügbar; verwenden Sie stattdessen MagicMock
.
Verwenden Sie asyncio.run()
, um die async
-Testlogik innerhalb einer Ereignisschleife auszuführen.
Fazit
Das Mocken von async
-Funktionen in Python ermöglicht effektives Testen von asynchronem Code. Während AsyncMock
diesen Prozess in Python 3.8+ vereinfacht, können frühere Versionen mit MagicMock
ähnliche Ergebnisse erzielen. Indem Sie Best Practices befolgen und übermäßiges Mocking vermeiden, können Sie wartbare und zuverlässige Testsuiten für Ihren asynchronen Python-Code erstellen.
Wir sind Leapcell, Ihre erste Wahl für das Deployment von Python-Projekten in die Cloud.
Leapcell ist die Serverless-Plattform der nächsten Generation für Webhosting, Async-Aufgaben und Redis:
Multi-Language Support
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt viele Projekte kostenlos bereit
- zahlen Sie nur für die Nutzung - keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 $ unterstützt 6,94 Mio. Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Developer Experience
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollautomatische CI/CD-Pipelines und GitOps-Integration.
- Echtzeit-Metriken und -Protokollierung für verwertbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Performance
- Auto-Skalierung zur einfachen Bewältigung hoher Parallelität.
- Kein operativer Aufwand - konzentrieren Sie sich einfach auf das Bauen.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ