Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Mocking-Teknikker i Unittest: Simulering av Avhengigheter | Beherske Unittest-rammeverket
Python Strukturert Programmering

bookMocking-Teknikker i Unittest: Simulering av Avhengigheter

Testing av kode som er avhengig av eksterne tjenester, konfigurasjoner eller har bivirkninger kan være utfordrende. Mocking er en kraftig teknikk som simulerer oppførselen til komplekse, virkelige interaksjoner i tester uten deres kompleksitet og uforutsigbarhet.

For eksempel, hvis du må teste en valutavekslingstjeneste, kan ett alternativ være å bruke egne midler for å simulere transaksjoner og observere resultatene. Denne metoden kan imidlertid være risikabel og kostbar. Et mer effektivt og risikofritt alternativ er å bruke mocking for å etterligne prosessen med å sende penger.

Testing av en pengetransfertjeneste

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

Testtilnærming:

  1. Mock kontoens saldo: bruke mocking for å simulere ulike kontotilstander, som utilstrekkelige midler eller tilstrekkelige midler, for å teste hvordan transfer-metoden reagerer;
  2. Verifisere transaksjoner: bekrefte at riktige beløp blir trukket og kreditert fra de respektive kontoene under en overføring;
  3. Håndtere unntak: sikre at metoden håndterer scenarier der overføringen ikke kan fullføres på korrekt måte.
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)
Oppgave

Swipe to start coding

Din oppgave er å skrive enhetstester for klassen MoneyTransferService ved bruk av unittest-rammeverket og unittest.mock. Du skal:

  • Opprette en testklasse som arver fra unittest.TestCase;
  • Bruke MagicMock for å simulere konto-objekter;
  • Implementere to testmetoder med nøyaktig disse navnene:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • I test_successful_transfer skal du teste en overføring der kilden har tilstrekkelige midler, og verifisere både returverdien og de oppdaterte saldoene;
  • I test_failed_transfer_due_to_insufficient_funds skal du teste en overføring der kilden ikke har nok midler, verifisere at en ValueError kastes, og sjekke at saldoene forblir uendret.

Merk: Navnene på testfunksjonene må være nøyaktig som vist ovenfor. Testene dine skal verifisere oppførselen ved å sjekke verdier og unntakshåndtering direkte, ikke ved bruk av regex eller mønstergjenkjenning.

Løsning

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 5. Kapittel 4
single

single

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

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-Teknikker i Unittest: Simulering av Avhengigheter

Sveip for å vise menyen

Testing av kode som er avhengig av eksterne tjenester, konfigurasjoner eller har bivirkninger kan være utfordrende. Mocking er en kraftig teknikk som simulerer oppførselen til komplekse, virkelige interaksjoner i tester uten deres kompleksitet og uforutsigbarhet.

For eksempel, hvis du må teste en valutavekslingstjeneste, kan ett alternativ være å bruke egne midler for å simulere transaksjoner og observere resultatene. Denne metoden kan imidlertid være risikabel og kostbar. Et mer effektivt og risikofritt alternativ er å bruke mocking for å etterligne prosessen med å sende penger.

Testing av en pengetransfertjeneste

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

Testtilnærming:

  1. Mock kontoens saldo: bruke mocking for å simulere ulike kontotilstander, som utilstrekkelige midler eller tilstrekkelige midler, for å teste hvordan transfer-metoden reagerer;
  2. Verifisere transaksjoner: bekrefte at riktige beløp blir trukket og kreditert fra de respektive kontoene under en overføring;
  3. Håndtere unntak: sikre at metoden håndterer scenarier der overføringen ikke kan fullføres på korrekt måte.
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)
Oppgave

Swipe to start coding

Din oppgave er å skrive enhetstester for klassen MoneyTransferService ved bruk av unittest-rammeverket og unittest.mock. Du skal:

  • Opprette en testklasse som arver fra unittest.TestCase;
  • Bruke MagicMock for å simulere konto-objekter;
  • Implementere to testmetoder med nøyaktig disse navnene:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • I test_successful_transfer skal du teste en overføring der kilden har tilstrekkelige midler, og verifisere både returverdien og de oppdaterte saldoene;
  • I test_failed_transfer_due_to_insufficient_funds skal du teste en overføring der kilden ikke har nok midler, verifisere at en ValueError kastes, og sjekke at saldoene forblir uendret.

Merk: Navnene på testfunksjonene må være nøyaktig som vist ovenfor. Testene dine skal verifisere oppførselen ved å sjekke verdier og unntakshåndtering direkte, ikke ved bruk av regex eller mønstergjenkjenning.

Løsning

Switch to desktopBytt til skrivebordet for virkelighetspraksisFortsett der du er med et av alternativene nedenfor
Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 5. Kapittel 4
single

single

some-alt