Mocking e Isolamento dei Test
Scorri per mostrare il menu
Il mocking è una tecnica potente nei test unitari che consente di sostituire parti del sistema sotto test con oggetti mock o funzioni. L'obiettivo è isolare l'unità di codice che si sta testando dalle sue dipendenze, come database, API o altri sistemi complessi. Utilizzando i mock, è possibile controllare il comportamento delle dipendenze e concentrarsi sul test della logica del proprio codice in un ambiente controllato.
L'isolamento dei test è importante perché garantisce che i test non interferiscano tra loro e non siano influenzati da fattori esterni al loro ambito. I test isolati sono più affidabili e più facili da eseguire il debug, poiché i loro risultati dipendono solo dal codice sotto test e dalle condizioni specifiche impostate, non dallo stato o dal comportamento di sistemi esterni.
In Python, il modulo unittest.mock fornisce strumenti per il mocking di oggetti e funzioni. Quando si utilizza il mocking, è possibile sostituire una funzione o un oggetto reale con un mock che restituisce valori controllati o registra come è stato utilizzato. Questo è particolarmente utile quando il codice interagisce con risorse lente, imprevedibili o non disponibili durante il test.
12345678910111213141516171819202122232425import unittest from unittest.mock import patch def check_the_sky(): # Simulate a slow or unreliable API raise ConnectionError("API not available") def get_advice(): if check_the_sky(): return "Take an umbrella." else: return "Enjoy the sunshine!" class TestWeather(unittest.TestCase): @patch('__main__.check_the_sky') def test_advice_when_rainy(self, mock_check): mock_check.return_value = True self.assertEqual(get_advice(), "Take an umbrella.") @patch('__main__.check_the_sky') def test_advice_when_clear(self, mock_check): mock_check.return_value = False self.assertEqual(get_advice(), "Enjoy the sunshine!") unittest.main(argv=[''], exit=False)
In questo esempio di codice, la funzione check_the_sky simula una dipendenza esterna che è inaffidabile o non funzionante, come un'API meteo che potrebbe non essere sempre disponibile. La funzione get_advice contiene la logica che si desidera testare — chiama check_the_sky e restituisce un consiglio in base al risultato.
La classe di test unittest utilizza il mocking per sostituire la funzione reale check_the_sky con un mock che restituisce valori controllati. Questo permette di testare come si comporta get_advice in diversi scenari, come quando il cielo è sereno o piovoso, senza dipendere dal sistema esterno reale.
Il decoratore @patch viene utilizzato per sostituire temporaneamente la funzione reale check_the_sky con un oggetto mock durante ciascun metodo di test. L'oggetto mock viene passato al metodo di test come parametro mock_check. Si utilizza mock_check per impostare il valore di ritorno desiderato per quel test, così da poter controllare il comportamento del codice e cosa restituisce in ogni scenario.
La funzione unittest.main() in questa lezione include alcuni parametri aggiuntivi richiesti solo per questo ambiente di apprendimento. Questi aiutano il codice a funzionare correttamente sulla piattaforma e non fanno parte dei concetti fondamentali di Python che devi apprendere ora.
Utilizzando il mocking, isoli i tuoi test da sistemi esterni che possono essere lenti o inaffidabili. Questo rende i test veloci, ripetibili e deterministici, perché controlli esattamente cosa restituisce la dipendenza in ogni caso di test.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione