java unit testing - junit (1)

33
JUnit (1) Ing. Fabrizio Gianneschi Java User Group Sardegna Onlus http://www.jugsardegna.org Java Unit Testing

Upload: fgianneschi

Post on 03-Jul-2015

8.695 views

Category:

Technology


6 download

DESCRIPTION

Java Unit Testing - part 2

TRANSCRIPT

Page 1: Java Unit Testing - JUnit (1)

JUnit (1)

Ing. Fabrizio GianneschiJava User Group Sardegna Onlus

http://www.jugsardegna.org

Java Unit Testing

Page 2: Java Unit Testing - JUnit (1)

JUnithttp://www.junit.org

Page 3: Java Unit Testing - JUnit (1)

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)

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)

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)

Struttura del framework

Page 7: Java Unit Testing - JUnit (1)

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)

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)

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)

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)

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)

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)
Page 14: Java Unit Testing - JUnit (1)

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)

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)

Standalone JUnitStandalone JUnit

EclipseEclipse

NetBeans 6.0NetBeans 6.0

Page 17: Java Unit Testing - JUnit (1)

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)

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)

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)

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)

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)

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)

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)

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)

Come scrivere un test

Page 26: Java Unit Testing - JUnit (1)

È 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)

Esercizio: test della classe String

Page 28: Java Unit Testing - JUnit (1)

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)

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)

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)

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)

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)

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