Testare Funzioni con Decoratori in Python usando unittest e pytest

by theArchitect
SHARE
Testare Funzioni con Decoratori in Python usando unittest e pytest
© Guida-HTML5.it

Introduzione

In questo tutorial, esploreremo come testare funzioni decorate in Python utilizzando i framework di testing unittest e pytest. I decoratori sono una potente funzionalità di Python che consente di modificare il comportamento delle funzioni. Tuttavia, possono rendere più complesso il testing. Impareremo a scrivere test efficaci per funzioni decorate, garantendo che il comportamento atteso sia mantenuto.

Codice completo

Cominciamo con un esempio di una funzione decorata. Creeremo un decoratore che misura il tempo di esecuzione di una funzione e poi testeremo questa funzione decorata.

import time
from functools import wraps

# Decoratore che misura il tempo di esecuzione
def timer_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Funzione {func.__name__} eseguita in {end_time - start_time:.4f} secondi")
        return result
    return wrapper

# Funzione da testare
@timer_decorator
def add(a, b):
    time.sleep(1)  # Simula un´operazione lunga
    return a + b

Spiegazione

Nel codice sopra, abbiamo definito un decoratore chiamato timer_decorator che misura il tempo di esecuzione di una funzione. Il decoratore utilizza functools.wraps per mantenere il nome e la docstring della funzione originale. La funzione add è decorata con timer_decorator e simula un´operazione lunga utilizzando time.sleep.

Ora, vediamo come scrivere test per questa funzione decorata. Creeremo due test: uno per verificare che la funzione restituisca il risultato corretto e un altro per testare che il decoratore funzioni come previsto.

import unittest

class TestAddFunction(unittest.TestCase):
    def test_add(self):
        # Testa che la funzione add restituisca il risultato corretto
        self.assertEqual(add(2, 3), 5)

    def test_timer_decorator(self):
        # Testa che il decoratore funzioni
        start_time = time.time()
        add(2, 3)
        end_time = time.time()
        # Verifica che il tempo di esecuzione sia maggiore di 1 secondo
        self.assertGreater(end_time - start_time, 1)

if __name__ == ´__main__´:
    unittest.main()

Best practice

Quando si testano funzioni decorate, è importante considerare alcune best practice:

  • Isolare i test: Assicurati che i test siano indipendenti l´uno dall´altro. Ogni test dovrebbe verificare un comportamento specifico.
  • Utilizzare mock: Se il decoratore interagisce con risorse esterne (come database o API), considera l´uso di unittest.mock per simulare queste interazioni.
  • Testare il comportamento atteso: Non limitarti a testare i risultati; verifica anche che il comportamento della funzione decorata sia quello previsto.
  • Documentare i test: Scrivi commenti chiari per ogni test, spiegando cosa stai verificando e perché.

Riepilogo

In questo tutorial, abbiamo visto come testare funzioni decorate in Python utilizzando i framework unittest e pytest. Abbiamo creato un decoratore che misura il tempo di esecuzione di una funzione e abbiamo scritto test per verificare sia il risultato della funzione che il comportamento del decoratore. Seguendo le best practice, puoi garantire che il tuo codice sia robusto e facilmente manutenibile.

Approfondisci con risorse ufficiali

SHARE