05 - Testowalność

21
TESTOWALNOŚĆ Historia pewnego projektu Testowalność Myślenie o obiektowości Cechy dobrego projektu TDD a projekt

Transcript of 05 - Testowalność

Page 1: 05 - Testowalność

TESTOWALNOŚĆ

● Historia pewnego projektu● Testowalność● Myślenie o obiektowości● Cechy dobrego projektu● TDD a projekt

Page 2: 05 - Testowalność

W PEWNYM PROJEKCIE...

10 PROGRAMISTÓW

8 MIESIĘCY

OD POCZĄTKU TDD

Page 3: 05 - Testowalność

ILOŚĆ TESTÓW ROSŁA...

Page 4: 05 - Testowalność

POJAWIŁY SIĘ PROBLEMY

Page 5: 05 - Testowalność

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ść

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ść

DIAGNOZA

NIE WIEMY JAK PISAĆ...

TESTOWALNY KOD

Page 8: 05 - Testowalność

JAK NAPISAĆ KOD TRUDNY DO TESTOWANIA?

Page 9: 05 - Testowalność

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ść

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ść

OBIEKTY

HermetyzacjaReużywalność

Ukrywanie informacji

Polimorfizm

Abstrakcja

Dziedziczenie

Page 12: 05 - Testowalność

OBIEKTY

HermetyzacjaReużywalność

Ukrywanie informacji

Polimorfizm

Abstrakcja

Dziedziczenie

ODPOWIEDZIALNOŚĆ

Page 13: 05 - Testowalność

GRAF OBIEKTÓW

Page 14: 05 - Testowalność

● 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ść

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ść

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ść

KONSTRUKCJA OBIEKTÓW

Logika biznesowa Tworzenie obiektów

Factory Builder

DependencyInjection

new

newnew new

newnew

newnew

Page 18: 05 - Testowalność

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ść

TDD A PROJEKT

TDD PROJEKT

WPŁYWA NA

UŁATWIA

Page 20: 05 - Testowalność

PROJEKTUJĄC PAMIĘTAJ

● Klasa ↔ odpowiedzialność● Tworzenie obiektów to też odpowiedzialność● Wysoka spójność● Luźne powiązania

Page 21: 05 - Testowalność

[10] http://misko.hevery.com/about/

DZIĘKUJĘ

Zdjęcia: