Testing delle classi Testing del software

Transcript

Testing delle classi Testing del software
20/12/16
Testing delle classi
Corso di Principi di Progettazione del Software, a.a. 2016/17
20 dicembre 2016
ing. Roberto Vergallo
1
Testing del software
■ Tradizionalmente, prima fase del testing “a mano”…
System.out.println(“Valore di a = ” + a);
■ …poi, test funzionali
2
1
20/12/16
Suite Test
■ Necessità di test automatici: tutti i Test sono raggruppati in
una “Suite” che deve poter essere eseguita
automaticamente e che cresce man mano che il sistema
viene sviluppato, aggiungendo sempre nuovi Test.
■ …Perché? Il poterli eseguire tutti in un tempo ragionevole
premendo un pulsante è importante per ottenere tutte le
volte che è necessario un feedback sull’integrità del
sistema.
3
Testing automatico
■ Per ottenere il massimo vantaggio dai Test, questi ultimi devono essere
eseguiti in modo automatico.
■ Un Test automatico deve essere in grado di:
1. eseguire senza intervento manuale le operazioni di generazione dei dati di Test
(Fixture)
2. l’elaborazione dei dati
3. la verifica dei risultati ottenuti
4. Eventualmente, la registrazione dei risultati.
■ Garanzia della ripetibilità dei test
– Se le classi coinvolte nel Test non vengono modificate, gli stessi Test ripetuti anche
diverse volte producono sempre gli stessi risultati.
– Questo non è garantito con altri tipi di test
4
2
20/12/16
Test di Unità
■ I Test di Unità vengono definiti e scritti dai programmatori durante lo
sviluppo del codice
■ Consentono di verificare il corretto funzionamento di ogni singolo
elemento del quale è costituito il sistema.
■ Tali unità corrispondono di solito ad una classe oppure ad un modulo
più complesso, per esempio un Package.
5
Junit - Introduzione
■ Framework Java per esecuzione di Test di Unità e
Regressione
– Il Test di Regressione ha come obiettivo quello di verificare che una
nuova versione di un programma non fallisca nessun test di quelli
già effettuati su versioni precedenti dello stesso
– Fornisce strumenti per verificare la validità di asserzioni
– Permette di eseguire più casi di test per un singolo metodo
– Permette di eseguire test in modo semplice e veloce (uso di test
Suite)
– Download JUnit: http://junit.org/index.htm
6
3
20/12/16
Junit – Guida all’Uso
■ JUnit rappresenta il Framework di Test più diffuso in
ambiente Java.
■ Le classi che compongono il Framework sono contenute
nella libreria junit.jar.
■ Per poter eseguire dei Test con JUnit è necessario scrivere
le classi di Test seguendo alcune regole.
– I metodi di Test, per essere riconosciuti come tali da JUnit, devono
avere un nome che inizia con “test”, ossia devono essere del tipo
testXXX .
7
Junit – Guida all’Uso (cont.)
■ Per creare test in JUnit bisogna definire un metodo pubblico
per ogni metodo da testare, facendolo precedere dalla
“annotation” @Test
■ Test definiti tramite l’uso della famiglia di ASSERTXXX()
–
–
–
–
–
assertTrue(<condizione>)
assertFalse(<condizione>)
assertEquals(<obj1>,<obj2>)
fail(<message>)
...
8
4
20/12/16
Esempio classe di Test
■ Una semplice classe di Test si presenta nel seguente
modo:
public class ProvaTest {
@Test
public void testMioMetodo() {
fail("Not yet implemented");
}
}
9
Suite Test
■ Un’altra caratteristica di JUnit è la possibilità di raggruppare
i Test in “Suite” e di eseguire tali Suite singolarmente o tutte
insieme.
■ Questa funzionalità è molto utile quando si deve verificare
la funzionalità dell’intero sistema, per esempio nella fase di
integrazione giornaliera.
– istanziare un oggetto di tipo TestSuite;
– aggiungere i test alla suite invocando il metodo addTest(Test)
sull'oggetto istanziato
10
5
20/12/16
setUp()
■ I dati sui quali vengono effettuate le elaborazioni all’interno di un
metodo di Test al fine di verificare il corretto funzionamento di una certa
parte del sistema, devono essere opportunamente definiti e inizializzati.
■
Se si individua un’insieme di variabili comuni a tutti i metodi di una
classe di Test, queste vengono inizializzate all’interno del metodo
setUp().
■ Tali variabili sono dette la “Fixture” del Test.
■ Il metodo setUp() viene richiamato da JUnit prima dell’esecuzione di
ciascun metodo di Test.
■ In questo modo, eventuali modifiche dei dati all’interno di un metodo
non avranno nessuna influenza sugli altri metodi di Test. Ovviamente
non si può fare affidamento su setUp() nei casi in cui non esista una
Fixture comune a tutti i metodi di Test.
11
tearDown()
■ Il metodo setUp() ha anche una controparte che è il metodo
tearDown().
■ Quest’ultimo viene richiamato da JUnit dopo l’esecuzione di
un qualunque metodo di Test, allo scopo di consentire al
programmatore il rilascio di eventuali risorse allocate nel
metodo setUp().
■ Per esempio, se all’interno del metodo setUp() viene aperta
una connessione a un Database, sarebbe conveniente
chiuderla all’interno del metodo tearDown() prima di
ricrearne un’altra per un altro metodo di Test.
12
6
20/12/16
Errori JUnit
■ JUnit prevede due tipi di errori: gli errori e i fallimenti.
■ I primi sono problemi gravi che bloccherebbero il
funzionamento del sistema, come l’Overflow di memoria o il
lancio di un’eccezione dovuta per esempio ad un File non
trovato,
■ mentre i secondi derivano dal non soddisfacimento di
condizioni richieste nel Test, come l’uguaglianza tra due
variabili.
13
Verifiche dei risultati
■ JUnit non richiede verifiche manuali dei risultati.
■ Dalla classe TestCase vengono ereditati per esempio i
metodi assertEquals() per la verifica dell’uguaglianza di
diversi tipi di dati.
■ Il Test si riconduce alla verifica dell’uguaglianza tra il
dato atteso e quello calcolato.
■ Se i due dati differiscono, verrà segnalato un fallimento con
la descrizione del problema e l’indicazione del punto in cui
si è verificato.
14
7
20/12/16
Metodi assertX
■ static void assertTrue(boolean test)
■ static void assertFalse(boolean test)
■ assertEquals(expected, actual)
■ assertSame(Object expected, Object actual)
■ assertNotSame(Object expected, Object actual)
■ assertNull(Object object)
■ assertNotNull(Object object)
■ fail()
15
8