05 - Testowalność
-
Upload
krzysztof-jelski -
Category
Documents
-
view
552 -
download
2
Transcript of 05 - Testowalność
TESTOWALNOŚĆ
● Historia pewnego projektu● Testowalność● Myślenie o obiektowości● Cechy dobrego projektu● TDD a projekt
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● 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());}
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
DIAGNOZA
NIE WIEMY JAK PISAĆ...
TESTOWALNY KOD
JAK NAPISAĆ KOD TRUDNY DO TESTOWANIA?
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
TESTOWALNOŚĆ
TestKlasa
testowana
Inna klasa
Inna klasa
Inna klasaZewnętrzna biblioteka
System plików
Baza danych
?
szew
(se
am)
Miško Hevery
OBIEKTY
HermetyzacjaReużywalność
Ukrywanie informacji
Polimorfizm
Abstrakcja
Dziedziczenie
OBIEKTY
HermetyzacjaReużywalność
Ukrywanie informacji
Polimorfizm
Abstrakcja
Dziedziczenie
ODPOWIEDZIALNOŚĆ
GRAF OBIEKTÓW
● zależności (dependencies)● wymagane aby realizować odpowiedzialność
● powiadomienia (notifications)● interesuje je aktywność obiektu
● obiekty dostosowujące (adjustments)● dostosowują zachowanie obiektu
WSPÓŁPRACOWNICY (PEERS)
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.
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.
KONSTRUKCJA OBIEKTÓW
Logika biznesowa Tworzenie obiektów
Factory Builder
DependencyInjection
new
newnew new
newnew
newnew
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
TDD A PROJEKT
TDD PROJEKT
WPŁYWA NA
UŁATWIA
PROJEKTUJĄC PAMIĘTAJ
● Klasa ↔ odpowiedzialność● Tworzenie obiektów to też odpowiedzialność● Wysoka spójność● Luźne powiązania
[10] http://misko.hevery.com/about/
DZIĘKUJĘ
Zdjęcia: