Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Tecniche di Mocking in Unittest: Simulazione delle Dipendenze | Padronanza del Framework Unittest
Programmazione Strutturale in Python

bookTecniche di Mocking in Unittest: Simulazione delle Dipendenze

Testare codice che dipende da servizi esterni, configurazioni o che presenta effetti collaterali può risultare complesso. Il mocking è una tecnica potente che simula il comportamento di interazioni reali complesse all'interno dei test, senza la loro complessità e imprevedibilità.

Ad esempio, se è necessario testare un servizio di cambio valuta, una possibilità potrebbe essere quella di utilizzare fondi propri per simulare le transazioni e osservare i risultati. Tuttavia, questo metodo può essere rischioso e costoso. Un'alternativa più efficiente e priva di rischi è utilizzare il mocking per emulare il processo di invio di denaro.

Test di un servizio di trasferimento di denaro

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

Approccio al test:

  1. Mock dei saldi dei conti: usare il mocking per simulare diversi stati dei conti, come fondi insufficienti o fondi abbondanti, per testare come il metodo di trasferimento risponde;
  2. Verifica delle transazioni: confermare che gli importi appropriati vengano addebitati e accreditati sui rispettivi conti durante un trasferimento;
  3. Gestione delle eccezioni: assicurarsi che il metodo gestisca correttamente gli scenari in cui il trasferimento non può essere completato.
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)
Compito

Swipe to start coding

Il tuo compito è scrivere test unitari per la classe MoneyTransferService utilizzando il framework unittest e unittest.mock. Devi:

  • Creare una classe di test che eredita da unittest.TestCase;
  • Utilizzare MagicMock per simulare oggetti account;
  • Implementare due metodi di test con questi nomi esatti:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • In test_successful_transfer, testare un trasferimento in cui la fonte dispone di fondi sufficienti e verificare sia il valore restituito sia i saldi aggiornati;
  • In test_failed_transfer_due_to_insufficient_funds, testare un trasferimento in cui la fonte non dispone di fondi sufficienti, verificare che venga sollevato un ValueError e controllare che i saldi rimangano invariati.

Nota: I nomi delle funzioni di test devono corrispondere esattamente a quelli sopra indicati. I tuoi test devono verificare il comportamento controllando direttamente valori e gestione delle eccezioni, senza utilizzare regex o pattern matching.

Soluzione

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 5. Capitolo 4
single

single

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

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

bookTecniche di Mocking in Unittest: Simulazione delle Dipendenze

Scorri per mostrare il menu

Testare codice che dipende da servizi esterni, configurazioni o che presenta effetti collaterali può risultare complesso. Il mocking è una tecnica potente che simula il comportamento di interazioni reali complesse all'interno dei test, senza la loro complessità e imprevedibilità.

Ad esempio, se è necessario testare un servizio di cambio valuta, una possibilità potrebbe essere quella di utilizzare fondi propri per simulare le transazioni e osservare i risultati. Tuttavia, questo metodo può essere rischioso e costoso. Un'alternativa più efficiente e priva di rischi è utilizzare il mocking per emulare il processo di invio di denaro.

Test di un servizio di trasferimento di denaro

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

Approccio al test:

  1. Mock dei saldi dei conti: usare il mocking per simulare diversi stati dei conti, come fondi insufficienti o fondi abbondanti, per testare come il metodo di trasferimento risponde;
  2. Verifica delle transazioni: confermare che gli importi appropriati vengano addebitati e accreditati sui rispettivi conti durante un trasferimento;
  3. Gestione delle eccezioni: assicurarsi che il metodo gestisca correttamente gli scenari in cui il trasferimento non può essere completato.
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)
Compito

Swipe to start coding

Il tuo compito è scrivere test unitari per la classe MoneyTransferService utilizzando il framework unittest e unittest.mock. Devi:

  • Creare una classe di test che eredita da unittest.TestCase;
  • Utilizzare MagicMock per simulare oggetti account;
  • Implementare due metodi di test con questi nomi esatti:
    • test_successful_transfer;
    • test_failed_transfer_due_to_insufficient_funds.
  • In test_successful_transfer, testare un trasferimento in cui la fonte dispone di fondi sufficienti e verificare sia il valore restituito sia i saldi aggiornati;
  • In test_failed_transfer_due_to_insufficient_funds, testare un trasferimento in cui la fonte non dispone di fondi sufficienti, verificare che venga sollevato un ValueError e controllare che i saldi rimangano invariati.

Nota: I nomi delle funzioni di test devono corrispondere esattamente a quelli sopra indicati. I tuoi test devono verificare il comportamento controllando direttamente valori e gestione delle eccezioni, senza utilizzare regex o pattern matching.

Soluzione

Switch to desktopCambia al desktop per esercitarti nel mondo realeContinua da dove ti trovi utilizzando una delle opzioni seguenti
Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 5. Capitolo 4
single

single

some-alt