Come promesso nell’articolo sul Test Driven Development (anche se ho fatto passare un pò di tempo :) !), è giunto il momento di esplorare la libreria , necessaria per la scrittura dei test unitari in linguaggio .

In questo articolo è presentata “solo” la libreria e non vengono illustrate le regole da seguire per poter scrivere correttamente i test delle nostre applicazioni!


La libreria

JUnit è un progetto open source gestito da Kent Beck e scaricabile all’indirizzo http://github.com/KentBeck/junit/downloads.

Mettiamoci all’opera

Quando si vuole testare il funzionamento di una classe, è necessario scrivere un’altra classe (!) che, per convenzione, viene sempre chiamata con lo stesso nome della classe da testare più il suffisso “Test”.

Supponiamo di avere una classe MathOp (di seguito) che svolge le operazioni di addizione e sottrazione, e di voler scrivere lo .

  1. public class MathOp {
  2.     public MathOp() {
  3.     }
  4.  
  5.     public int add(int a, int b) {
  6.         return a + b;
  7.     }
  8.  
  9.     public int sub(int a, int b) {
  10.         return a – b;
  11.     }
  12. }

Come accennato prima, è necessario creare un’altra classe, che deve essere chiamata MathOpTest. Per utilizzare la libreria JUnit è necessario aggiungerla al build path del progetto (lo si può fare direttamente dalle preferenze del progetto di Eclipse, ad esempio).

Importare le classi di JUnit

Per utilizzare i costrutti JUnit per effettuare le asserzioni sui risultati dei metodi è necessario importare, prima di tutto, la libreria e importare staticamente le classi del package org.junit.Assert:

  1. import org.junit.*;
  2. import static org.junit.Assert.*;

La classe di test

A questo punto siamo pronti per scrivere la classe di test. Per indicare a JUnit quali sono i metodi che effettuano i test è necessario contraddistinguerli con l’annotazione @Test. In questo modo JUnit riconoscerà i metodi che contengono le asserzioni e li tratterà di conseguenza.

  1. import org.junit.*;
  2. import static org.junit.Assert.*;
  3.  
  4. public class MathOpTest {
  5.     @Test
  6.     public void testAdd(){
  7.         MathOp a = new MathOp();
  8.         assertEquals(4, a.add(3, 1));
  9.     }
  10.  
  11.     @Test
  12.     public void testSub(){
  13.         MathOp a = new MathOp();
  14.         assertEquals(-4, a.add(-3, 1));
  15.     }
  16. }

Le asserzioni

Con JUnit è possibile effettuare diversi tipo di test (con asserzioni diverse). Al momento dell’esecuzione, un test si considera superato se tutte le condizioni specificate risultano verificate.

  • assertEquals(expected, actual), assertArrayEquals(expected, actual) : richiede che il valore ‘expected’ sia uguale a ‘actual’
  • assertTrue(cond): richiede che ‘cond’ abbia come valore: ‘true’
  • assertFalse(cond): richiede che ‘cond’ abbia come valore ‘false’
  • assertNull(obj): richiede che ‘obj’ sia un riferimento nullo
  • assertNotNull(obj): richiede che ‘obj’ sia un riferimento non nullo

@Before

Nell’esempio precedente, in ognuno dei due test case è stato istanziato un oggetto MathOp. JUnit mette a disposizione degli sviluppatori una funzionalità per eseguire delle istruzioni prima che vengano eseguiti i test. Il metodo setUp() ha un’annotazione @Before che serve ad indicare a JUnit che il metodo va eseguito prima dell’esecuzione dei test case. In questo modo, il codice per inizializzare oggetti o risorse (ad esempio una connessione al DBMS) è concentrato in un solo punto della classe di test.
Analogamente a @Before, l’annotazione @After indica a JUnit di eseguire il metodo dopo l’esecuzione dei test case.

  1. import org.junit.*;
  2. import static org.junit.Assert.*;
  3.  
  4. public class MathOpTest {
  5.     private MathOp a;
  6.  
  7.     @Before
  8.     public void setUp(){
  9.         a = new MathOp();
  10.     }
  11.  
  12.     @Test
  13.     public void testAdd(){
  14.         assertEquals(4, a.add(3, 1));
  15.     }
  16.  
  17.     @Test
  18.     public void testSub(){
  19.         assertEquals(-4, a.sub(-3, 1));
  20.     }
  21. }

Lanciare i test

I test possono essere lanciati direttamente da Eclipse selezionando la classe di test e cliccando su “Run as” -> “JUnit Test”.
E’ possibile utilizzare anche la linea di comando o i task junit e junitreport di Apache Ant.

Di seguito uno screenshot dei risultati del test in Eclipse:
test junit report

I due test hanno avuto entrambi esito positivo! Nel caso si verifichino errori verranno conteggiati alla voce Errors, mentre le condizioni non verificate saranno conteggiate alla voce Failures.

Conclusioni

In questo articolo è stata fatta una semplice introduzione alla libreria, che dovrebbe essere utilizzata in ogni progetto software sviluppato in Java per garantire il test automatico del codice sorgente.
Per approfondimenti vi rimando al sito http://www.junit.org/.

Share