Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Mocking-Techniken in Unittest: Simulation von Abhängigkeiten | Unittest-Framework
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Python Fortgeschrittene Konzepte

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

  1. Mocken der Kontostände: Mocking verwenden, um verschiedene Kontozustände wie unzureichende oder ausreichende Mittel zu simulieren und das Verhalten der Transfermethode zu testen;
  2. Überprüfen von Transaktionen: Sicherstellen, dass die entsprechenden Beträge während einer Überweisung von den jeweiligen Konten abgebucht und gutgeschrieben werden;
  3. 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)
Aufgabe

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.TestCase erbt;
  • MagicMock verwenden, um Kontoobjekte zu simulieren;
  • Zwei Testmethoden mit genau diesen Namen implementieren:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • In test_successful_transfer einen 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_funds einen Transfer testen, bei dem das Quellkonto nicht über ausreichende Mittel verfügt, sicherstellen, dass ein ValueError ausgelö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

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 5. Kapitel 4
single

single

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

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

Suggested prompts:

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?

close

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

  1. Mocken der Kontostände: Mocking verwenden, um verschiedene Kontozustände wie unzureichende oder ausreichende Mittel zu simulieren und das Verhalten der Transfermethode zu testen;
  2. Überprüfen von Transaktionen: Sicherstellen, dass die entsprechenden Beträge während einer Überweisung von den jeweiligen Konten abgebucht und gutgeschrieben werden;
  3. 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)
Aufgabe

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.TestCase erbt;
  • MagicMock verwenden, um Kontoobjekte zu simulieren;
  • Zwei Testmethoden mit genau diesen Namen implementieren:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • In test_successful_transfer einen 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_funds einen Transfer testen, bei dem das Quellkonto nicht über ausreichende Mittel verfügt, sicherstellen, dass ein ValueError ausgelö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

Switch to desktopWechseln Sie zum Desktop, um in der realen Welt zu übenFahren Sie dort fort, wo Sie sind, indem Sie eine der folgenden Optionen verwenden
War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 5. Kapitel 4
single

single

some-alt