05 - Testowalność
-
Upload
krzysztof-jelski -
Category
Documents
-
view
554 -
download
2
Transcript of 05 - Testowalność
![Page 1: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/1.jpg)
TESTOWALNOŚĆ
● Historia pewnego projektu● Testowalność● Myślenie o obiektowości● Cechy dobrego projektu● TDD a projekt
![Page 2: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/2.jpg)
W PEWNYM PROJEKCIE...
10 PROGRAMISTÓW
8 MIESIĘCY
OD POCZĄTKU TDD
![Page 3: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/3.jpg)
ILOŚĆ TESTÓW ROSŁA...
![Page 4: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/4.jpg)
POJAWIŁY SIĘ PROBLEMY
![Page 5: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/5.jpg)
UTRZYMANIE TESTÓW
● Fast● Isolated● Repeatable● Self-validating● Timely
@Testpublic void shouldChangePrice() { WicketTester tester = new WicketTester(); tester.startPage(ProductPage.class); FormTester form = tester.newFormTester("product:form"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:0:Yes"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:1:value"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:2:Yes"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:3:Yes"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:4:Yes"); form.setValue("offSiteAccessEnabled", "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"); 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());}
![Page 6: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/6.jpg)
UTRZYMANIE TESTÓW
● Fast● Isolated● Repeatable● Self-validating● Timely
@Testpublic void shouldChangePrice() { WicketTester tester = new WicketTester(); tester.startPage(ProductPage.class); FormTester form = tester.newFormTester("product:form"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:0:Yes"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:1:value"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:2:Yes"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:3:Yes"); form.setValue("offSiteAccessEnabled", "0:form:offSiteAccessEnabled:4:Yes"); form.setValue("offSiteAccessEnabled", "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"); 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());}
NIECZYTELNE
MĘCZĄCE TWORZENIE NOWYCH
![Page 7: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/7.jpg)
DIAGNOZA
NIE WIEMY JAK PISAĆ...
TESTOWALNY KOD
![Page 8: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/8.jpg)
JAK NAPISAĆ KOD TRUDNY DO TESTOWANIA?
![Page 9: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/9.jpg)
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
![Page 10: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/10.jpg)
TESTOWALNOŚĆ
TestKlasa
testowana
Inna klasa
Inna klasa
Inna klasaZewnętrzna biblioteka
System plików
Baza danych
?
szew
(se
am)
Miško Hevery
![Page 11: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/11.jpg)
OBIEKTY
HermetyzacjaReużywalność
Ukrywanie informacji
Polimorfizm
Abstrakcja
Dziedziczenie
![Page 12: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/12.jpg)
OBIEKTY
HermetyzacjaReużywalność
Ukrywanie informacji
Polimorfizm
Abstrakcja
Dziedziczenie
ODPOWIEDZIALNOŚĆ
![Page 13: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/13.jpg)
GRAF OBIEKTÓW
![Page 14: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/14.jpg)
● zależności (dependencies)● wymagane aby realizować odpowiedzialność
● powiadomienia (notifications)● interesuje je aktywność obiektu
● obiekty dostosowujące (adjustments)● dostosowują zachowanie obiektu
WSPÓŁPRACOWNICY (PEERS)
![Page 15: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/15.jpg)
SPÓJNOŚĆ
Obiektu● metody odwołują się
do pól i metod tej samej klasy
Metody● instrukcje robią to co
mówi nazwa● jeden poziom
abstrakcji
Wysoki stopień spójności klas i metod świadczy o dobrym projekcie.
![Page 16: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/16.jpg)
POWIĄZANIA
SKŁADOWAPODKLASAPARAMETR
Siła zależy od● liczby● rodzaju (interfejs/klasa konkretna)
Niski stopień powiązań zwiększa testowalnośći łatwość utrzymania kodu.
![Page 17: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/17.jpg)
KONSTRUKCJA OBIEKTÓW
Logika biznesowa Tworzenie obiektów
Factory Builder
DependencyInjection
new
newnew new
newnew
newnew
![Page 18: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/18.jpg)
TDD A PROJEKT
wysoka spójnośćhigh cohesion
luźne powiązanialow coupling
zrozumiałeodpowiedzialności klas
wzorce projektowe
łatwośćpodmiany zależności
prostakonstrukcja obiektów
brak stanu globalnego
łatwośćwyizolowania obiektu
własności kodu ułatwiające testowanie
własności kodudobrze zaprojektowanego
![Page 19: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/19.jpg)
TDD A PROJEKT
TDD PROJEKT
WPŁYWA NA
UŁATWIA
![Page 20: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/20.jpg)
PROJEKTUJĄC PAMIĘTAJ
● Klasa ↔ odpowiedzialność● Tworzenie obiektów to też odpowiedzialność● Wysoka spójność● Luźne powiązania
![Page 21: 05 - Testowalność](https://reader034.fdocuments.net/reader034/viewer/2022042816/5589321ad8b42add138b45a4/html5/thumbnails/21.jpg)
[10] http://misko.hevery.com/about/
DZIĘKUJĘ
Zdjęcia: