Kontrakty, unit testy a. interfejsy

Podobné dokumenty
enum

PowerPoint Presentation

Identity Lifecycle Management

DediĊnosť

PowerPoint Presentation

História

Identity Lifecycle Management

NSK Karta PDF

Tue Oct 3 22:05:51 CEST Začiatky s jazykom C 2.1 Štruktúra programu Štruktúra programu by sa dala jednoducho popísať nasledovnými časťami, kto

Funkcionálne programovanie Cvičenie 9 Funkcionálne programovanie v Jave Sergej Chodarev 22. november 2017 Technická Univerzita v Košiciach

FAQ

PowerPoint Presentation

Microsoft PowerPoint - OOP_prednaska_10.pptx

midterm2014_1

Objektovo orientované programovanie

2

Snímka 1

bsah

Úrad pre dohľad nad zdravotnou starostlivosťou Žellova 2, Bratislava Dátové rozhranie pre externý subjekt MV SR Strana 1 z 10 Dátové rozhranie

Jednotkový koreň (unit root), diferencovanie časového radu, unit root testy Beáta Stehlíková Časové rady, FMFI UK, 2011/2012 Jednotkový koreň(unit roo

Návod na vytvorenie kvalifikovaného elektronického podpisu prostredníctvom občianskeho preukazu s čipom Dátum zverejnenia: Verzia: 1 Dátu

Používateľská príručka POUŽÍVATEĽSKÁ PRÍRUČKA Generátor XML dávok pre Informačný systém kontrolných známok z MS Excel šablóny Dátum: Verzia

Microsoft Word - Zaver.pisomka_januar2010.doc

midterm2019

Úrad pre dohľad nad zdravotnou starostlivosťou Žellova 2, Bratislava Dátové rozhranie pre externý subjekt MV SR Strana 1 z 10 Dátové rozhranie

iot business hub whitepaper isdd_em_New.pdf

ĽAHKO. BEZ NÁMAHY. BEZ ÚNAVY. Naša patentovaná vysokotlaková pištoľ EASY!Force citeľne odľahčí vaše kĺby a svaly. PROFESSIONAL VYSOKOTLAKOVÉ ČISTIČE

Úrad pre dohľad nad zdravotnou starostlivosťou Žellova 2, Bratislava Dátové rozhranie pre externý subjekt FR SR Strana 1 z 11 Dátové rozhranie

Konkurentné programovanie

Rozdeľovanie IT zákaziek UX Peter Kulich

Príručka pre používateľa OTP tokenu Strana 1 z 8

Pravidelné úlohy verzia ku dňu SEAL IT Services, s.r.o. Kontakt: SEAL IT Services, s.r.o., Topoľová 4, Bratislava 1, tel.:

Import absencí z ASC

Microsoft Word - Manažment_tagov_tim24_tema12_2017.docx

Hardwarové prerušenie Nasledujúci kód ukazuje inštaláciu obsluhy časovača vrátane jeho inicializácie // inicializace časovače, přerušení každou milise

SAEAUT SNMP OPC Server

PowerPoint Presentation

Vzorové riešenia úlohy 4.1 Bodovanie Úvod do TI 2010 Dôvod prečo veľa z Vás malo málo bodov bolo to, že ste sa nepokúsili svoje tvrdenia dokázať, prič

Slovenská technická univerzita v Bratislave Fakulta informatiky a informačných technológií Zápisnica zo stretnutia #4 Tím sixpack Bc. Jozef Blažíček B

Finančné riaditeľstvo Slovenskej republiky 12/ORP/2019/IM Postup pre overenie pravosti pokladničného dokladu Informácia je určená pre subjekty (zákazn

Microsoft Word - Fabik - esej2011_18-is-xfabik.doc

Algoritmizácia a programovanie - Príkazy

TVORÍME VEDOMOSTNÚ SPOLOČNOSŤ Riadiaci orgán OPIS Sprostredkovateľský orgán OPIS EURÓPSKA ÚNIA Interface agreement - EXTERNÉ SLUŽBY JISCD PUBLIKOVANÉ

Snímka 1

Úroveň strojového kódu procesor Intel Pentium Pamäťový operand Adresovanie pamäte Priama nepriama a indexovaná adresa Práca s jednorozmerným poľom Pra

Microsoft Word - Priloha_1.docx

Súkromné gymnázium, Česká 10, Bratislava INFORMATIKA

User:Andrej Sedlacek

Moje leto musí byť výnimočné Sme radi, že využívate služby Orangeu, a veríme, že ste s nimi spokojný. Aby však bolo vaše leto naozaj výnimočné, prináš

ECDL Syllabus V50 SK-V01

eKasa

Microsoft PowerPoint - Dohľad SMS_15_6_2008 [Režim kompatibility]

Programujeme krok za krokom prvú mobilnú aplikáciu v AI2

Identity Lifecycle Management

fm 2012 a predajňa.doc

ISO Systémy manažérstva proti korupcii Svetový deň normalizácie 2018 Miroslav HRNČIAR Žilinská univerzita v Žiline

Katalóg cieľových požiadaviek k maturitnej skúške

ČG_O.L

NSK Karta PDF

IT NEWS

Prezentácia programu PowerPoint

Vnútorná reprezentácia údajových typov

gameDescription_bigApple

Príručka pre používateľa bezpečnostného tokenu EZIO Pico Obsah: 1 Určenie 1 2 Popis produktu 1 3 Nesprávne zadaný PIN kód (PIN FAIL) 3 4 Použitie Aute

Prezentácia programu PowerPoint

EcoStyle |

MASTER LEDspot LV |

Microsoft PowerPoint - 1_eSO1

03_ControlFlow.dvi

Matej Kendera - PDF, word, lucene, java

Pokrocilé programovanie XI - Diagonalizácia matíc

Preco kocka stací? - o tom, ako sú rozdelené vlastné hodnoty laplasiánu v limite, ked sú velké

NSK Karta PDF

SK - JC Joint Committee - complaints-handling guidelines

PowerPoint Presentation

Microsoft Word - Algoritmy a informatika-priesvitky02.doc

Webové portály pre Hlavné mesto SR a Dopravný podnik Bratislava Ako sme Hlavnému mestu a Dopravnému podniku Bratislava zabezpečili väčší používateľský

Princípy tvorby softvéru Modelovanie domény

bakalarska prezentacia.key

Úvod do mobilného operačného systému ANDROID

Microsoft PowerPoint - SLIDES_02DTD.ppt

Microsoft Word - skripta3b.doc

1 Rekurencie este raz riesenia niektorych rekurencii z cvik. mame danu rekurenciu napr T (n) = at ( n b ) + k. idea postupu je postupne rozpisovat cle

NÁVRH UČEBNÝCH OSNOV PRE 1

SOR_SON

Microsoft PowerPoint - Prog_p08.ppt

Informačný systém pre externú časť a písomnú formu internej časti maturitnej skúšky Informačný systém pre EČ a PFIČ maturitnej skúšky Užívateľská prír

Metodika práce s gitom Spôsob práce s gitom V projekte sa budú udržovať dve hlavné vetvy: - Master - Hlavná vetva, ktorá odráža otestovaný funkčný kód

Snímka 1

Didaktické testy

Výnimky

Zasady ochrany osobnych udajov - HAGARA - JULINEK

Digitálne mesto kam smerujú elektronické služby a moderné technológie pre samosprávu Ing. Ľuboš Petrík

SKPOS

aplikácia do mobilého telefónu na stiahnutie digitálneho tachografu

(07) Rekonštrukcia Mierového námestia kamenná dlažba alebo trávnik? sa na mestskom úrade v Trenčíne uskutočnilo stretnutie zástupcov volnéh

Microsoft Word - Transparencies03.doc

gis5 prifuk

Špecifikácia testu zo SJL pre T Príloha 1 Špecifikácia testu zo slovenského jazyka a literatúry pre celoslovenské testovanie žiakov 9. ročníka Z

Prepis:

Kontrakty, unit testy a 6. 10. 2011 ÚINF/PAZ1c (Róbert Novotný) interfejsy

OOP z učebnice zapuzdrenie triedy sú uzavreté skrinky s jasne určenými operáciami dedičnosť trieda vie rozšíriť či zmeniť správanie nadradenej triedy polymorfizmus objekty danej triedy sa môžu správať všelijako v závislosti od konkrétneho typu

Zapúzdrenie / encapsulation Proces,,zaškatuľkovania" elementov abstrakcie, ktoré tvoria jej štruktúru a správanie. Účelom zapúzdrenia je oddeliť rozhranie s kontraktom abstrakcie od jej implementácie. Grady Booch, Object-Oriented Analysis and Design with Applications, 2007

Zapúzdrenie Proces,,zaškatuľkovania" elementov abstrakcie, ktoré tvoria jej štruktúru a správanie. Účelom zapúzdrenia je oddeliť rozhranie s kontraktom abstrakcie od jej implementácie. štruktúra = stav = inštančné premenné správanie = schopnosti = metódy zaškatuľkovaný element abstrakcie = trieda kontrakt = hlavičky metód formálna syntax pre to, čo očakávame od triedy implementácia = kód v metódach

Aké schopnosti a stav má mať trieda? najprv zistíme, ČO od triedy chceme a až potom dumeme AKO to trieda zrealizuje úvahy nad kontraktom by mali mať prednosť pred úvahami o implementácii návrh stavu často vyplynie z očakávaných schopností čo > ako kontrakt > implementácia schopnosti > stav

Rodné číslo Chcem evidovať rodné číslo!!!!! Huh? Vydolujeme zo zákazníka, čo chce: zistiť deň, mesiac a rok narodenia zistiť korektnosť zistiť pohlavie získať reťazec s lomkou i bez lomky

Návrh triedy, verzia 0.1alfa class RodneCislo { int getrok() int getmesiac() int getden() boolean jemuzske() boolean jevalidne() String tostring() String tostringbezlomky() } Pseudotrieda v pseudojazyku

Vieme, čo chceme. Ako to spraviť? ako interne reprezentovať rodné číslo? možnosť 1: jeden String nevýhoda: ak chceme vypisovať s lomkou i bez lomky, musíme šaškovať so Stringami nevýhoda: validácia je deliteľnosť jedenástimi výhoda: ošetríme prípad dedí narodených v 2000-2009 rodné číslo začína nulou

Vieme, čo chceme. Ako to spraviť? ako interne reprezentovať rodné číslo? možnosť 2: štyri integery deň, mesiac, rok, prípona nevýhoda: treba vysekávať zo stringovej reprezentácie nevýhoda: pamätať na pripočítavanie 5 u žien nevýhoda: jednotlivé zložky môžu začínať nulou dni: 1 9, mesiace: 1 9, roky 2000-2009

Vieme, čo chceme. Ako to spraviť? ako interne reprezentovať rodné číslo? možnosť 3: jedno celé číslo nevýhoda: treba vysekávať zo stringovej reprezentácie nevýhoda: pamätať na pripočítavanie 5 u žien nevýhoda: len rok môže začínať nulou výhoda: nuly sú lepšie než v predošlej možnosti výhoda: ľahká validácia Otázka: zmestíme sa do rozsahu?

Vieme, čo chceme. Ako to spraviť? ako interne reprezentovať rodné číslo? možnosť 4: pole buď pole znakov ekvivalentné jednému Stringu alebo pole štyroch reťazcov ekvivalentné štyrom inštančným premenným akurát menšia prehľadnosť alebo pole štyroch čísiel tiež ekvivalentné štyrom inštančným premenným akurát menšia prehľadnosť

Vieme, čo chceme. Ako to spraviť? ako interne reprezentovať rodné číslo? možnosť 5: štyri reťazce nevýhoda: potrebujeme prevádzať zložky na integery nevýhoda: pri delení treba vyskladať reťazec výhoda: podporujeme aj nuly

Kontrakt: reprezentácia je druhotná používateľa triedy nezaujímajú črevá triedy dôležité je, že metódy robia to, čo sa od nich čaká vonkajší pohľad na triedu ustanovuje kontrakt definovaný hlavičkami verejných metód parametrami a ich typmi návratovými hodnotami trieda sa správa ako blackbox!

Kontrakt! kontrakt ustanovený medzi používateľom a triedou ak klient splní záväzky, trieda splní jeho očakávania Pre triedu: záruky správania a predpoklady, na ktoré sa môže používateľ triedy spoliehať očakávania používateľa, ktoré mu trieda naplní zodpovednosti triedy Pre používateľa: záruky korektného správania sa používateľa splnenie predpokladov pre použitie triedy

Opäť rodné číslo definovali sme kontrakt implementácia spočíva v návrhu inštančných class RodneCislo { int getrok() int getmesiac() int getden() boolean jemuzske() boolean jevalidne() String tostring() String tostringbezlomky() } premenných a v interných algoritmoch, ktoré využívajú stav

Rodné číslo v Stringu class RodneCislo { private String rč dohodnime sa na implementácii Stringom stav: 1 ks inštančnej premennej RodneCislo(String rč) príklad implementácie schopnosti: int getrok() int getmesiac() int getden() boolean jemuzske() boolean jevalidne() String tostring() String tostringbezlomky() jemuzske() zistí, či sa 5. miesto začína nulou alebo jednotkou }

Použitie triedy RodneCislo rč = new RodneCislo("751212/8823"); if(rč.jevalidné()) { System.out.println("Osoba sa narodila v roku " + rč.getrok()); }

Ako otestovať našu triedu? Java začiatočník: vytvorí metódu main() výstupy riešime cez System.out.println() kontrolu urobíme od oka ak vidíme výstup, je to OK public static void main(string[] args) { RodneCislo rč = new RodneCislo("751212/8823"); if(rč.jevalidné()) { System.out.println("Osoba sa narodila " + "v roku " + rč.getrok()); } }

Lesk a bieda main() Čo ak máme viac variantov použitia? V triede môže byť len jedna metóda main()! Hlúpe riešenie č. 1: Podľa potreby odkomentovávame a zakomentovávame výseky kódu. Hlúpe riešenie č. 2: vytvoriť viac testovacích tried každá má svoj main() spúšťame podľa potreby

Meditácie nad main()om Čo ak potrebujeme testovať viacero vstupov? Budeme čítať z klávesnice dokola? Kedy nás to prestane baviť? Kedy nás prestane baviť okom kontrolovať výstupy vo veľkom softvéri? Prečo má byť testovací kód na kope s reálnym kódom? V prípade, že máme main() rovno v testovanej triede...

Chyby, chyby, chyby každý softvér obsahuje chyby! Code Complete: 15-50 chýb na 1000 riadkov dodaného kódu testovaním predchádzame chybám viacero druhov testov a viacero klasifikácií Kto neprogramuje, nech ani neje! Kto netestuje, nech ani neprogramuje!

Rozličné druhy testov Účel korektnosť výkonnosť spoľahlivosť zabezpečenie Životný cyklus testovanie fázy požiadaviek testovanie fázy dizajnu testovanie fázy programovania vyhodnocovanie výsledkov testov testovanie fázy inštalácie akceptačné testy testy fázy udržovania Zámer jednotkové testy testovania komponentov integračné testy systémové testy

Unit testy / Jednotkové testy Robí kód naozaj to, čo chceme aby robill? testovanie jednotiek kódu na korektnosť použitia unit = najmenšia testovateľná časť aplikácie v OOP = test triedy / rozhrania v procedurálnom programovaní: test procedúry testujeme malé, izolované časti funkcionality ak fungujú malé časti, budú fungovať aj tie väčšie

Základná idea unit testov pre testované metódy definujeme testovací vstup očakávaný výstup test: je vypočítaný výstup zhodný s očakávaným výstupom? ak áno, test uspel definujeme toľko testovacích vstupov a očakávaných hodnôt, koľko treba.

Unit testy a JUnit JUnit de facto štandardný framework pre unit testy v Jave zabudovaná podpora v NetBeans/Eclipse org.junit.assert RodneCislo rč = new RodneCislo("751212/8823"); Assert.assertEquals(1975, rč.getrok()) ;

Ukážka unit testu import org.junit.assert; public class RodneCisloTest { @Test public void testgetrok() { RodneCislo rč = new RodneCislo("751212/8823"); Assert.assertEquals(1975, rč.getrok()); } } @Test anotácia označujúca testujúcu metódu

org.junit.assert milión metód pre porovnanie očakávaného a vypočítaného vstupu assertequals() assertnull() assertnotnull() assertfalse() asserttrue() fail() test na vyhodenú výnimku @Test(expected=IllegalArgumentException.class)

Poznámky k unit testom každá verejná metóda triedy má mať unit test v ideálnom stave otestujeme správanie pre: každý riadok kódu každú vetvu kódu každú výnimku, ktorá môže nastať obvyklá realita: typické hlúpe a hraničné vstupy chýbajúce či nesprávne dáta...

Vlastnosti dobrého testu - ATRIP automatic professional thorough ATRIP independent repeatable

Vlastnosti dobrého testu - ATRIP automatic(ký) máme mať možnosť spustiť ich pred vydaním verzie automaticky thorough (podrobný) cieľ: 100% code coverage pokrytie kódu repeatable (opakovateľný) pri každom behu rovnaké výsledky nezávislý od vonkajšieho prostredia

Vlastnosti dobrého testu - ATRIP independent (nezávislý) testy sú navzájom nezávislé v jednom teste overujeme len jednu konkrétnu vlastnosť professional unit testy sú rovnako dôležité ako zvyšok kódu pomer riadkov kódu k riadkom testu: 1:1, možno aj viac netestujeme zbytočnosti testy jednoriadkových getterov, setterov, prázdnych konštruktorov

Testovanie zabíja čas! čas, ktorý zabijem písaním testu môžem venovať ďalším vlastnostiam! Mýtus od roku 20xx! pretože čas investovaný do testov sa vráti v dlhodobom horizonte

klasický spôsob: testujeme na záver projektu pri použití testov: vyššia priebežná investícia tá je však konštantná ale menej priebežných chýb: vždy pracujeme s otestovaným kódom!

Výhody unit testov predchádzame opakovanému nudnému obdivovaniu výstupov scroll blindness v záplave informácií si nevšineme podstatné veci predchádzame regresiám chyby, ktoré sa opravia,...a uvidíme ich v ďalšej verzii podporuje sa refaktoring vylepšovanie/úpravy kódu pri zachovaní funkcionality

Čas na projekt!

Zapúzdrenie a jeho výhody vďaka zapúzdreniu môžeme v prípade potreby zmeniť internú implementáciu ak dodržíme kontrakt, používateľ si nič nevšimne nezabúdajme! Trieda je čierna skrinka!

Rodné číslo a la 4 x int ak dodržíme kontrakt, použitie kódu je rovnaké a bez zmeny! kontrakt sme dodržali, ak fungujú unit testy! class RodneCislo { private int deň private int mesiac private int rok private int prípona } RodneCislo(String rč)... int getrok() int getmesiac() int getden() boolean jemuzske() boolean jevalidne() String tostring() String tostringbezlomky() public void testgetrok() { RodneCislo rč = new RodneCislo("751212/8823"); Assert.assertEquals(1975, rč.getrok()); }

Refaktoring! práve sme uskutočnili refaktor zmenili sme interné správanie zachovali kontrakt kód možno opeknel ;-) class RodneCislo { private int deň private int mesiac private int rok private int prípona } RodneCislo(String rč)... int getrok() int getmesiac() int getden() boolean jemuzske() boolean jevalidne() String tostring() String tostringbezlomky()

Sumár najprv navrhujte ČO chcete, až potom AKO najprv kontrakt (hlavičky metód), potom implementácia unit testami podporíme overenie správania dobré testy znamenajú možnosť refaktoringu cesta k postupne lepšiemu kódu