2. Parte 3
Unit Testing
in Perl
Linguaggi dinamici – A.A. 2009/2010
2
3. Introduzione
Il Perl mette a disposizione tutta una serie di
meccanismi per lo Unit Testing di moduli
Moduli della gerarchia Test::*
Test::Simple: test semplici, da eseguire su
singoli statement
Test::More: estensione di Test::More con più
tipologie di controlli
Test::Harness: creazione suite di test
perldoc Test::Simple, perldoc Test::More,
perldoc Test::Harness
Linguaggi dinamici – A.A. 2009/2010
3
4. Test semplici con Test::Simple
Il modulo Test::Simple fornisce un supporto di
base per lo Unit Testing in Perl
Viene fornito il metodo di base per le
asserzioni: ok()
ok($expr, $test_name);
Valuta $expr in contesto scalare, e stampa “ok”
se tutto va bene, “not ok” se qualcosa va storto
Se $name è una stringa non nulla, viene
stampata insieme al risultato del test
Linguaggi dinamici – A.A. 2009/2010
4
5. Test semplici con Test::Simple
Un test è un file richiedente Test::Simple ed
invocante un certo numero di asserzioni ok()
Il numero totale di asserzioni viene stampato
all'inizio, nella forma 1..M (M=numero
asserzioni)
Il programma termina con un codice di uscita
indicante quanti test sono stati sbagliati
0: tutti i test sono andati a buon fine
255: tutti i test sono falliti
1-254: numero di test falliti
Linguaggi dinamici – A.A. 2009/2010
5
6. Test semplici con Test::Simple
L'insieme dei test che si vuole eseguire è detto
test plan
E' possibile specificare il test plan in termini di
numero di test da eseguire
Parametro tests del modulo
use Test::Simple tests = 1;
Si riesce a capire se il test ha abortito
prematuramente
Il test plan deve essere specificato, pena un
messaggio di errore
Linguaggi dinamici – A.A. 2009/2010
6
7. ESEMPI:
simple1.pl
Test di moduli con Test::Simple simple2.pl
Si importa il modulo desiderato
Si esegue una funzione del modulo
Si confronta il risultato della funzione con un
valore di riferimento
Lo stesso discorso vale anche per gli oggetti!
Con Test::Simple è possibile effettuare
asserzioni solo su scalari semplici
Linguaggi dinamici – A.A. 2009/2010
7
8. Test più complessi con Test::More
Il modulo Test::More introduce diverse
estensioni funzionali a Test::Simple
Test plan non dichiarabile esplicitamente
Introduzione di asserzioni più complesse di ok()
Supporto per i test condizionali
Controllo del flusso di un test
Linguaggi dinamici – A.A. 2009/2010
8
9. ESEMPI:
more1.pl
Test più complessi con Test::More more2.pl
Analogamente a Test::Simple, è possibile
predichiarare il numero di test eseguiti
all'interno del file
Diversamente da Test::Simple, tale
dichiarazione non è più obbligatoria
Funzione no_plan del modulo
use Test::More qw( no_plan );
E' anche possibile saltare l'intero test
Parametro skip_all del modulo
use Test::More skip_all = $skip_reason;
Linguaggi dinamici – A.A. 2009/2010
9
10. ESEMPI:
more3.pl
Test più complessi con Test::More
E' possibile calcolare dinamicamente il numero
di test che saranno eseguiti!
Funzione plan():
associa al parametro tests il risultato di una
espressione
oppure associa al parametro skip_all il motivo
della non esecuzione del test
E' possibile differenziare il test fra diversi
sistemi operativi, usando la variabile speciale
$^O
Linguaggi dinamici – A.A. 2009/2010
10
11. ESEMPI:
more4.pl
Test più complessi con Test::More
Asserzione is(): è funzionalmente identica ad
ok()
Effettua il controllo con eq
Stampa il motivo per cui l'asserzione fallisce
Fortemente consigliata rispetto ad ok()
Asserzione isnt(): negazione di is()
Effettua il controllo con ne
Stampa il motivo per cui l'asserzione fallisce
Fortemente consigliata rispetto a ! ok()
Linguaggi dinamici – A.A. 2009/2010
11
12. ESEMPI:
more5.pl
Test più complessi con Test::More
Asserzione like(): controlla se una variabile fa
match con una espressione regolare
like($got, qr/expected/, 'this is like that');
Equivalente a ok( $got =~ /expected/, 'this is like
that');
L'uso di like() è preferito, per via del miglior
output diagnostico
Si noti l'operatore qr, che compila una
espressione in una espressione regolare
perldoc perlop
Asserzione unlike(): negazione di like()
Linguaggi dinamici – A.A. 2009/2010
12
13. Test più complessi con Test::More
Asserzione cmp_ok(): confronto effettuato con
una funzione specifica
cmp_ok( $got, 'eq', $expected, 'this eq that' );
cmp_ok( $got, '==', $expected, 'this == that' );
Linguaggi dinamici – A.A. 2009/2010
13
14. ESEMPI:
more6.pl
Test più complessi con Test::More more8.pl
Asserzione can_ok(): verifica se un modulo
(oppure un'istanza di oggetto) hanno a
disposizione il metodo specificato
can_ok('Foo', qw(method_name));
Equivalente a ok(Foo-can('method_name'));
Asserzione isa_ok(): verifica se un oggetto è
un'istanza di una classe specifica
isa_ok( $obj, 'Some::Module' );
Equivalente a ok(Foo-isa('Some::Module'));
Linguaggi dinamici – A.A. 2009/2010
14
15. ESEMPI:
more7.pl
Test più complessi con Test::More
Asserzione pass(): crea un test che passa
sempre
Equivalente a ok(1);
Asserzione fail(): crea un test che fallisce
sempre
Equivalente a ok(0);
Linguaggi dinamici – A.A. 2009/2010
15
16. Test più complessi con Test::More
Asserzione new_ok(): crea un oggetto di una
data classe, lo assegna ad una variabile e
verifica la corretta creazione
my $obj = new_ok( $class );
my $obj = new_ok( $class = @args );
Equivalente a
my $obj = $class-new(@args);
isa_ok $obj, $class, $object_name;
Linguaggi dinamici – A.A. 2009/2010
16
17. Test più complessi con Test::More
Asserzione use_ok(): verifica se è possibile
caricare un dato modulo
BEGIN { use_ok($module); }
BEGIN { use_ok($module, @imports); }
L'asserzione va inserita in un blocco BEGIN
In tal modo, le funzioni esportate sono
disponibili al test subito dopo la compilazione
Linguaggi dinamici – A.A. 2009/2010
17
18. ESEMPI:
Esecuzione condizionale con more9.pl
Test::More
E' possibile definire due blocchi di codice dal
nome SKIP e TODO
Blocco SKIP: dichiara una sequenza di test che
devono essere ignorati
Contiene una chiamata di funzione skip che
specifica quanti test saltare, sotto quale
condizione
Blocco TODO: dichiara una sequenza di test
che ci si aspetta fallisca
Contiene una assegnazione del motivo di
fallimento alla variabile stringa local TODO
Linguaggi dinamici – A.A. 2009/2010
18
19. ESEMPI:
harness1.pl
Suite di test con Test::Harness
Il modulo Test::Harness fornisce uno
strumento basilare per la creazione di suite di
test
Viene messo a disposizione il metodo runtests
()
Accetta una lista di nomi di file
Esegue i test relativi
Interpreta lo stdout dei test
Costruisce e presenta un report finale
E' convenzione usare l'estensione .t con i file
di test appartenenti a suite
Linguaggi dinamici – A.A. 2009/2010
19