Spring framework                     Motto: Musíte rozbít vejce když chcete udělat omeletu                Spring framework...
Spring framework                     Motto: Musíte rozbít vejce když chcete udělat omeletuSunday 13 May 2012              ...
Sunday 13 May 2012   3
Spring TDD                     Testování aplikací postavených na Spring frameworkuSunday 13 May 2012                      ...
Proč testujemeSunday 13 May 2012                    5
Primární Motivace                     • Pocit sucha a bezpečí                      • Verifikace kódu, že opravdu           ...
Jak testujemeSunday 13 May 2012                   7
Manuální testy                     • Historicky běžná součást                       vývojového procesu                    ...
Hlavní rysy                     • Pomalé                     • Drahé                     • Neefektivní                    ...
Dopady manuálního testování                     • Delší release cyklus                     • Chyby se odhalí na konci     ...
Automatické testy                     • Píší se společně s kódem                      • Kontinuální evoluce               ...
Dopady aut. testů                     • Rychlejší release cyklus                     • Test coverage                      ...
Manuální vs Automatické testySunday 13 May 2012                   13
Kolik stojí opravení chyby                Náklady na odstranění chyby                                                 čas ...
Kolik stojí opravení chyby                Náklady na odstranění chyby                                                     ...
Doporučení                     • Zaměřte se na automatické testy                     • Testy lze zavádět inkrementálně    ...
Automatické testySunday 13 May 2012                       17
Jednotkové vs. Integrační                     • Jednotkové testy                      • Konkrétní třída v izolaci         ...
Jednotkové testy                     • Nejdůležitější je izolace                      • Pokud možno všechny ostatní       ...
Unit test        public class ReservationServiceImpl implements ReservationService{              private BookStoreDao book...
Unit test                                            Externí třída (v testu nahradit stub/mock)        public class Reserv...
Unit test                                            Externí třída (v testu nahradit stub/mock)        public class Reserv...
Unit test                                            Externí třída (v testu nahradit stub/mock)        public class Reserv...
Unit test                                            Externí třída (v testu nahradit stub/mock)        public class Reserv...
Stub                     public class BookStoreDaoStub implements BookStoreDao{                         private Book book;...
Použití stubu   public class ReservationServiceImplTest {          private BookStoreDao bookStoreDao;          private Res...
Použití stubu                     • Výhody                      • Znovupoužitelný kód                       • Test support...
Použití mocku                     • Mock je automatický generovaná                       třía                     • Popisu...
Mockovací knihovná Mockito                     • Velmi pohodlné mockování                      • Fluent API               ...
Mock s Mockitem     import static org.mockito.Mockito.mock;     import static org.mockito.Mockito.when;     public class R...
Mock vs. Stub                     • Mock                      • Smart defaults                      • Pokud se jedná o slo...
Integrační testy se SpringemSunday 13 May 2012                       28
Spring test                     • spring-test modul                     • Umožňuje nainicializovat Spring                 ...
import         org.junit.runner.RunWith;      import         org.springframework.beans.factory.annotation.Autowired;      ...
• Napište jednotkový test pro ReservationServiceImp                       • použijte mock pro BookStoreDao                ...
Upcoming SlideShare
Loading in …5
×

Spring Testing

835 views
720 views

Published on

* Proč testujeme
* Rozdíl mezi automatickými a ručními testy
* Použití mocku a stubu
* Integrace Spring framerku a JUnit

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
835
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Spring Testing

  1. 1. Spring framework Motto: Musíte rozbít vejce když chcete udělat omeletu Spring framework training materials by Roman Pichlík is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.Sunday 13 May 2012 1
  2. 2. Spring framework Motto: Musíte rozbít vejce když chcete udělat omeletuSunday 13 May 2012 2
  3. 3. Sunday 13 May 2012 3
  4. 4. Spring TDD Testování aplikací postavených na Spring frameworkuSunday 13 May 2012 4
  5. 5. Proč testujemeSunday 13 May 2012 5
  6. 6. Primární Motivace • Pocit sucha a bezpečí • Verifikace kódu, že opravdu funguje • Zpětná vazba při změnáchSunday 13 May 2012 6klidné spaní
  7. 7. Jak testujemeSunday 13 May 2012 7
  8. 8. Manuální testy • Historicky běžná součást vývojového procesu • Testovací fáze • Vývojáři nebo QA odděleníSunday 13 May 2012 8
  9. 9. Hlavní rysy • Pomalé • Drahé • Neefektivní • Náchylné k chybě lidského faktoruSunday 13 May 2012 9Pomalé - trvání testovacího kolečka, specifikace, vlastní průchod testuDrahé - lidský čas je oproti strojovému stále dražší (i v Bengalore)Neefektivní - otestování low level změny je kolikrát nemožnéLidský faktor - člověk je tvor líny, monotóní práce je ubijející (ne pro stroj)
  10. 10. Dopady manuálního testování • Delší release cyklus • Chyby se odhalí na konci vývojového cyklu • Problém chyba v RC • NeškálujeSunday 13 May 2012 10RC= Go nebo no Go nebo Hotfix díky tomu, že nám hoří termínNeškáluje = nový tester neznamená větší otestovanost (roste i code base)
  11. 11. Automatické testy • Píší se společně s kódem • Kontinuální evoluce • Různé testy podle úrovně abstrakce a cílové oblasti • Jednotkové • Integrační • VýkonovéSunday 13 May 2012 11
  12. 12. Dopady aut. testů • Rychlejší release cyklus • Test coverage • Známe slabá místa • Umožňují lépe pochopit fungování kódu • Ukazují špatný/dobrý designSunday 13 May 2012 12Rychlejší release cyklus díky testům závisí na tom jak drahé je pro nás testy psát a udržovat
  13. 13. Manuální vs Automatické testySunday 13 May 2012 13
  14. 14. Kolik stojí opravení chyby Náklady na odstranění chyby čas nalezení chybySunday 13 May 2012 14Náklady na odstranění rostou exponenciálně s čase objevení chyby
  15. 15. Kolik stojí opravení chyby Náklady na odstranění chyby čas nalezení chyby automatické testy manuální testySunday 13 May 2012 15Náklady na odstranění rostou exponenciálně s čase objevení chybyAutomatické testy snižují čas na odhalení chyby
  16. 16. Doporučení • Zaměřte se na automatické testy • Testy lze zavádět inkrementálně • Nový kód vždy • Starý kód pokud se do něj šahá • Starý kód podle důležitosti • Testy jsou zrcadlem návrhuSunday 13 May 2012 16
  17. 17. Automatické testySunday 13 May 2012 17
  18. 18. Jednotkové vs. Integrační • Jednotkové testy • Konkrétní třída v izolaci • Žádné závislosti • Odstíněné od prostředí • Integrační testy • Interakce několika komponentSunday 13 May 2012 18
  19. 19. Jednotkové testy • Nejdůležitější je izolace • Pokud možno všechny ostatní třídy odizolované • Použití Stub a Mock objektů • Nemíchat testovací scénáře • Jedna testovací metoda per scénářSunday 13 May 2012 19JDK se považuje za důveryhodné => nemusíme dělat stuby
  20. 20. Unit test public class ReservationServiceImpl implements ReservationService{ private BookStoreDao bookStoreDao; private AtomicLong counter = new AtomicLong(); private Map<Long, Reservation> resevations = new HashMap<Long, Reservation>(); public Reservation reserveBook(Long bookId) { Book book = bookStoreDao.getBook(bookId); if(book == null) { throw new BookNotFoundException(bookId); } ReservationImpl reservationImpl = new ReservationImpl(); reservationImpl.setReservationId(counter.incrementAndGet()); reservationImpl.setBookId(bookId); return reservationImpl; } }Sunday 13 May 2012 20
  21. 21. Unit test Externí třída (v testu nahradit stub/mock) public class ReservationServiceImpl implements ReservationService{ private BookStoreDao bookStoreDao; private AtomicLong counter = new AtomicLong(); private Map<Long, Reservation> resevations = new HashMap<Long, Reservation>(); public Reservation reserveBook(Long bookId) { Book book = bookStoreDao.getBook(bookId); if(book == null) { throw new BookNotFoundException(bookId); } ReservationImpl reservationImpl = new ReservationImpl(); reservationImpl.setReservationId(counter.incrementAndGet()); reservationImpl.setBookId(bookId); return reservationImpl; } }Sunday 13 May 2012 20
  22. 22. Unit test Externí třída (v testu nahradit stub/mock) public class ReservationServiceImpl implements ReservationService{ private BookStoreDao bookStoreDao; private AtomicLong counter = new AtomicLong(); private Map<Long, Reservation> resevations = new HashMap<Long, Reservation>(); public Reservation reserveBook(Long bookId) { Book book = bookStoreDao.getBook(bookId); if(book == null) { throw new BookNotFoundException(bookId); } ReservationImpl reservationImpl = new ReservationImpl(); reservationImpl.setReservationId(counter.incrementAndGet()); reservationImpl.setBookId(bookId); return reservationImpl; } } dvě testovací metody (scénáře)Sunday 13 May 2012 20
  23. 23. Unit test Externí třída (v testu nahradit stub/mock) public class ReservationServiceImpl implements ReservationService{ private BookStoreDao bookStoreDao; private AtomicLong counter = new AtomicLong(); private Map<Long, Reservation> resevations = new HashMap<Long, Reservation>(); public Reservation reserveBook(Long bookId) { Book book = bookStoreDao.getBook(bookId); if(book == null) { throw new BookNotFoundException(bookId); } ReservationImpl reservationImpl = new ReservationImpl(); reservationImpl.setReservationId(counter.incrementAndGet()); reservationImpl.setBookId(bookId); return reservationImpl; } } dvě testovací metody (scénáře)Sunday 13 May 2012 20
  24. 24. Unit test Externí třída (v testu nahradit stub/mock) public class ReservationServiceImpl implements ReservationService{ private BookStoreDao bookStoreDao; private AtomicLong counter = new AtomicLong(); private Map<Long, Reservation> resevations = new HashMap<Long, Reservation>(); public Reservation reserveBook(Long bookId) { Book book = bookStoreDao.getBook(bookId); if(book == null) { throw new BookNotFoundException(bookId); } ReservationImpl reservationImpl = new ReservationImpl(); reservationImpl.setReservationId(counter.incrementAndGet()); reservationImpl.setBookId(bookId); return reservationImpl; } } dvě testovací metody (scénáře)Sunday 13 May 2012 20
  25. 25. Stub public class BookStoreDaoStub implements BookStoreDao{ private Book book; Implementuje stejné rozhraní public Book getBook(Long bookId) { if(book != null && bookId.equals(book.getId())) { return book; } return null; jednoduché chování připravené pro test } public void saveBook(Book book) { this.book = book; } public Book getBook() { return book; } Možnost verifikovat stav stubu public void setBook(Book book) { this.book = book; } }Sunday 13 May 2012 21
  26. 26. Použití stubu public class ReservationServiceImplTest { private BookStoreDao bookStoreDao; private ReservationServiceImpl reservationServiceImpl = new ReservationServiceImpl(); @Before public void setup(){ bookStoreDao = new BookStoreDaoStub(); reservationServiceImpl.setBookStoreDao(bookStoreDao); } @Test public void testReserveNonExistingBook() { Příprava stubu try { reservationServiceImpl.reserveBook(-1l); fail("BookNotFoundException musi byt vyhozena pro neexistujici knihu"); } catch(BookNotFoundException e) { //expected } } }Sunday 13 May 2012 22
  27. 27. Použití stubu • Výhody • Znovupoužitelný kód • Test support modul • Nevýhody • Změna interface znamená změnu stubu • Implementace všech metodSunday 13 May 2012 23žádné smart defaults
  28. 28. Použití mocku • Mock je automatický generovaná třía • Popisujeme chování, které nás zajímá • Můžeme zkontrolovat interakciSunday 13 May 2012 24
  29. 29. Mockovací knihovná Mockito • Velmi pohodlné mockování • Fluent API • Jednoduchá na použití • Umožňuje verifikovat stav mocku po testuSunday 13 May 2012 25jsou i další mock knihovny
  30. 30. Mock s Mockitem import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class ReservationServiceImplTest { private BookStoreDao bookStoreDao; private ReservationServiceImpl reservationServiceImpl = new ReservationServiceImpl(); @Before public void setup(){ bookStoreDao = mock(BookStoreDao.class); when(bookStoreDao.getBook(-1l)).thenReturn(null); reservationServiceImpl.setBookStoreDao(bookStoreDao); } @Test public void testReserveNonExistingBook() { Příprava mocku try { reservationServiceImpl.reserveBook(-1l); fail("BookNotFoundException musi byt vyhozena pro neexistujici knihu"); } catch(BookNotFoundException e) { //expected } }Sunday 13 May 2012 26
  31. 31. Mock vs. Stub • Mock • Smart defaults • Pokud se jedná o složitější rozhraní • Stub • ZnovupoužitelnéSunday 13 May 2012 27
  32. 32. Integrační testy se SpringemSunday 13 May 2012 28
  33. 33. Spring test • spring-test modul • Umožňuje nainicializovat Spring • Umožňuje nainjectovat testované beany do testu • Centrální třídy • SpringJUnit4ClassRunner • @ContextConfigurationSunday 13 May 2012 29
  34. 34. import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; Integrace Spring a JUnit @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:META-INF/applicationContext.xml") public class ReservationServiceImplTest { @Autowired Konfigurace Springu private ReservationService reservationService; Nainjectování testované @Test public void testReserveNonExistingBook() { beany try { reservationService.reserveBook(-1l); fail("BookNotFoundException musi byt vyhozena pro neexistujici knihu"); } catch(BookNotFoundException e) { //expected } } }Sunday 13 May 2012 30
  35. 35. • Napište jednotkový test pro ReservationServiceImp • použijte mock pro BookStoreDao • Napište integrační test pro ReservationServiceImp za pomocí Springu • Jako BookStoreDao nedefinujte beanu, která bude naimplementovaná jako stubSunday 13 May 2012 31

×