Unit testing 2014

621 views
534 views

Published on

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

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

  • Be the first to like this

No Downloads
Views
Total views
621
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

×