I test double (informalmente indicati anche con la denominazione impropria[1] di mock) sono uno strumento utilizzato in programmazione, specialmente orientata agli oggetti, come ausilio nello sviluppo di test unitari. Un test double è un oggetto che presenta la stessa interfaccia di un oggetto appartenente all'applicazione, ma ha un comportamento semplificato (o addirittura "vuoto"). Dato che l'interfaccia è la stessa, l'oggetto applicativo può essere "rimpiazzato" dal suo test double in quei test in cui il comportamento dell'oggetto reale non è rilevante o addirittura non è riproducibile. Le modalità con cui il test double viene sostituito all'oggetto reale sono in generale riconducibili alle tecniche di dependency injection. L'espressione "test double" è un calco da "stunt double", controfigura.[1]

Tipi di test double

modifica

Il concetto di test double è molto ampio e può applicarsi a oggetti "controfigura" con caratteristiche strutturali e funzionalità molto diverse fra loro. La classificazione dei tipi di test double, e la corrispondente terminologia, è stata storicamente incerta, ma si è andata gradualmente standardizzando. Fra gli altri, hanno proposto la classificazione "standard" Gerard Meszaros (nel libro XUnit Test Patterns del 2007)[2], Martin Fowler (Mocks Aren't Stubs[3]) e Robert "Uncle Bob" Martin.[1] La classificazione proposta da questi autori è stata adottata, tra l'altro, da Microsoft.[4]

I principali tipi di test double secondo la classificazione comune sono i seguenti:

  • Dummy. Un test double privo di comportamento. L'applicazione tipica di un dummy è al caso in cui sia necessario passare un oggetto come parametro a un metodo, ma si prevede che tale oggetto non sarà usato nel particolare flusso di esecuzione previsto dal test.
  • Stub. Un test double che fornisce un comportamento fissato (per esempio, dotato di metodi che tornano sempre lo stesso valore, senza eseguire alcuna computazione). Viene usato per controllare l'"input indiretto" del codice sotto test.
  • Spy. Un test double che memorizza i messaggi (chiamate di metodo) che riceve dal codice sotto test, in modo che sia possibile in seguito verificare che siano soddisfatte determinate aspettative.
  • Mock. Una variante dello "spy" in cui il test double è responsabile anche di memorizzare esplicitamente le aspettative sul comportamento del codice sotto test, e di verificare che siano soddisfatte.
  • Fake. Test double con un comportamento programmabile, che simula quello dell'oggetto reale (per esempio un oggetto che implementa un database in memoria invece di accedere a un database reale).
  1. ^ a b c Robert Martin, The Little Mocker
  2. ^ Gerard Meszaros, xUnit Test Patterns: Refactoring Test Code, Addison-Wesley, 2007, ISBN 978-0-13-149505-0.
  3. ^ Martin Fowler, Mocks Aren't Stubs, su martinfowler.com, 2007. URL consultato il 23 maggio 2015.
  4. ^ Mark Seemann, Exploring The Continuum Of Test Doubles, su msdn.microsoft.com, 2007. URL consultato il 23 maggio 2015.

Voci correlate

modifica