Mocking-Techniken in Unittest: Simulation von Abhängigkeiten
Das Testen von Code, der von externen Diensten, Konfigurationen oder Seiteneffekten abhängt, kann herausfordernd sein. Mocking ist eine leistungsstarke Technik, die das Verhalten komplexer realer Interaktionen innerhalb von Tests simuliert, ohne deren Komplexität und Unvorhersehbarkeit zu übernehmen.
Wenn beispielsweise ein Geldwechselservice getestet werden soll, könnte eine Möglichkeit darin bestehen, eigene Mittel zu verwenden, um Transaktionen zu simulieren und die Ergebnisse zu beobachten. Diese Methode ist jedoch riskant und kostspielig. Eine effizientere und risikofreie Alternative ist der Einsatz von Mocking, um den Prozess des Geldversands nachzubilden.
Testen eines Geldüberweisungsdienstes
class MoneyTransferService:
def transfer(self, source_account, destination_account, amount):
if source_account.balance < amount:
raise ValueError("Insufficient funds")
source_account.balance -= amount
destination_account.balance += amount
return True
Der Testansatz:
- Mocken der Kontostände: Mocking verwenden, um verschiedene Kontozustände wie unzureichende oder ausreichende Mittel zu simulieren und das Verhalten der Transfermethode zu testen;
- Überprüfen von Transaktionen: Sicherstellen, dass die entsprechenden Beträge während einer Überweisung von den jeweiligen Konten abgebucht und gutgeschrieben werden;
- Behandeln von Ausnahmen: Überprüfen, dass die Methode Szenarien korrekt behandelt, in denen die Überweisung nicht abgeschlossen werden kann.
import unittest
from unittest.mock import MagicMock
class TestMoneyTransferService(unittest.junit.TestCase):
def setUp(self):
self.transfer_service = MoneyTransferService()
self.source_account = MagicMock()
self.destination_account = MagicMock()
def test_successful_transfer(self):
# Set up the account balances
self.source_account.balance = 1000
self.destination_account.balance = 500
# Perform the transfer
successful = self.transfer_service.transfer(self.source_account, self.destination_account, 200)
# Check balances
self.assertTrue(successful)
self.assertEqual(self.source_account.balance, 800)
self.assertEqual(self.destination_account.balance, 700)
def test_failed_transfer_due_to_insufficient_funds(self):
# Set up the account balances
self.source_account.balance = 100
self.destination_account.balance = 500
# Attempt to transfer more than the source balance
with self.assertRaises(ValueError):
self.transfer_service.transfer(self.source_account, self.destination_account, 200)
# Verify that balances remain unchanged
self.assertEqual(self.source_account.balance, 100)
self.assertEqual(self.destination_account.balance, 500)
Swipe to start coding
Ihre Aufgabe besteht darin, Unit-Tests für die Klasse MoneyTransferService unter Verwendung des unittest-Frameworks und unittest.mock zu schreiben. Sie müssen:
- Eine Testklasse erstellen, die von
unittest.TestCaseerbt; MagicMockverwenden, um Kontoobjekte zu simulieren;- Zwei Testmethoden mit genau diesen Namen implementieren:
test_successful_transfer;test_failed_transfer_due_to_insufficient_funds.
- In
test_successful_transfereinen Transfer testen, bei dem das Quellkonto über ausreichende Mittel verfügt, und sowohl den Rückgabewert als auch die aktualisierten Kontostände überprüfen; - In
test_failed_transfer_due_to_insufficient_fundseinen Transfer testen, bei dem das Quellkonto nicht über ausreichende Mittel verfügt, sicherstellen, dass einValueErrorausgelöst wird, und überprüfen, dass die Kontostände unverändert bleiben.
Hinweis: Die Namen der Testfunktionen müssen exakt wie oben angegeben lauten. Ihre Tests sollten das Verhalten durch direkte Überprüfung von Werten und Ausnahmebehandlung verifizieren, nicht durch die Verwendung von Regex oder Musterabgleich.
Lösung
Danke für Ihr Feedback!
single
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Can you explain how mocking helps in testing services with side effects?
What are some best practices for using MagicMock in unit tests?
Can you show how to extend these tests for additional scenarios, like negative transfer amounts?
Großartig!
Completion Rate verbessert auf 3.13
Mocking-Techniken in Unittest: Simulation von Abhängigkeiten
Swipe um das Menü anzuzeigen
Das Testen von Code, der von externen Diensten, Konfigurationen oder Seiteneffekten abhängt, kann herausfordernd sein. Mocking ist eine leistungsstarke Technik, die das Verhalten komplexer realer Interaktionen innerhalb von Tests simuliert, ohne deren Komplexität und Unvorhersehbarkeit zu übernehmen.
Wenn beispielsweise ein Geldwechselservice getestet werden soll, könnte eine Möglichkeit darin bestehen, eigene Mittel zu verwenden, um Transaktionen zu simulieren und die Ergebnisse zu beobachten. Diese Methode ist jedoch riskant und kostspielig. Eine effizientere und risikofreie Alternative ist der Einsatz von Mocking, um den Prozess des Geldversands nachzubilden.
Testen eines Geldüberweisungsdienstes
class MoneyTransferService:
def transfer(self, source_account, destination_account, amount):
if source_account.balance < amount:
raise ValueError("Insufficient funds")
source_account.balance -= amount
destination_account.balance += amount
return True
Der Testansatz:
- Mocken der Kontostände: Mocking verwenden, um verschiedene Kontozustände wie unzureichende oder ausreichende Mittel zu simulieren und das Verhalten der Transfermethode zu testen;
- Überprüfen von Transaktionen: Sicherstellen, dass die entsprechenden Beträge während einer Überweisung von den jeweiligen Konten abgebucht und gutgeschrieben werden;
- Behandeln von Ausnahmen: Überprüfen, dass die Methode Szenarien korrekt behandelt, in denen die Überweisung nicht abgeschlossen werden kann.
import unittest
from unittest.mock import MagicMock
class TestMoneyTransferService(unittest.junit.TestCase):
def setUp(self):
self.transfer_service = MoneyTransferService()
self.source_account = MagicMock()
self.destination_account = MagicMock()
def test_successful_transfer(self):
# Set up the account balances
self.source_account.balance = 1000
self.destination_account.balance = 500
# Perform the transfer
successful = self.transfer_service.transfer(self.source_account, self.destination_account, 200)
# Check balances
self.assertTrue(successful)
self.assertEqual(self.source_account.balance, 800)
self.assertEqual(self.destination_account.balance, 700)
def test_failed_transfer_due_to_insufficient_funds(self):
# Set up the account balances
self.source_account.balance = 100
self.destination_account.balance = 500
# Attempt to transfer more than the source balance
with self.assertRaises(ValueError):
self.transfer_service.transfer(self.source_account, self.destination_account, 200)
# Verify that balances remain unchanged
self.assertEqual(self.source_account.balance, 100)
self.assertEqual(self.destination_account.balance, 500)
Swipe to start coding
Ihre Aufgabe besteht darin, Unit-Tests für die Klasse MoneyTransferService unter Verwendung des unittest-Frameworks und unittest.mock zu schreiben. Sie müssen:
- Eine Testklasse erstellen, die von
unittest.TestCaseerbt; MagicMockverwenden, um Kontoobjekte zu simulieren;- Zwei Testmethoden mit genau diesen Namen implementieren:
test_successful_transfer;test_failed_transfer_due_to_insufficient_funds.
- In
test_successful_transfereinen Transfer testen, bei dem das Quellkonto über ausreichende Mittel verfügt, und sowohl den Rückgabewert als auch die aktualisierten Kontostände überprüfen; - In
test_failed_transfer_due_to_insufficient_fundseinen Transfer testen, bei dem das Quellkonto nicht über ausreichende Mittel verfügt, sicherstellen, dass einValueErrorausgelöst wird, und überprüfen, dass die Kontostände unverändert bleiben.
Hinweis: Die Namen der Testfunktionen müssen exakt wie oben angegeben lauten. Ihre Tests sollten das Verhalten durch direkte Überprüfung von Werten und Ausnahmebehandlung verifizieren, nicht durch die Verwendung von Regex oder Musterabgleich.
Lösung
Danke für Ihr Feedback!
single