emm..
grazie mille ragazzi ma non capisco fino in fondo

erchè con una test suite possono saltare fuori errori che altrimenti testando nel modo normale non apparirebbero?
Voglio dire perchè non testare tutto a mano invece( e qui penso sia il mio fraintendimento)che fare la stessa cosa da codice?
grazie
Descrivere i vantaggi di usare una test suite non è semplice. Provo a fornirtene alcuni (quelli che mi vengono in mente).
Logica: prendiamo l'esempio più classico: una funzione. Testare una funzione "manualmente" significa leggere il codice dall'alto verso il basso e capirne la logica, assicurandosi che quello che è stato scritto sia effettivamente corretto. La difficoltà di intraprendere questo tipo di controllo è direttamente proporzionale alla complessità e alla lunghezza della funzione ed è molto facile che alcuni tipi di errori sfuggano all'occhio umano (provato sulla mia pelle). Con una test suite utilizzi un approccio profondamente diverso: non vai più ad indagare sulla logica interna della funzione ma su quello che tu ti aspetti che essa ritorni e/o sulle eccezioni / errori che ti aspetti che essa sollevi se in input vengono forniti determinati parametri.
Sebbene quest'ultimo possa apparire un po' fuorviante in quanto il concetto di "errore" o "eccezione" è un qualcosa di tipicamente negativo e da evitare, all'interno della test suite esso è perfettamente legittimo in quanto tu stesso crei delle casistiche che lo sollecitano espressamente.
Esempio da due soldi: su una funzione che somma due numeri:
codice:
def somma(a, b):
return a + b
...puoi andare a testare le seguenti casistiche:
# che chiamando la funzione usando come agomenti 2 e 3 sia effettivamente ritornato 5.
# che un intero sommato ad una stringa (2 + '3') ritorni effettivamente un errore di "tipizzazione" (non puoi mischiare interi e stringhe).
In questo esempio particolare utilizzare una test suite non sarebbe conveniente in quanto la logica della funzione è troppo semplice, ma più le funzioni sono complesse, lunghe e numerose, più è conveniente adottarla.
Manutenibilità: la crescita di un software include migliorie, bug fixing, varie modifiche strutturali al codice e ovviamente il versionamento. Tipicamente le funzioni "cardine" di un programma subiscono spesso modifiche al loro interno (es: correzione di bug) ma quello che tu ti aspetti da loro rimane bene o male sempre le stesso (nel dettaglio: cosa ritornano e in quali casi sollevano errori/eccezioni).
Il vantaggio in questo caso consiste nell'avere una suite che sarà ragionevolmente valida per tutte le versioni future.
Tipicamente la test suite che scrivi per la prima versione del tuo software resta bene o male invariata (o cmq strutturalmente molto simile) e valida per tutte le versioni a venire, ovviamente escludendo le parti aggiuntive al codice per le quali dovrai aggiungere casistiche alla struttura originale della test suite.
Qualità: un SW fornito di test suite è indice del fatto che "tu l'hai testato". Scaricare un progetto open source, specialmente se una libreria "da programmatore per programmatore" e vederlo corredato di test suite è sicuramente una sicurezza aggiuntiva per l'utilizzatore.
Portabilità: la test suite può essere provata da altre persone su sistemi operativi e piattaforme differenti dalle tue. Distribuendo un programma open source corredato di test suite dai ad altre persone la posisbilità di testare "on the fly" il corretto funzionamento del tuo software sul loro sistema e notificarti eventualmente bug nel caso in cui uno o più test falliscano.
Versatilità: Il più grande vantaggio: la test suite la scrivi "una volta per tutte" e "una volta per tutti". Immagina che per il tuo software intendi testare 40 casistiche di comportamento ("la funzione x ritorna y?" ecc...) e che le stesse le intendi provare su 3 sistemi operativi differenti (es: linux, windows, osx) e 3 piattaforme differenti (es: Java 1.4, Java 1.5, Java 1.6) per testare la portabilità del tuo software. Non utilizzando una test suite dovresti compiere la bellezza di 360 test a mano:
codice:
40 * (Java 1.4, Java 1.5, Java 1.6) = 120
120 * (Linux + Windows + OSx) = 360
Con una test suite il tutto si ridurrebbe a lanciare un solo script 9 volte:
codice:
1 * (Java 1.4, Java 1.5, Java 1.6) = 3
3 * (Linux + Windows + OSx) = 9
...in un tempo ovviamente di molto minore e sopratutto in maniera affidabile. Il computer non sbaglia: quello che hai scritto la test suite fa. A te dopo la 30 esima casistica di test verificata 'a mano' incominciano ad incrociarsi gli occhi.