Penso che tu stia confondendo test unitari con test basati sulle proprietà nella tua domanda.
Test delle unità guarda una classe come se fosse un'unità di elaborazione in una catena di elaborazione del segnale , come un circuito amplificatore o un rack effetti per chitarra. Penso che Kent Beck abbia usato esattamente questa metafora nel suo lavoro " Test Driven Development: per esempio ", ma al momento non ho una copia del libro da controllare.
Il punto è spiegare che è più facile controllare che un determinato filtro tenga sempre le alte frequenze, piuttosto che verificare se una combinazione specifica di molti filtri e distorsioni ti fa sembrare esattamente come Jimi Hendrix.
Applicato al tuo caso, potresti voler testare in un unit test che una classe List
possa add
elementi se necessario. Essendo rigoroso con la filosofia TDD, dovresti fare in modo che List
tenga già un numero casuale di elementi prima di aggiungerlo, altrimenti un'implementazione minima potrebbe conoscere il numero totale previsto e solo restituirlo .
Test basato su proprietà , d'altra parte, controlla che una funzione sia matematicamente ben definita nel senso che restituisce ciò che è previsto per l'intero dominio in cui è definito (la definizione qui è mio e potrebbe essere inaccurato). Puoi avere un'idea di come funziona leggendo su QuickCheck e ScalaCheck .
Il concetto base è che se passi al framework di test una funzione che ha una firma tipizzata, ad es. sum(one: Int, another: Int)
, quindi il framework genera molti test attraversando tutte le possibili varianti del tipo . Nell'esempio sum
, Int
va da Int.MinValue
a Int.MaxValue
: il framework seleziona, ad esempio, 100 coppie di valori e prova a sum
di esse. Per classi più complesse, potresti dover dire al framework come creare un'istanza Arbitraria della tua classe.
Applicato al tuo caso, potresti voler mostrare che il length
del tuo List
è sempre aumentato di uno dopo un'operazione di add
. Definisci un elenco arbitrario come un elenco che contiene già un numero casuale di elementi e definisci che dopo un add
questo numero viene aumentato di 1.
Il vantaggio principale dei test basati sulle proprietà è che ottieni automaticamente molti test scritti automaticamente e puoi persino controllare la generazione per cercare casi limite. Il test basato sulla proprietà genererà un elenco di 100 e controllerà che l'invariant sia valido; il test unitario dovrebbe essere ripetuto 100 volte al fine di darti tale garanzia. Tuttavia, i test basati sulle proprietà non sono una pallottola d'argento, è solo un complemento per i test unitari in determinate situazioni.