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 • ...