Upload
fgianneschi
View
8.695
Download
6
Embed Size (px)
DESCRIPTION
Java Unit Testing - part 2
Citation preview
JUnit (1)
Ing. Fabrizio GianneschiJava User Group Sardegna Onlus
http://www.jugsardegna.org
Java Unit Testing
JUnithttp://www.junit.org
Storia
● JUnit è il più famoso framework per i test unitari, creato da Kent Beck ed Erich Gamma
● Risale ormai al 1997 e deriva da un lavoro iniziale di Beck per Smalltalk (SUnit)
● Il successo è stato tale che la stessa filosofia è andata oltre la sola versione Java. La famiglia di framework che comprende tutti i diversi porting di JUnit si chiama xUnit.– Es: per .NET c'è NUnit– http://www.xprogramming.com/software.htm
Versioni
● La versione ancora più usata di JUnit è la 3.8.1, che risale al 2002 (!)
● Vecchia, ma è quella che “conoscono tutti”
● La versione 4.x invece è la più moderna e sfrutta al massimo le novità che il linguaggio Java ha avuto dal J2SE5.0 in poi.
Caratteristiche
● La bellezza di JUnit sta nella semplicità
● Pochi concetti, facili da ricordare e applicare
● E' un framework di base, sul quale oggi poggiano numerosissimi altri– HttpUnit– StrutsTestCase– DbUnit– Cactus– SwingUnit, J2MEUnit, eccetera, eccetera...
Struttura del framework
TestCase
● L'elemento base del framework è il TestCase– Il programmatore deve scrivere i TestCase. Ognuno di essi
è una classe che contiene dei metodi di test, scritti dal programmatore
– La classe deve estendere junit.framework.TestCase● La prassi vuole che ci sia un TestCase per ogni classe da
testare● Esempio:
– public class TestShoppingCart extends TestCase
TestCase
● Per ogni situazione di test, è bene realizzare un metodo di test
● La prassi prevede la convenzione testXXX()public class TestShoppingCart extends TestCase{ ... public void testClearCart(){...} public void testAddToCart(){...} public void testRemoveFromCart(){...} ...}
TestSuite
● E' bene raggruppare gruppi di TestCase omogenei in TestSuite
● Due ragioni– Eseguendo la suite, JUnit esegue automaticamente tutti i
test in essa contenuti– Aiuta a mantenere il codice di test più ordinato
TestSuite
● Quando c'è solo un TestCase, JUnit crea dietro le quinte una TestSuite:
public static Test suite(){ return new TestSuite(MyTestCase.class);}oppurepublic static Test suite(){ TestSuite s = new TestSuite(); s.addTest(new MyTestCase(“testXyz”)); return s;}
Metodo di test
TestAll
● Suite di test che prima o poi, tutti creano...
public class TestAll extends TestSuite{ public static Test suite(){ TestSuite suite = new TestSuite(“Tutto!”); suite.addTestSuite(MyTestCase.class); suite.addTestSuite(MyTestSuite1.class); return suite; } public static void main(String args[]){ ... //esegue la suite }}
Test
● Sia TestCase che TestSuite implementano l'interfaccia junit.framework.Test
public interface Test{ public int countTestCases(); public void run(TestResult result);}
Risultati di un test
● L'esecuzione di un test può portare tre risultati:– Successo (pass)– Fallimento (failure)– Errore (error)
● I front end grafici di JUnit mostrano una barra indicante l'esito dei test. La barra è verde solo se il 100% dei test ha successo
● In caso di fallimento, viene lanciata una
junit.framework.AssertionFailedError
Eseguire i test
● JUnit dispone di due classi apposite– junit.textui.TestRunner (su console)– junit.swingui.TestRunner (grafico)
● Ormai tutti i moderni IDE hanno JUnit integrato tra i propri strumenti
Standalone JUnitStandalone JUnit
EclipseEclipse
NetBeans 6.0NetBeans 6.0
Eseguiamo dei test
● JUnit dispone di oltre 100 self-test
● Scaricare JUnit (in genere junit.zip) e scompattarlo in una cartella
● Aprire un command prompt, posizionarsi nella cartella, ed eseguire:
java -cp junit.jar;. junit.textui.TestRunner junit.samples.AllTests
oppure
java -cp junit.jar;. junit.swingui.TestRunner
Failure and Error
● Failure– E' una condizione “normale” in JUnit. Vuol dire l'oggetto
del test non ha prodotto il risultato atteso, ed il test l'ha rilevato
– Il “TDD taliban” è contento
● Error– E' una condizione imprevista– Qualcosa è andato storto nell'oggetto del test oppure nel
test stesso (es: la solita, maledetta NullPointerException...)
Failure and Error:come comportarsi?● Se Failure
– Rivedo il codice dell'oggetto del test
● Se Error– Può darsi che debba rivedere anche il test stesso
Asserzioni
● Per controllare il comportamento delle classi oggetto del test, si usano dei metodi speciali della classe TestCase – TestCase estende junit.framework.Assert
● Da non confondere con le assertion introdotte in Java 1.4– Quelle di JUnit sono semplici metodi e hanno senso all'interno del
framework– Quelle Java hanno valenza a livello generale
● Non adatte per il testing, ma complementari alle Eccezioni
Controllo di uguaglianza
AssertEquals
Verifica l'uguaglianza di due valori, o due oggetti– Se valori, viene effettuato un test ==– Se oggetti, vengono chiamati i rispettivi equals()
assertEquals(2,2);assertEquals(23, Hour.MAX);assertEquals(“John”, person.getName());assertEquals(expectedObj, actualObj);
Test di “nullità”
AssertNull / AssertNotNull
Verificano se un oggetto ha o meno il valore null
assertNull(null); //okassertNull(new Object()); //koassertNotNull(new Object()); //okassertNotNull(myObject); //?Esercizio:assertNotNull(5); //che succede?
Test booleano
AssertFalse / AssertTrue
Verificano se una condizione è vera o meno.
assertTrue(true); //okassertFalse(true); //koassertTrue(Hour.MAX == 23);assertTrue(user.isAuthenticated());
Test di riferimento
AssertSame
Verifica se due oggetti sono gli stessi (cioè, se le due reference puntano allo stessa istanza)
assertSame(new Object(),new Object()); //ko
Object obj1 = new Object();Object obj2 = obj1;assertSame(obj1, obj2); //ok
Come scrivere un test
È semplicissimo!
● Scegliere la classe da testare (già realizzata o, se TDD, da realizzare dopo il test)
● Creare una classe di test che estenda TestCase● Per ogni metodo testXXX:
– Creare o ottenere le istanze della classe da testare– Invocare i metodi da testare– Fare le dovute asserzioni
Esercizio: test della classe String
Esempio
● Requisito: Testare una classe Calcolatrice– Calcolatrice è in grado effettuare le quattro operazioni
fondamentali su primitivi double
● Scrivere i test per tutte le quattro operazioni
● In caso di divisione per zero, verificare che Calcolatrice lanci un'eccezione java.lang.ArithmeticException
Eseguire il test da command prompt● Due metodi, uno manuale ed uno automatico:
● Utilizzare il TestRunner testuale– java -cp junit.jar;. junit.textui.TestRunner MyTest
● Utilizzare automatismi come Ant
Ant
● Ant è un popolare tool Java per l'esecuzione automatica di task
● Analogo del make in C, ha però il vantaggio di utilizzare l'XML e, grazie a Java, essere multipiattaforma
● http://ant.apache.org/
Ant e JUnit
● Ant non solo può effettuare innumerevoli operazioni su file e risorse, ma può anche
● Compilare i sorgenti Java (build)
● Eseguire i test
● Controllare l'esito dei test
● Effettuare commit, deploy... ecc
● Generare report
● JUnit è perfettamente integrato con Ant
Esercizio
● Creare un progetto Ant da Eclipse
● Sistemare le librerie necessarie
● Eseguire build e test con Ant da command line
● Eseguire build e test con Ant da Eclipse
● Formattare l'output
Licenza Creative Commons (sunto)
Attribuzione-Non commerciale-Condividi allo stesso modo
3.0 Unported
Tu sei libero di modificare, riprodurre, distribuire, comunicare al pubblico, esporre inpubblico, rappresentare, eseguire e recitare quest'opera.
Alle seguenti condizioni:
● Attribuzione. Devi attribuire la paternità dell'opera nei modi indicati dall'autore o da chi ti ha dato l'opera in licenza e in modo tale da non suggerire che essi avallino te o il modo in cui tu usi l'opera.
● Non commerciale. Non puoi usare quest'opera per fini commerciali.
● Condividi allo stesso modo. Se alteri o trasformi quest'opera, o se la usi per crearne un'altra, puoi distribuire l'opera risultante solo con una licenza identica o equivalente a questa.
● Testo completo della licenza completa su:http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode