Usare il tool emma
info3
angelo gargantini @ unibg
Cosa vuol dire copertura
• Quando si scrivono dei test è importante:
1) controllare mediante assert che il ns programma
si comporti come atteso
2) valutare alla fine quanto del nostro programma è
stato testato.
Cosa è emma
• Emma è un tool (free) per la valutazione della
copertura di codice java
• http://emma.sourceforge.net/
• Ci sono altri tool
– cobertura:http://cobertura.sourceforge.net
– Codecover http://codecover.org
Come funziona
1. scrivi e compila il tuo codice java come al
solito
•
in eclipse
•
•
•
fai nuovo progetto (ad esempio emmaprj)
fai nuova classe Prova (ad esempio dal menu file,
new class)
– Usa il package di default
compila e fai run normalmente
Come funziona
1. download emmaxxx-lib.zip dal sito di
emma o dal sito del corso ed estrai
emma.jar salvandolo nella directory dove
ci sono i file *.class da testare
•
•
in eclipse, nella directory che contiene tutto il
progetto emmaprj cerca la directory con nome
classes
tipo Documents and settings/<nome
utente>/workspace /emmaprj/lì dentro ci sono i tuoi
*.class
2. apri una finestra DOS e fai cd fino alla
directory dove hai messo emma.jar
•
•
se fai dir dovresti vedere emma.jar e il file .class
usa tab per auto completion
Lancia emma
• Esegui il programma originale con emma in
diversi modi:
– esegui emma per avere informazioni in coverage.txt:
java –cp emma.jar emmarun –cp . Prova
• per avere output in html (in dir. coverage) usa
l'opzione -r html
java –cp emma.jar emmarun -r html –cp . Prova
• per avere il sorgente marcato usa l'opzione -sp
<directory dove hai i sorgenti>
java –cp emma.jar emmarun -r html -sp .
–cp . Prova
Con i package e separati i class
• Se usi un package pack
– i tuoi file java hanno all’inizio package pack
– i *.java si trovano nella sotto directory src/pack
– i *.class si trovano nella sotto directory bin/pack
– Devi seguire i comandi
java –cp emma.jar emmarun -sp ../src –cp .
pack.Esercizio
• EMMA supports class, method, line, and basic
block coverage
• EMMA does not do branch or path coverage.
However, EMMA reports fractional line coverage
to help you visualize untested branches in code.
Struttura esempi
• nei nostri esempi avremo
– il metodo da testare con nome foooo
– nel main metteremo le chiamate al metodo foooo
corrispondenti ai casi di test che abbiamo trovato
Esempio
• Scrivi un metodo che prende un intero x e
un array di interi e se x è 0 restituisce il
primo intero (o 0 se l’array è vuoto),
altrimenti se x non è 0, restituisce l’intero
più grande nell’array se è maggiore di x,
altrimenti restituisce x
• scrivi il grafo, trova i casi di test per
copertura dei comandi, dei branch,
decisioni e condizioni
• prova poi con emma
Esercizio
• scrivi un metodo azzera che dati due interi a e b e
un array di interi, azzera tutti gli elementi
dell’array compresi tra a e b, quelli minori di a li
mette a -1 e quelli maggiori di b a +2
• opzionale: scrivi un metodo che dato un array di
interi ne stampa il contenuto e usalo nel main
prima e dopo la chiamata del metodo azzera
• scrivi il grafo, trova i casi di test per copertura dei
comandi, dei branche, decisioni e condizioni,
MCDC
• prova poi con emma
Esercizio 2
• Scrivi un metodo BISESISTILE che prende in
ingresso un numero x restituisce true se x è un
anno bisestile e false altrimenti
• Fai il digramma di flusso di controllo del metodo,
trova i percorsi per lo statement coverage e
decision e branch coverage
• Trova i casi di test e provali in EMMA
• Quali altri casi di test servono per avere l’MCDC?
Con Junit e Emma
Puoi eseguire i casi di test del tuo programma con
junit e vedere la coprtura ottenuta. Non è
semplice. Il comando è:
java -cp emma.jar emmarun -r html -sp . -cp
<classpath che contiene i jar per junit> -r
html
org.eclipse.jdt.internal.junit.
runner. RemoteTestRunner -classNames ProvaTest
Ad esempio:
java
-cp
emma.jar
emmarun
-r
html
-sp
.
-cp.:/home/garganti/local/eclipse/plugins/org.junit_3.8.1/junit.jar:/ho
me/garganti/local/eclipse/plugins/org.eclipse.jdt.junit_3.1.1/junitsup
port.jar:/home/garganti/local/eclipse/plugins/org.eclipse.jdt.junit.run
time_3.1.0/junitruntime.jar
-r
html
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner -version 3
-port 49039 -classNames ProvaTest
Raccolta dati
• Potete anche unire la copertura ottenuta da
diverse run del programma per avere un unico
report:
1. esegui emmarun con opzione merge
java -cp emma.jar emmarun -merge yes -raw -cp . <mainclass>
2. genera il report totale:
java -cp emma.jar emma report -r html -sp . -in coverage.es
Istrumentazione
• invece che eseguire emmarun per avere la
copertura puoi alternativamente fare così:
• 1. genera un jar dal tuo programma (puoi usare
export to jar di eclipse, identifica la mainclass)
– per eseguirlo puoi fare java -jar progetto.jar
• 2. istrumenta il tuo jar in modo di avere un jar
modificato
– java -cp emma.jar emma instr -m overwrite -cp
progetto.jar
• 3. esegui il jar come prima (però con class path
che includa emma.jar)
– java -cp emma.jar progetto.jar
Eclemma
• Invece che usare emma, noi useremo eclemma:
piccola demo
• eclemma.sf.net
• Scarica il file .zip e fai l'unzip nella directory di
eclipse
Con Eclemma puoi
• Lanciare un tuo programma e vedere la copertura
durante il suo uso
• Lanciare I tuoi casi di test e vedere la copertura
• Vedere in dettaglio I dati della copertura ed
esportarli
• Fare il merge di sessioni
Annotazione del codice
• Verde: testato
• Rosso: non testato
• Giallo: testato
parzialmente
• Esempio:
if(a) …
a è testato solo true
Visione globale
Alternativa: codecover
• http://codecover.org/
• Codecover ad esempio fornisce anche altre
informazioni:
• Copertura delle condizioni nelle decisioni
• Ridondanza dei casi di test
• ...