Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Mockingtechnieken in Unittest: Het Simuleren van Afhankelijkheden | Unittest-Framework Beheersen
Python Structureel Programmeren

bookMockingtechnieken in Unittest: Het Simuleren van Afhankelijkheden

Het testen van code die afhankelijk is van externe diensten, configuraties of bijwerkingen heeft, kan uitdagend zijn. Mocking is een krachtige techniek die het gedrag van complexe interacties uit de echte wereld binnen tests simuleert, zonder hun complexiteit en onvoorspelbaarheid.

Stel bijvoorbeeld dat je een geldwisseldienst moet testen. Een optie zou kunnen zijn om je eigen geld te gebruiken om transacties te simuleren en de uitkomsten te observeren. Deze methode kan echter riskant en kostbaar zijn. Een efficiënter en risicovrij alternatief is het gebruik van mocking om het proces van geld overmaken na te bootsen.

Testen van een Geldtransferservice

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

De Testaanpak:

  1. Mock de Rekeningbalansen: gebruik mocking om verschillende rekeningtoestanden te simuleren, zoals onvoldoende saldo of voldoende saldo, om te testen hoe de transfermethode reageert;
  2. Transacties Verifiëren: bevestig dat de juiste bedragen worden afgeschreven en bijgeschreven op de respectievelijke rekeningen tijdens een overboeking;
  3. Afhandelen van Excepties: zorg ervoor dat de methode scenario's waarin de overboeking niet kan worden voltooid correct afhandelt.
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)
Taak

Swipe to start coding

Je taak is om unittests te schrijven voor de MoneyTransferService-klasse met behulp van het unittest-framework en unittest.mock. Je moet:

  • Een testklasse aanmaken die erft van unittest.TestCase;
  • MagicMock gebruiken om accountobjecten te simuleren;
  • Twee testmethoden implementeren met exact deze namen:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • In test_successful_transfer een overboeking testen waarbij de bron voldoende saldo heeft, en zowel de returnwaarde als de bijgewerkte saldi controleren;
  • In test_failed_transfer_due_to_insufficient_funds een overboeking testen waarbij de bron onvoldoende saldo heeft, verifiëren dat een ValueError wordt opgegooid, en controleren dat de saldi ongewijzigd blijven.

Let op: De namen van de testfuncties moeten exact overeenkomen met bovenstaande. Je tests moeten het gedrag verifiëren door direct waarden en uitzonderingafhandeling te controleren, niet door regex of patroonherkenning te gebruiken.

Oplossing

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 4
single

single

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

close

bookMockingtechnieken in Unittest: Het Simuleren van Afhankelijkheden

Veeg om het menu te tonen

Het testen van code die afhankelijk is van externe diensten, configuraties of bijwerkingen heeft, kan uitdagend zijn. Mocking is een krachtige techniek die het gedrag van complexe interacties uit de echte wereld binnen tests simuleert, zonder hun complexiteit en onvoorspelbaarheid.

Stel bijvoorbeeld dat je een geldwisseldienst moet testen. Een optie zou kunnen zijn om je eigen geld te gebruiken om transacties te simuleren en de uitkomsten te observeren. Deze methode kan echter riskant en kostbaar zijn. Een efficiënter en risicovrij alternatief is het gebruik van mocking om het proces van geld overmaken na te bootsen.

Testen van een Geldtransferservice

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

De Testaanpak:

  1. Mock de Rekeningbalansen: gebruik mocking om verschillende rekeningtoestanden te simuleren, zoals onvoldoende saldo of voldoende saldo, om te testen hoe de transfermethode reageert;
  2. Transacties Verifiëren: bevestig dat de juiste bedragen worden afgeschreven en bijgeschreven op de respectievelijke rekeningen tijdens een overboeking;
  3. Afhandelen van Excepties: zorg ervoor dat de methode scenario's waarin de overboeking niet kan worden voltooid correct afhandelt.
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)
Taak

Swipe to start coding

Je taak is om unittests te schrijven voor de MoneyTransferService-klasse met behulp van het unittest-framework en unittest.mock. Je moet:

  • Een testklasse aanmaken die erft van unittest.TestCase;
  • MagicMock gebruiken om accountobjecten te simuleren;
  • Twee testmethoden implementeren met exact deze namen:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • In test_successful_transfer een overboeking testen waarbij de bron voldoende saldo heeft, en zowel de returnwaarde als de bijgewerkte saldi controleren;
  • In test_failed_transfer_due_to_insufficient_funds een overboeking testen waarbij de bron onvoldoende saldo heeft, verifiëren dat een ValueError wordt opgegooid, en controleren dat de saldi ongewijzigd blijven.

Let op: De namen van de testfuncties moeten exact overeenkomen met bovenstaande. Je tests moeten het gedrag verifiëren door direct waarden en uitzonderingafhandeling te controleren, niet door regex of patroonherkenning te gebruiken.

Oplossing

Switch to desktopSchakel over naar desktop voor praktijkervaringGa verder vanaf waar je bent met een van de onderstaande opties
Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 4
single

single

some-alt