java unit testing - junit (1)
DESCRIPTION
Java Unit Testing - part 2TRANSCRIPT
![Page 1: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/1.jpg)
JUnit (1)
Ing. Fabrizio GianneschiJava User Group Sardegna Onlus
http://www.jugsardegna.org
Java Unit Testing
![Page 3: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/3.jpg)
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
![Page 4: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/4.jpg)
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.
![Page 5: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/5.jpg)
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...
![Page 6: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/6.jpg)
Struttura del framework
![Page 7: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/7.jpg)
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
![Page 8: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/8.jpg)
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(){...} ...}
![Page 9: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/9.jpg)
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
![Page 10: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/10.jpg)
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
![Page 11: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/11.jpg)
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 }}
![Page 12: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/12.jpg)
Test
● Sia TestCase che TestSuite implementano l'interfaccia junit.framework.Test
public interface Test{ public int countTestCases(); public void run(TestResult result);}
![Page 13: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/13.jpg)
![Page 14: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/14.jpg)
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
![Page 15: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/15.jpg)
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
![Page 16: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/16.jpg)
Standalone JUnitStandalone JUnit
EclipseEclipse
NetBeans 6.0NetBeans 6.0
![Page 17: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/17.jpg)
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
![Page 18: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/18.jpg)
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...)
![Page 19: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/19.jpg)
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
![Page 20: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/20.jpg)
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
![Page 21: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/21.jpg)
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);
![Page 22: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/22.jpg)
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?
![Page 23: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/23.jpg)
Test booleano
AssertFalse / AssertTrue
Verificano se una condizione è vera o meno.
assertTrue(true); //okassertFalse(true); //koassertTrue(Hour.MAX == 23);assertTrue(user.isAuthenticated());
![Page 24: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/24.jpg)
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
![Page 25: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/25.jpg)
Come scrivere un test
![Page 26: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/26.jpg)
È 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
![Page 27: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/27.jpg)
Esercizio: test della classe String
![Page 28: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/28.jpg)
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
![Page 29: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/29.jpg)
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
![Page 30: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/30.jpg)
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/
![Page 31: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/31.jpg)
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
![Page 32: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/32.jpg)
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
![Page 33: Java Unit Testing - JUnit (1)](https://reader034.vdocuments.site/reader034/viewer/2022052323/5595a08d1a28ab0a448b467d/html5/thumbnails/33.jpg)
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