Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Mockningstekniker i Unittest: Simulering av Beroenden | Behärska Unittest-Ramverket
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Python Strukturell Programmering

bookMockningstekniker i Unittest: Simulering av Beroenden

Att testa kod som är beroende av externa tjänster, konfigurationer eller har bieffekter kan vara utmanande. Mocking är en kraftfull teknik som simulerar beteendet hos komplexa verkliga interaktioner inom tester utan deras komplexitet och oförutsägbarhet.

Till exempel, om du behöver testa en valutaväxlingstjänst, kan ett alternativ vara att använda egna medel för att simulera transaktioner och observera resultaten. Denna metod kan dock vara riskabel och kostsam. Ett mer effektivt och riskfritt alternativ är att använda mocking för att efterlikna processen att skicka pengar.

Test av en pengaöverföringstjänst

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

Testningsmetod:

  1. Mocka kontobalanser: använd mocking för att simulera olika kontotillstånd, såsom otillräckliga eller tillräckliga medel, för att testa hur transfer-metoden reagerar;
  2. Verifiera transaktioner: bekräfta att rätt belopp debiteras och krediteras från respektive konto under en överföring;
  3. Hantera undantag: säkerställ att metoden hanterar scenarier där överföringen inte kan genomföras på korrekt sätt.
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)
Uppgift

Swipe to start coding

Din uppgift är att skriva enhetstester för klassen MoneyTransferService med hjälp av unittest-ramverket och unittest.mock. Du ska:

  • Skapa en testklass som ärver från unittest.TestCase;
  • Använda MagicMock för att simulera kontoobjekt;
  • Implementera två testmetoder med exakt dessa namn:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • I test_successful_transfer ska du testa en överföring där källkontot har tillräckligt med medel och verifiera både returvärdet och de uppdaterade saldona;
  • I test_failed_transfer_due_to_insufficient_funds ska du testa en överföring där källkontot inte har tillräckligt med medel, verifiera att ett ValueError kastas och kontrollera att saldona förblir oförändrade.

Obs: Namnen på testfunktionerna måste stämma exakt överens med ovanstående. Dina tester ska verifiera beteendet genom att kontrollera värden och undantagshantering direkt, inte genom att använda regex eller mönstermatchning.

Lösning

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 4
single

single

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

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

bookMockningstekniker i Unittest: Simulering av Beroenden

Svep för att visa menyn

Att testa kod som är beroende av externa tjänster, konfigurationer eller har bieffekter kan vara utmanande. Mocking är en kraftfull teknik som simulerar beteendet hos komplexa verkliga interaktioner inom tester utan deras komplexitet och oförutsägbarhet.

Till exempel, om du behöver testa en valutaväxlingstjänst, kan ett alternativ vara att använda egna medel för att simulera transaktioner och observera resultaten. Denna metod kan dock vara riskabel och kostsam. Ett mer effektivt och riskfritt alternativ är att använda mocking för att efterlikna processen att skicka pengar.

Test av en pengaöverföringstjänst

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

Testningsmetod:

  1. Mocka kontobalanser: använd mocking för att simulera olika kontotillstånd, såsom otillräckliga eller tillräckliga medel, för att testa hur transfer-metoden reagerar;
  2. Verifiera transaktioner: bekräfta att rätt belopp debiteras och krediteras från respektive konto under en överföring;
  3. Hantera undantag: säkerställ att metoden hanterar scenarier där överföringen inte kan genomföras på korrekt sätt.
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)
Uppgift

Swipe to start coding

Din uppgift är att skriva enhetstester för klassen MoneyTransferService med hjälp av unittest-ramverket och unittest.mock. Du ska:

  • Skapa en testklass som ärver från unittest.TestCase;
  • Använda MagicMock för att simulera kontoobjekt;
  • Implementera två testmetoder med exakt dessa namn:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • I test_successful_transfer ska du testa en överföring där källkontot har tillräckligt med medel och verifiera både returvärdet och de uppdaterade saldona;
  • I test_failed_transfer_due_to_insufficient_funds ska du testa en överföring där källkontot inte har tillräckligt med medel, verifiera att ett ValueError kastas och kontrollera att saldona förblir oförändrade.

Obs: Namnen på testfunktionerna måste stämma exakt överens med ovanstående. Dina tester ska verifiera beteendet genom att kontrollera värden och undantagshantering direkt, inte genom att använda regex eller mönstermatchning.

Lösning

Switch to desktopByt till skrivbordet för praktisk övningFortsätt där du är med ett av alternativen nedan
Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 5. Kapitel 4
single

single

some-alt