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 af Afhængigheder | Beherskelse af Unittest-Rammeværket
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Python Strukturel Programmering

bookMocking-teknikker i Unittest: Simulering af Afhængigheder

Test af kode, der afhænger af eksterne tjenester, konfigurationer eller har bivirkninger, kan være udfordrende. Mocking er en effektiv teknik, der simulerer adfærden af komplekse, virkelige interaktioner i tests uden deres kompleksitet og uforudsigelighed.

For eksempel, hvis du skal teste en valutavekslingstjeneste, kunne én mulighed være at bruge egne midler til at simulere transaktioner og observere resultaterne. Denne metode kan dog være risikabel og dyr. Et mere effektivt og risikofrit alternativ er at bruge mocking til at efterligne processen med at sende penge.

Test af en pengeoverførselstjeneste

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

Testtilgang:

  1. Mock konto-saldi: brug mocking til at simulere forskellige kontotilstande, såsom utilstrækkelige eller tilstrækkelige midler, for at teste hvordan transfer-metoden reagerer;
  2. Verificer transaktioner: bekræft at de korrekte beløb debiteres og krediteres de respektive konti under en overførsel;
  3. Håndter undtagelser: sikre at metoden korrekt håndterer scenarier, hvor overførslen ikke kan gennemføres.
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)
Opgave

Swipe to start coding

Din opgave er at skrive enhedstests for klassen MoneyTransferService ved hjælp af unittest-rammeværket og unittest.mock. Du skal:

  • Oprette en testklasse, der arver fra unittest.TestCase;
  • Bruge MagicMock til at simulere konto-objekter;
  • Implementere to testmetoder med præcis disse navne:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • I test_successful_transfer skal du teste en overførsel, hvor kilden har tilstrækkelige midler, og verificere både returværdien og de opdaterede saldi;
  • I test_failed_transfer_due_to_insufficient_funds skal du teste en overførsel, hvor kilden ikke har tilstrækkelige midler, verificere at der udløses en ValueError, og kontrollere at saldi forbliver uændrede.

Bemærk: Navnene på testfunktionerne skal matche præcis som vist ovenfor. Dine tests skal verificere adfærden ved at kontrollere værdier og undtagelseshåndtering direkte, ikke ved brug af regex eller mønstergenkendelse.

Løsning

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 4
single

single

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

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 af Afhængigheder

Stryg for at vise menuen

Test af kode, der afhænger af eksterne tjenester, konfigurationer eller har bivirkninger, kan være udfordrende. Mocking er en effektiv teknik, der simulerer adfærden af komplekse, virkelige interaktioner i tests uden deres kompleksitet og uforudsigelighed.

For eksempel, hvis du skal teste en valutavekslingstjeneste, kunne én mulighed være at bruge egne midler til at simulere transaktioner og observere resultaterne. Denne metode kan dog være risikabel og dyr. Et mere effektivt og risikofrit alternativ er at bruge mocking til at efterligne processen med at sende penge.

Test af en pengeoverførselstjeneste

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

Testtilgang:

  1. Mock konto-saldi: brug mocking til at simulere forskellige kontotilstande, såsom utilstrækkelige eller tilstrækkelige midler, for at teste hvordan transfer-metoden reagerer;
  2. Verificer transaktioner: bekræft at de korrekte beløb debiteres og krediteres de respektive konti under en overførsel;
  3. Håndter undtagelser: sikre at metoden korrekt håndterer scenarier, hvor overførslen ikke kan gennemføres.
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)
Opgave

Swipe to start coding

Din opgave er at skrive enhedstests for klassen MoneyTransferService ved hjælp af unittest-rammeværket og unittest.mock. Du skal:

  • Oprette en testklasse, der arver fra unittest.TestCase;
  • Bruge MagicMock til at simulere konto-objekter;
  • Implementere to testmetoder med præcis disse navne:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • I test_successful_transfer skal du teste en overførsel, hvor kilden har tilstrækkelige midler, og verificere både returværdien og de opdaterede saldi;
  • I test_failed_transfer_due_to_insufficient_funds skal du teste en overførsel, hvor kilden ikke har tilstrækkelige midler, verificere at der udløses en ValueError, og kontrollere at saldi forbliver uændrede.

Bemærk: Navnene på testfunktionerne skal matche præcis som vist ovenfor. Dine tests skal verificere adfærden ved at kontrollere værdier og undtagelseshåndtering direkte, ikke ved brug af regex eller mønstergenkendelse.

Løsning

Switch to desktopSkift til skrivebord for at øve i den virkelige verdenFortsæt der, hvor du er, med en af nedenstående muligheder
Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 5. Kapitel 4
single

single

some-alt