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. AsyncMockist 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

