Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Unit Testing
30/04/2014 - Giacomo Petronio
Cronoprogramma
● Software testing e software checking
● Livelli di test
● Unit test / JUnit
● Codice testabile
● Dependenc...
Software Testing
Venire a
conoscenza di
eventuali rischi
Verifica dei requisiti
espliciti ed impliciti
Valutazione della
Q...
Software Checking
Attività che mira a valutare un attributo o un
comportamento di un sistema, ed a verificare
che questo s...
Test Correttezza
Black-box
Basati sulle specifiche
Diversi livelli
Test Correttezza
Livello Pro Contro
System
tests
alta confidenza se tutto OK lenti
poco indicativi in caso di fail
diffici...
# tests
tempo
esecuzione
Scenario
Integration Tests
Unit Tests
test intero sistema
punto di vista dell'utente
test di coll...
Struttura Unit Test
Test Driver
Unit Under
Test
Stimolo
Assert
Contesto
JUnit
JUnit Asserts
assertEquals(expected, actual)
assertTrue(value)
assertFalse(value)
assertNull(value)
assertNotNull(value)
a...
Running JUnit Tests
JUnit Best Practices
● N model classes → N test classes
● 1 test case per funzionalità
Stack Test Cases
● test Empty Stack...
JUnit Best Practices
Un assert per test
case
Stack stack = new Stack();
stack.push("A");
assertFalse(stack.isEmpty());
ass...
JUnit Best Practices
White box / Black box
JUnit Best Practices
Come testo un metodo privato?
● non testare
● reflection
● cambiare visibilità
● classe emergente
JUnit Best Practices
Nome Classe di Test
Stack StackTest
Stesso package ma diversa cartella
● src/it/units/inginf
o Stack....
stackShouldBeEmpty(){ … }
popShouldReturnNullWhenEmpty(){ … }
peekShouldNotRemoveItem(){ … }
JUnit Best Practices
Nomi tes...
JUnit Best Practices
Testare le eccezioni
@Test(expected=NullPointerException.class)
public void shouldThrowExceptionOnNul...
JUnit Best Practices
Classi di equivalenza
Testare tutti gli input Risorse Limitate
VS
IMPORTANTE!!
Caratteristiche di ogni Unit Test
Velocità Ripetibilità Indipendenza
DBMS
Networking
File-System
Benefici Unit Testing
1
2 3
Documentazion
e
Regression testing
Refactoring
Facile…
Test
Driver
Unit Under
Test
Stimolo
Assert
Contesto
… o no?
Come scrivere codice non testabile
● Mescolare i new con la logica
● Codice nel costruttore
● Global state (es. singletons...
Test
Driver
Unit Under
Test
Stimolo
Assert
Contesto
Other
Class
Other
Class
Other
Class
DB
File
System
Internet
Facile…?
Test
Driver
Unit Under
Test
Stimolo
Assert
Contesto
Other
Class
Other
Class
Other
Class
DB
File
System
Internet
Codice Tes...
Test
Driver
Unit Under
Test
Stimolo
Assert
Contesto
Friendly
Friendly
Friendly
Codice Testabile
SEAM
Codice Testabile
Crezione
Business Logic
Grafo degli Oggetti
Test
Driver
Unit Under
Test
Friendly
Friendly
Friendly
Codice Testabile
SEAM
Oggetto istanziato
Dependency Inversion SOLID
Concrete, Abstract
Concrete Abstract
class Geek {
playWith(PlayStation ps){
ps.play();
}
}
clas...
Esempio
MovieFilter
+moviesDirectedBy(director)
<<Interface>>
MovieFinder
+ getAllMovies()
MovieFinderImpl<<crea>>
esempio…
Inversion of Control (IoC)
MovieFilter
+moviesDirectedBy(director)
<<Interface>>
MovieFinder
+ getAllMovies()
MovieFinderI...
IoC: Dependency Injection
● Constructor Injection
o Dipendenze esplicite
● Setter Injection
o Dipendenze meno esplicite
o ...
IoC: Service Locator
MovieFilter
+moviesDirectedBy(director)
<<Interface>>
MovieFinder
+ getAllMovies()
MovieFinderImpl
Se...
Friendly Classes
Stub
● Non hanno logica interna
● Comportamento predefinito
● Non si effettuano verifiche sugli stub
● Es...
Friendly Classes
Mock
Programmabile:
● “Quando ricevi X…”
o restituisci Y
o lancia eccezione
o …
Verifiche sui mock:
● Num...
Mockito
Mock Lifecycle:
● Crea mock a partire da interfaccia
● Programma comportamento voluto
● Utilizzo indiretto
● Verif...
Mockito
Esempio
MovieFinder finder = mock(MovieFinder.class)
when(finder.findAll()).thenReturn(allMovies);
MovieFilter fil...
Mockito
MovieFinder finder = mock(MovieFinder.class)
when(finder.findAll()).___________
.thenReturn(allMovies);
.thenRetur...
Legacy Code
“Codice ereditato da altri?”
“Codice rimasto da una versione precedente?”
Codice senza test
Test Driven Development
Si sviluppa in 3 fasi:
RED scrivere un singolo test che fallisce
GREEN scrivere quanto basta per f...
Test Driven Development
Test First
Effetti diretti sul codice:
● Disaccoppiato
● Coeso
● Testabile
● API Driven
Upcoming SlideShare
Loading in …5
×

Unit testing 2014

712 views

Published on

Università di Trieste, corso di laurea in ingegneria informatica 2014: seminario Unit Testing

Published in: Software
  • Be the first to comment

  • Be the first to like this

Unit testing 2014

  1. 1. Unit Testing 30/04/2014 - Giacomo Petronio
  2. 2. Cronoprogramma ● Software testing e software checking ● Livelli di test ● Unit test / JUnit ● Codice testabile ● Dependency Inversion ● Friendly Classes ● Test-Driven Development
  3. 3. Software Testing Venire a conoscenza di eventuali rischi Verifica dei requisiti espliciti ed impliciti Valutazione della Qualità ● Correttezza ● Affidabilità ● Robustezza ● Usabilità ● Efficienza ● Manutenibilità ● Portabilità
  4. 4. Software Checking Attività che mira a valutare un attributo o un comportamento di un sistema, ed a verificare che questo soddisfi i requisiti. Checking is the process of making evaluations by applying algorithmic decision rules to specific observations of a product.
  5. 5. Test Correttezza Black-box Basati sulle specifiche Diversi livelli
  6. 6. Test Correttezza Livello Pro Contro System tests alta confidenza se tutto OK lenti poco indicativi in caso di fail difficilmente automatizzabili Unit tests veloci molto indicativi in caso di fail automatizzabili confidenza relativa
  7. 7. # tests tempo esecuzione Scenario Integration Tests Unit Tests test intero sistema punto di vista dell'utente test di collezioni di classi sottosistemi isolati test di classi singole Livelli di test
  8. 8. Struttura Unit Test Test Driver Unit Under Test Stimolo Assert Contesto
  9. 9. JUnit
  10. 10. JUnit Asserts assertEquals(expected, actual) assertTrue(value) assertFalse(value) assertNull(value) assertNotNull(value) assertThat(value, Matcher) ● assertThat(value, is("A")); ● assertThat(value, is(true)); ● assertThat(value, is(notNull()));
  11. 11. Running JUnit Tests
  12. 12. JUnit Best Practices ● N model classes → N test classes ● 1 test case per funzionalità Stack Test Cases ● test Empty Stack ● test Correct Order ● test Null Input ● test Pop When Empty
  13. 13. JUnit Best Practices Un assert per test case Stack stack = new Stack(); stack.push("A"); assertFalse(stack.isEmpty()); assertEquals("A", stack.peek()); assertFalse(stack.isEmpty()); assertEquals("A", stack.pop()); assertTrue(stack.isEmpty());
  14. 14. JUnit Best Practices White box / Black box
  15. 15. JUnit Best Practices Come testo un metodo privato? ● non testare ● reflection ● cambiare visibilità ● classe emergente
  16. 16. JUnit Best Practices Nome Classe di Test Stack StackTest Stesso package ma diversa cartella ● src/it/units/inginf o Stack.java ● test/it/units/inginf o StackTest.java
  17. 17. stackShouldBeEmpty(){ … } popShouldReturnNullWhenEmpty(){ … } peekShouldNotRemoveItem(){ … } JUnit Best Practices Nomi test-case verbosi test01(){ … } test02(){ … }
  18. 18. JUnit Best Practices Testare le eccezioni @Test(expected=NullPointerException.class) public void shouldThrowExceptionOnNullInput() { Stack stack = new Stack(); stack.push(null); }
  19. 19. JUnit Best Practices Classi di equivalenza Testare tutti gli input Risorse Limitate VS
  20. 20. IMPORTANTE!! Caratteristiche di ogni Unit Test Velocità Ripetibilità Indipendenza DBMS Networking File-System
  21. 21. Benefici Unit Testing 1 2 3 Documentazion e Regression testing Refactoring
  22. 22. Facile… Test Driver Unit Under Test Stimolo Assert Contesto … o no?
  23. 23. Come scrivere codice non testabile ● Mescolare i new con la logica ● Codice nel costruttore ● Global state (es. singletons) ● Metodi statici ● Troppi condizionali ● Troppe responsabilità
  24. 24. Test Driver Unit Under Test Stimolo Assert Contesto Other Class Other Class Other Class DB File System Internet Facile…?
  25. 25. Test Driver Unit Under Test Stimolo Assert Contesto Other Class Other Class Other Class DB File System Internet Codice Testabile SEAM
  26. 26. Test Driver Unit Under Test Stimolo Assert Contesto Friendly Friendly Friendly Codice Testabile SEAM
  27. 27. Codice Testabile Crezione Business Logic Grafo degli Oggetti
  28. 28. Test Driver Unit Under Test Friendly Friendly Friendly Codice Testabile SEAM Oggetto istanziato
  29. 29. Dependency Inversion SOLID Concrete, Abstract Concrete Abstract class Geek { playWith(PlayStation ps){ ps.play(); } } class Geek { playWith(IConsolle c){ c.play(); } }
  30. 30. Esempio MovieFilter +moviesDirectedBy(director) <<Interface>> MovieFinder + getAllMovies() MovieFinderImpl<<crea>> esempio…
  31. 31. Inversion of Control (IoC) MovieFilter +moviesDirectedBy(director) <<Interface>> MovieFinder + getAllMovies() MovieFinderImpl<<crea>> Assemblatore <<crea>> <<inject>>
  32. 32. IoC: Dependency Injection ● Constructor Injection o Dipendenze esplicite ● Setter Injection o Dipendenze meno esplicite o Comodo in classi esistenti ● Framework o Guice o Spring o CDI (J2EE)
  33. 33. IoC: Service Locator MovieFilter +moviesDirectedBy(director) <<Interface>> MovieFinder + getAllMovies() MovieFinderImpl Service Locator <<chiede>> <<crea>>
  34. 34. Friendly Classes Stub ● Non hanno logica interna ● Comportamento predefinito ● Non si effettuano verifiche sugli stub ● Es. finta risorsa web
  35. 35. Friendly Classes Mock Programmabile: ● “Quando ricevi X…” o restituisci Y o lancia eccezione o … Verifiche sui mock: ● Numero di chiamate ● Controllo parametro passato
  36. 36. Mockito Mock Lifecycle: ● Crea mock a partire da interfaccia ● Programma comportamento voluto ● Utilizzo indiretto ● Verifica dell’utilizzo
  37. 37. Mockito Esempio MovieFinder finder = mock(MovieFinder.class) when(finder.findAll()).thenReturn(allMovies); MovieFilter filter = new MovieFilter(finder); Lister.moviesDirectedBy(“Martin Scorsese”); verify(finder).findAll(); // verifica la chiamata esempio…
  38. 38. Mockito MovieFinder finder = mock(MovieFinder.class) when(finder.findAll()).___________ .thenReturn(allMovies); .thenReturn(none, all); .thenThrows(new RuntimeException()); .then( callback ); MovieLister lister = mock(MovieLister.class) when(lister.moviesDirectedBy(_____)).then(…); “Martin Scorsese” anyString() any()
  39. 39. Legacy Code “Codice ereditato da altri?” “Codice rimasto da una versione precedente?” Codice senza test
  40. 40. Test Driven Development Si sviluppa in 3 fasi: RED scrivere un singolo test che fallisce GREEN scrivere quanto basta per far passare i test BLUE refactoring Metodologia di sviluppo
  41. 41. Test Driven Development Test First Effetti diretti sul codice: ● Disaccoppiato ● Coeso ● Testabile ● API Driven

×