TESTOWALNOŚĆ●   Historia pewnego projektu●   Testowalność●   Myślenie o obiektowości●   Cechy dobrego projektu●   TDD a pr...
W PEWNYM PROJEKCIE...10 PROGRAMISTÓW 8 MIESIĘCY    OD POCZĄTKU TDD
ILOŚĆ TESTÓW ROSŁA...
POJAWIŁY SIĘ PROBLEMY
UTRZYMANIE TESTÓW    Fast                      @Test●                     public void shouldChangePrice() {               ...
UTRZYMANIE TESTÓW    Fast                        @Test●                       public void shouldChangePrice() {           ...
DIAGNOZA NIE     W   IEM               Y JA                   KP                        ISA                           Ć. ....
JAK NAPISAĆ KOD TRUDNY DO       TESTOWANIA?
JAK NAPISAĆ KOD TRUDNY DO       TESTOWANIA?●   mieszanie new i logiki●   metody statyczne●   mieszanie odpowiedzialności● ...
TESTOWALNOŚĆ                         szew (seam)                                                      System              ...
OBIEKTY       Hermetyzacja                                 ReużywalnośćPolimorfizm                                 Abstrak...
OBIEKTY       Hermetyzacja                          ReużywalnośćPolimorfizm      ODPOWIEDZIALNOŚĆ                 Abstrakc...
GRAF OBIEKTÓW
WSPÓŁPRACOWNICY (PEERS)●   zależności (dependencies)    ●   wymagane aby realizować odpowiedzialność●   powiadomienia (not...
SPÓJNOŚĆObiektu                   Metody●   metody odwołują się   ●   instrukcje robią to co    do pól i metod tej        ...
POWIĄZANIA                     SKŁADOWA                     PODKLASA                     PARAMETRSiła zależy od●   liczby●...
KONSTRUKCJA OBIEKTÓWLogika biznesowa   Tworzenie obiektów                   Factory new Builder                     new   ...
TDD A PROJEKT     własności kodu       własności kodu ułatwiającedobrze zaprojektowanego          testowanie  wysoka spójn...
TDD A PROJEKT      WPŁYWA NATDD               PROJEKT       UŁATWIA
PROJEKTUJĄC PAMIĘTAJ●   Klasa ↔ odpowiedzialność●   Tworzenie obiektów to też odpowiedzialność●   Wysoka spójność●   Luźne...
DZIĘKUJĘ                          Zdjęcia:[10] http://misko.hevery.com/about/
Upcoming SlideShare
Loading in …5
×

05 - Testowalność

742 views

Published on

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

  • Be the first to like this

No Downloads
Views
Total views
742
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

05 - Testowalność

  1. 1. TESTOWALNOŚĆ● Historia pewnego projektu● Testowalność● Myślenie o obiektowości● Cechy dobrego projektu● TDD a projekt
  2. 2. W PEWNYM PROJEKCIE...10 PROGRAMISTÓW 8 MIESIĘCY OD POCZĄTKU TDD
  3. 3. ILOŚĆ TESTÓW ROSŁA...
  4. 4. POJAWIŁY SIĘ PROBLEMY
  5. 5. UTRZYMANIE TESTÓW Fast @Test● public void shouldChangePrice() { WicketTester tester = new WicketTester(); tester.startPage(ProductPage.class); FormTester form = tester.newFormTester("product:form"); Isolated form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:0:Yes");● form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:1:value"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:2:Yes");● Repeatable form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:3:Yes"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:4:Yes"); form.setValue("offSiteAccessEnabled", Self-validating "0:form:offSiteAccessEnabled:5:Yes");● form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:6:index"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:7:Yes"); form.setValue("26.00", "1:form:price-panel:purchace-price");● Timely form.setValue("176.00", "1:form:price-panel:sell-price"); form.setValue("24.00", "0:form:price-panel:purchace-price"); form.setValue("126.00", "0:form:price-panel:sell-price"); form.submit("button.save.and.exit"); tester.assertInvisible("applicationForm:button.save"); assertEquals(new BigDecimal("24.00"), tester.getPage().getModel() .getProduct().getPurchasePrice()); assertEquals(new BigDecimal("126.00"), tester.getPage().getModel() .getProduct().getSalePrice()); }
  6. 6. UTRZYMANIE TESTÓW Fast @Test● public void shouldChangePrice() { WicketTester tester = new WicketTester(); tester.startPage(ProductPage.class); FormTester form = tester.newFormTester("product:form"); Isolated form.setValue("offSiteAccessEnabled", NIECZYTELNE "0:form:offSiteAccessEnabled:0:Yes");● form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:1:value"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:2:Yes");● Repeatable form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:3:Yes"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:4:Yes"); form.setValue("offSiteAccessEnabled", Self-validating "0:form:offSiteAccessEnabled:5:Yes");● form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:6:index"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:7:Yes"); form.setValue("26.00", "1:form:price-panel:purchace-price");● Timely form.setValue("176.00", "1:form:price-panel:sell-price"); form.setValue("24.00", "0:form:price-panel:purchace-price"); form.setValue("126.00", "0:form:price-panel:sell-price"); form.submit("button.save.and.exit"); MĘCZĄCE tester.assertInvisible("applicationForm:button.save"); assertEquals(new BigDecimal("24.00"), tester.getPage().getModel() TWORZENIE } .getProduct().getPurchasePrice()); assertEquals(new BigDecimal("126.00"), tester.getPage().getModel() .getProduct().getSalePrice()); NOWYCH
  7. 7. DIAGNOZA NIE W IEM Y JA KP ISA Ć. . .TESTOWALNY KOD
  8. 8. JAK NAPISAĆ KOD TRUDNY DO TESTOWANIA?
  9. 9. JAK NAPISAĆ KOD TRUDNY DO TESTOWANIA?● mieszanie new i logiki● metody statyczne● mieszanie odpowiedzialności● szukanie obiektów● praca w konstruktorze● stan globalny● singletony● głębokie hierarchie dziedziczenia● za dużo if-ów
  10. 10. TESTOWALNOŚĆ szew (seam) System plików Inna klasa Klasa Test ? testowana Baza danych Inna klasa Zewnętrzna Inna klasa bibliotekaMiškoHevery
  11. 11. OBIEKTY Hermetyzacja ReużywalnośćPolimorfizm Abstrakcja Ukrywanie informacji Dziedziczenie
  12. 12. OBIEKTY Hermetyzacja ReużywalnośćPolimorfizm ODPOWIEDZIALNOŚĆ Abstrakcja Ukrywanie informacji Dziedziczenie
  13. 13. GRAF OBIEKTÓW
  14. 14. WSPÓŁPRACOWNICY (PEERS)● zależności (dependencies) ● wymagane aby realizować odpowiedzialność● powiadomienia (notifications) ● interesuje je aktywność obiektu● obiekty dostosowujące (adjustments) ● dostosowują zachowanie obiektu
  15. 15. SPÓJNOŚĆObiektu Metody● metody odwołują się ● instrukcje robią to co do pól i metod tej mówi nazwa samej klasy ● jeden poziom abstrakcjiWysoki stopień spójności klas i metodświadczy o dobrym projekcie.
  16. 16. POWIĄZANIA SKŁADOWA PODKLASA PARAMETRSiła zależy od● liczby● rodzaju (interfejs/klasa konkretna)Niski stopień powiązań zwiększa testowalnośći łatwość utrzymania kodu.
  17. 17. KONSTRUKCJA OBIEKTÓWLogika biznesowa Tworzenie obiektów Factory new Builder new new new new new new newDependency Injection
  18. 18. TDD A PROJEKT własności kodu własności kodu ułatwiającedobrze zaprojektowanego testowanie wysoka spójność łatwość high cohesion podmiany zależności luźne powiązania prosta low coupling konstrukcja obiektów zrozumiałe brak stanu globalnegoodpowiedzialności klas łatwość wzorce projektowe wyizolowania obiektu
  19. 19. TDD A PROJEKT WPŁYWA NATDD PROJEKT UŁATWIA
  20. 20. PROJEKTUJĄC PAMIĘTAJ● Klasa ↔ odpowiedzialność● Tworzenie obiektów to też odpowiedzialność● Wysoka spójność● Luźne powiązania
  21. 21. DZIĘKUJĘ Zdjęcia:[10] http://misko.hevery.com/about/

×