Test di unità con JUnit4



Похожие документы
Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Tale attività non è descritta in questa dispensa

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Architettura MVC-2: i JavaBeans

Introduzione all uso di Eclipse

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni server

Eclipse e Subversion

Programmazione a oggetti e JAVA. Prof. B.Buttarazzi A.A. 2011/2012

Esercitazione n 4. Obiettivi

Funzioni in C. Violetta Lonati

Programmazione Orientata agli Oggetti in Linguaggio Java

Eclipse. Avviare un progetto e compilare un semplice programma

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

Uno dei pregi di Java è quello di integrare la documentazione con il codice stesso Formato dei commenti:

Gestione delle Eccezioni

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Progettazione : Design Pattern Creazionali

Parola chiave extends

Inizializzazione, Assegnamento e Distruzione di Classi

Soluzione dell esercizio del 2 Febbraio 2004

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

Java: Compilatore e Interprete

Java Virtual Machine

Programmazione a Oggetti Lezione 10. Ereditarieta

Programmare in Java. Olga Scotti

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Concetto di Funzione e Procedura METODI in Java

Tricks & Tips. [Access] Tutorial - ActiveX - Controllo Tree View. - Michele de Nittis - Versione: 1 Data Versione: venerdì 30 agosto 2002

Algoritmi di Ricerca. Esempi di programmi Java

Generazione Automatica di Asserzioni da Modelli di Specifica

appunti delle lezioni Architetture client/server: applicazioni client

Prova di Laboratorio di Programmazione

Visibilità dei Membri di una Classe

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione Java Avanzata Concetti su Java

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

tesi di laurea Anno Accademico 2009/2010 relatore Ch.mo prof. Porfirio Tramontana candidato Pasquale Ludi Matr. 534\000438

Matematica in laboratorio

Il Web-Service SDMX dell ISTAT

SAPIENZA Università di Roma, Facoltà di Ingegneria

Breve introduzione al Javadoc


Scuola Digitale. Manuale utente. Copyright 2014, Axios Italia

Controllo degli accessi

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

SOMMARIO Coda (queue): QUEUE. QUEUE : specifica QUEUE

Guida all uso dell ambiente di sviluppo 1 integrato o IDE. JCreator LE 4.50

Introduzione a Classi e Oggetti

Java threads (2) Programmazione Concorrente

Un oggetto per la lettura dalla tastiera

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

esercizi Esercizi / problemi

Richiesta pagina PHP (es: index.php)

Java Web Services. Uso di Eclipse e Apache Axis

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

Visual Basic.NET La Gestione degli Errori di Federico BARBATI

SOMMARIO... 3 INTRODUZIONE...

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Programmazione 1 A.A. 2015/2016

Livelli di astrazione

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

UML Diagrammi delle classi. UML Diagramma classi 1

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

Multithreading in Java. Fondamenti di Sistemi Informativi

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Corso Analista Programmatore Web PHP Corso Online Analista Programmatore Web PHP

Modulo 4: Ereditarietà, interfacce e clonazione

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Fasi del ciclo di vita del software (riassunto) Progetto: generalità. Progetto e realizzazione (riassunto)

Sviluppo software guidato dal testing. metodologie e strumenti

Gestione Risorse Umane Web

Realizzazione di una classe con un associazione

6 BILANCI E NOTA INTEGRATIVA

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Supermarket Progetto di Programmazione Febbraio 2010

appunti delle lezioni Architetture client/server: applicazioni server

1 JSPDynPage, componenti portale e Java Server Pages

Manuale d uso della libreria Volta Log

Istruzioni per l installazione del software per gli esami ICoNExam (Aggiornate al 15/01/2014)

Operazioni di input/output. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San Giovanni

LAVORI ESTIVI DI INFORMATICA PER LA CLASSE IV Sez. Ainf (Prof. Tessore Luca)

PC/CSA. Manuale di utilizzo del PC/CSA Specifiche tecniche per lo scarico automatico dei dati dei pagamenti delle violazioni al Codice della Strada

Object Oriented Software Design

4 3 4 = 4 x x x 10 0 aaa

Telematica II 17. Esercitazione/Laboratorio 6

Basi di dati 9 febbraio 2010 Compito A

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

11/02/2015 MANUALE DI INSTALLAZIONE DELL APPLICAZIONE DESKTOP TELEMATICO VERSIONE 1.0

Introduzione al Linguaggio C

Corso di Informatica

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Транскрипт:

Test di unità con JUnit4

Richiamo sul test di unità Il test d unità è una metodologia che permette di verificare il corretto funzionamento di singole unità di codice in determinate condizioni. Nel caso di Java (e più in generale nella programmazione orientata agli oggetti) si considera come unità di codice un metodo o un gruppo di metodi che implementano una singola funzionalità. Il test di unità si un applicazione può essere organizzato in Test Case e Test Suite. Test Case: test che verifica una singola unità di codice Test Suite: gruppo di Test Case che verificano funzionalità correlate.

Progettare un Test Case 1. Individuare l unità di codice da testare (es. un metodo). 2. Definire un modo con cui può essere eseguito il codice dell unità da testare. 3. Definire un oracolo che, assumendo che il codice da testare sia corretto, preveda il risultato dell esecuzione dell unità da testare. 4. Scrivere l implementazione del Test Case: Eseguire il codice dell unità da testare. Verificare che il risultato della sua esecuzione sia conforme a quanto previsto dall oracolo.

Individuare l unità da testare In generale ogni unità di codice contenente una funzionalità che può essere eseguita deve essere testata. Esempio: Componenti algoritmiche dell applicazione. Tutto ciò che può modificare lo stato dell applicazione....

Come testare un unità Test Black-Box (funzionale) È indispensabile quando non si ha a disposizione l implementazione oppure quando si scrive il test prima dell implementazione (Test Driven Development) Test White-Box (strutturale) Questa tecnica può essere usata nelle sue diverse forme (vedere teoria...) quando si ha a disposizione l implementazione dell unità da testare. Può essere affiancata ai test Black-Box per migliorare ulteriormente la qualità del software.

JUnit È un framework open-source che supporta la scrittura e l esecuzione automatica di Test Case e Test Suite. Richiede l utilizzo di una libreria (solitamente già inclusa nella propria distribuzione di Java/Eclipse) http://www.junit.org Si integra con Eclipse Ne esistono due versioni principali il cui modo d uso è diverso: JUnit3 (diffuso prima Java 5 e tutt ora supportato) e JUnit4 (richiede Java 5 o superiore). Nel laboratorio useremo JUnit4.

Aggiungere libreria JUnit4 in Eclipse (1)

Aggiungere libreria JUnit4 in Eclipse (2)

Aggiungere libreria JUnit4 in Eclipse (3)

Aggiungere libreria JUnit4 in Eclipse (4)

JUnit: Test Case e Test Suite È necessario creare: 1. Per ogni classe da testare: una classe Test Case che conterrà tutti i test necessari per testare la classe. 2. Per ogni gruppo di Test Case correlati: una classe Test Suite che conterrà il riferimento a tutte le classi Test Case associate ad essa. È buona norma mettere le classi usate nel testing in una gerarchia di directory separata dal resto del codice.

Classe Test Case (1) Ogni classe Test Case è solitamente associata ad una classe da testare. Ogni classe Test Case può avere un nome arbitrario, ma normalmente si usa il nome della classe testata seguito da Test. Solitamente la classe Test Case appartiene allo stesso package della classe che viene testata. Tutti i test contenuti in una classe Test Case possono essere eseguiti direttamente dal menu Run As di Eclipse

Classe Test Case (2) Una classe Test Case non deve definire un costruttore e può avere i propri metodi annotati nel seguente modo: @Test (richiede import org.junit.test) Specifica che il metodo consiste in un test. @Before (richiede import org.junit.before) Specifica che il metodo deve essere eseguito prima di ogni test. @After (richiede import org.junit.after) Specifica che il metodo deve essere eseguito dopo ogni test. @BeforeClass (richiede import org.junit.beforeclass) Specifica che il metodo deve essere eseguito prima di eseguire il primo test. @AfterClass (richiede import org.junit.afterclass) Specifica che il metodo deve essere eseguito dopo aver eseguito l ultimo test. NB: i metodi annotati devono essere di tipo void, senza parametri, e devono avere la clausola throws Exception.

Classe Assert di JUnit Il risultato di ogni test deve essere confrontato con quello previsto dall oracolo. Il confronto tra il risultato ottenuto e quello previsto si effettua usando i metodi statici della classe Assert di JUnit. Se tutti i confronti hanno esito positivo, il test avrà successo, altrimenti il test fallisce. I metodi statici della classe Assert possono essere resi visibili come metodi statici privati della classe Test Case utilizzando questo import statico: import static org.junit.assert.*;

Metodi importanti della classe Assert fail(string msg) fa fallire il test mostrando msg come motivo. asserttrue(string msg, boolean cond) verifica che la condizione sia vera assertfalse(string msg, boolean cond) verifica che la condizione sia falsa assertnull(string msg, Object obj) verifica che l oggetto sia nullo assertequals(string msg, Object expected, Object actual) verifica che actual.equals(expected) sia vera assertsame(string msg, Object expected, Object actual) verifica che actual==expected sia vera

Esempio: ContoCorrente // classe che rappresenta un conto corrente (inizialmente a 0) public class ContoCorrente { // deposita soldi, se soldi e' positivo, il saldo // sara' incrementato, altrimenti il saldo resta // uguale e sara' lanciata una IllegalArgumentException public void deposita(int soldi) throws IllegalArgumentException {... } // preleva soldi, se soldi e' positivo e non maggiore // di saldo, il saldo sara' decrementato di soldi, // altrimenti resta uguale e sara' lanciata una // IllegalArgumentException public void preleva(int soldi) {... } } // restituisce il saldo corrente public int saldo() {... }

Classe Test Case Conto Corrente (1) import static org.junit.assert.*; import org.junit.before; import org.junit.test; public class ContoCorrenteTest { private ContoCorrente contocorrente; } @Before public void setup() throws Exception { // codice comune a tutti i test contocorrente = new ContoCorrente(); }... Il metodo annotato con @Before crea una istanza di ContoCorrente prima di ogni test.

Classe Test Case Conto Corrente (2) Descrizione test: un conto corrente nuovo deve avere saldo 0. @Test public void contohasaldoinizialezero() { assertequals("saldo iniziale non nullo", 0, contocorrente.saldo()); }

Classe Test Case Conto Corrente (3) @Test public void testdeposita() { contocorrente.deposita(1); assertequals("saldo 0 non diventa 1 dopo deposito di 1", 1,contoCorrente.saldo()); contocorrente.deposita(1); assertequals("saldo 1 non diventa 2 dopo deposito di 1", 2,contoCorrente.saldo()); try { contocorrente.deposita(0); fail("sono riuscito a depositare zero"); } catch (IllegalArgumentException e) { assertequals("deposito fallito ha cambiato il saldo", contocorrente.saldo(), 2); }... }

Classe Test Case Conto Corrente (4) @Test public void testpreleva() { try { contocorrente.preleva(1); fail("ho prelevato 1 da un conto con saldo zero"); } catch (IllegalArgumentException e) { assertequals("prelievo fallito ha cambiato il saldo", 0, contocorrente.saldo()); } contocorrente.deposita(50); contocorrente.preleva(25); assertequals("saldo 50 non diventa 25 dopo prelievo di 25", 25, contocorrente.saldo());

Classe Test Suite (1) È associata ad un insieme di classi Test Case Può avere un nome arbitrario, ma solitamente si usa un nome che finisce con Tests. Deve importare le seguenti classi di JUnit: import org.junit.runner.runwith; import org.junit.runners.suite; import org.junit.runners.suite.suiteclasses; Se in diverso package deve importare anche tutte le classi Test Case.

Classe Test Suite (2) import org.junit.runner.runwith; import org.junit.runners.suite; import org.junit.runners.suite.suiteclasses; @RunWith(Suite.class) @Suite.SuiteClasses( { FirstTest.class, SecondTest.class, })... public class AllTests { }

Classe Test Suite Conto Corrente import org.junit.runner.runwith; import org.junit.runners.suite; import org.junit.runners.suite.suiteclasses; @RunWith(Suite.class) @SuiteClasses({ ContoCorrenteTest.class }) public class AllTests { }

Esecuzione dei test (1)

Esecuzione dei test (2)

http://www.junit.org Riferimenti JUnit

Documentazione del codice con JavaDoc JavaDoc specifica una convenzione nella scrittura dei commenti della propria applicazione. Permette di generare automaticamente delle pagine HTML con la documentazione delle proprie classi. Lo stile della documentazione creata è lo stesso della documentazione ufficiale delle API Java: http://docs.oracle.com/javase/6/docs/api/

Esempio: JavaDOC di java.lang.string

Commenti Javadoc Possono riferirsi a classi o metodi (ma anche attributi) Sono nella forma: /**... */ Dei tag permettono di specificare delle proprietà particolari: @tag

Documentare una classe /** DOCUMENTAZIONE: - COSA RAPPRESENTA LA CLASSE - A COSA SERVE - COME SI USA @author Dina Lampa @version 1.0 */ public class Classe {... }

Esempio Documentazione Classe ContoCorrente /** * La classe ContoCorrente rappresenta un conto corrente. * Lo stato della classe consiste nel saldo del conto corrente * bancario, il cui valore e' un intero inizialmente nullo. * * La classe permette di interrogare il saldo residuo e di * effettuare prelievi e depositi. * * @author Daniel J. Dubois * @version 1.0 */ public class ContoCorrente { } private int saldo = 0;...

Documentare un metodo /** DOCUMENTAZIONE: - COSA FA IL METODO - COME USARLO @param x COSA RAPPRESENTA x? @return COSA RESTITUISCE @throws Ex QUANDO VIENE LANCIATA? */ public int metodo(int x) throws Ex {...}

Esempio documentazione metodi nella classe ContoCorrente (1) /** * Deposito dei soldi nel conto corrente. * Dopo l'invocazione di questo metodo, in assenza * di eccezioni, il saldo sara' incrementato della * quantita' di soldi depositata. * * @param soldi Quantita' di soldi da depositare * @throws IllegalArgumentException * Se si deposita una quantita' non positiva */ public void deposita(int soldi) throws IllegalArgumentException {... }

Esempio documentazione metodi nella classe ContoCorrente (2) /** * Restituisco il saldo residuo in questo * conto corrente. * * @return Saldo residuo */ public int saldo() { return saldo; }

Generazione Javadoc con Eclipse (1)

Generazione Javadoc con Eclipse (2)

Generazione Javadoc con Eclipse (3)

Generazione JavaDoc: altri metodi E anche possibile generare i file HTML con la documentazione utilizzando: usando direttamente javadoc da linea di comando automaticamente con Maven

Riferimenti http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc