Java Unit Testing - JUnit (1)

9,622 views

Published on

Java Unit Testing - part 2

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,622
On SlideShare
0
From Embeds
0
Number of Embeds
56
Actions
Shares
0
Downloads
232
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

Java Unit Testing - JUnit (1)

  1. 1. Java Unit Testing JUnit (1) Ing. Fabrizio Gianneschi Java User Group Sardegna Onlus http://www.jugsardegna.org
  2. 2. JUnit http://www.junit.org
  3. 3. 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
  4. 4. 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.
  5. 5. 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...
  6. 6. Struttura del framework
  7. 7. 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
  8. 8. 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(){...} ... }
  9. 9. 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
  10. 10. TestSuite ● Quando c'è solo un TestCase, JUnit crea dietro le quinte una TestSuite: public static Test suite(){ return new TestSuite(MyTestCase.class); } oppure public static Test suite(){ Metodo di test TestSuite s = new TestSuite(); s.addTest(new MyTestCase(“testXyz”)); return s; }
  11. 11. 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 }
  12. 12. Test ● Sia TestCase che TestSuite implementano l'interfaccia junit.framework.Test public interface Test{ public int countTestCases(); public void run(TestResult result); }
  13. 13. 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
  14. 14. 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
  15. 15. Standalone JUnit NetBeans 6.0 Eclipse
  16. 16. 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
  17. 17. 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...)
  18. 18. 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
  19. 19. 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
  20. 20. 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);
  21. 21. Test di “nullità” AssertNull / AssertNotNull Verificano se un oggetto ha o meno il valore null assertNull(null); //ok assertNull(new Object()); //ko assertNotNull(new Object()); //ok assertNotNull(myObject); //? Esercizio: assertNotNull(5); //che succede?
  22. 22. Test booleano AssertFalse / AssertTrue Verificano se una condizione è vera o meno. assertTrue(true); //ok assertFalse(true); //ko assertTrue(Hour.MAX == 23); assertTrue(user.isAuthenticated());
  23. 23. 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
  24. 24. Come scrivere un test
  25. 25. È 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
  26. 26. Esercizio: test della classe String
  27. 27. 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
  28. 28. 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
  29. 29. 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/
  30. 30. 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
  31. 31. 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
  32. 32. 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 in pubblico, 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

×