Struktura třídy, operátory, jednoduché algoritmy, junit 2. cvičení Alena Buchalcevová
Cíle cvičení seznámit se s rozhraním (interface) v Javě seznámit se s testováním při vývoji (makety, JUnit) naučit se implementovat rozhraní naučit se vytvářet v BlueJ jednotkové testy ujasnit si, jak komunikují instance zopakovat a ujasnit si pojmy : datový atribut pomocná proměnná formální parametr metody skutečný parametr metody naučit se při zápisu kódu metody používat příkaz if 2
Projekt Kalkulacka Z IS (materiály) si stáhněte projekt Kalkulacka Otevřete projekt Kalkulacka v BlueJ Spusťte si kalkulačku vytvořte instanci třídy Kalkulacka a zavojejte metodu show() Podívejte se na dokumentaci jednotlivých tříd projektu a zjistěte, jak jsou mezi třídy rozděleny jednotlivé činnosti. 3
Interface IKalkulator definuje rozhraní mezi grafikou kalkulačky a logikou kalkulačky Implementace Kalkulatoru, která nic neumí, slouží k otestování grafiky 4 Hlavní třída, která propojí grafiku s odpovídající implementací rozhraní Kalkulator Implementace grafického uživatelského rozhraní kalkulačky Alena Buchalcevová
Propojení grafiky a logiky část kódu třídy Kalkulacka // datove atributy instanci IKalkulator kalk; GrafikaKalkulacky gui; atribut kalk je deklarován typu IKalkulator, tj. může v něm být jakákoli instance třídy, která implementuje rozhraní IKalkulator /** * Konstruktor pro vytvoreni instance tridy Kalkulacka */ public Kalkulacka() { //Inicializujte atributy instance kalk = new MaketaKalkulator(); gui = new GrafikaKalkulacky(kalk); } Konkrétní implementace rozhraní se volí až zde v konstruktoru třídy Kalkulacka a je předána jako parametr grafice 5
Chceme vytvořit novou třídu, která implementuje rozhraní IKalkulator Vytvořte novou třídu a pojmenujte ji MujKalkulator Upravte ve zdrojovém kódu hlavičku třídy takto: public class MujKalkulator implements IKalkulator Promítne se to i do diagramu tříd 6 Alena Buchalcevová
Jak se implementuje rozhraní Třída MujKalkulator musí mít implementovány všechny metody z rozhraní IKalkulator Nejprve vytvoříme prázdnou implementaci - to znamená, že metody nebudou nic dělat budou prázdné v případě že vracejí hodnotu, budou vracet implicitní hodnotu příslušného typu Zdrojový kód musí jít přeložit. 7
public class MujKalkulator implements IKalkulator { /** * Metoda vrací hodnotu, která se má zobrazit na displeji kalkulačky. * Tato metoda se obvykle volá po zavolání metody odpovídající stisku tlačítka. * * @return hodnota k zobrazení */ Alena Buchalcevová public int gethodnotakzobrazeni() { return 0; } /** * metoda se volá při stisknutí tlačítka "C" (clear) na kalkulačce */ public void vymaz(){ } /** * metoda vrací jméno autora, např. "autor: Jan Novák" * * @return řetězec se jménem autora */ public String getautor(){ return null; } 8
Zapojení třídy MujKalkurator do třídy Kalkulacka } public Kalkulacka() { //Inicializujte atributy instance kalk = new MujKalkulator(); gui = new GrafikaKalkulacky(kalk); 9
Jednotkové testování umožňuje testovat jednotlivé třídy v našem případě chceme otestovat třídu MujKalkulator JUnit Použijeme testovací framework JUnit, který je přímo zakomponován v BlueJ Open Source nástroj pro testování tříd napsaných v Javě K dispozici na www.junit.org ve verzi 4.4 10
Vytváření testů v JUnit testovací třída je potomkem třídy junit.framework.testcase každý test je samostatná metoda výsledek se zjistí: pomocí metody assertequals porovnávají se očekávané hodnoty a skutečné hodnoty pomocí metody fail(string textchyby) se ohlásí chyba používá se v případě, že nelze použít metoda assertequals (např. při zjišťování, zda se opravdu vyskytne výjimka), 11
Testy v BlueJ Je třeba, aby v BlueJ byla zobrazena nabídka pro vytváření testů Jestliže není nastavíte ji volbou Nástroje-Nastaveni zaškrtnout 12
Vytvoření třídy s testy 13
Testovací třída název testovací třídy = název testované třídy + test testovací třída je potomkem junit.framework.testcase je vygenerován konstruktor a prázdné metody protected void setup() protected void teardown() 14
Co chceme testovat kombinace kláves hodnota na displeji 3 5 35 3 5 C 0 2 5 + 1 2 = 37 2 5 + 12 = 3 3 2 5 + 2 + 3 = 30 25 + 12 + 2 5 + + 2 5 + = 2 5 + + = 2 5 + 1 2 - = 2 5-1 2 = 2 5-1 2 - = 2 5 = = 2 5 - - 2 5 + 1 2 = = 2 5 + + 1 2 = 15 2 5 - - 1 2 = 2 5-2 + 3 =
2. cislice(3) 4. 3 1. Grafika kalkulačky Můj kalkulátor 3. gethodnotakzobrazeni() 3 16
2. cislice(5) 4. 5 1. Grafika kalkulačky Můj kalkulátor 3. gethodnotakzobrazeni() 35 17
2. vymaz() 4. 1. Grafika kalkulačky Můj kalkulátor 3. gethodnotakzobrazeni() 0 18
Vytváření testů/1 Před každým testem potřebujeme vytvořenou instanci třídy MujKalkulator, dáme si ji tedy do přípravku - metoda setup() 19
Vytváření testů/2 V lokálním menu testovací třídy zvolíte volbu Vytvořit testovací metodu Do zásobníku odkazů je automaticky vložen testovací přípravek Pojmenujeme metodu tak, aby z názvu bylo patrné co se testuje 20
Vytváření testů/3 Poté začne záznam testu Na instanci mujkalku1 spustíme postupně metody, které simulují vkládání hodnoty z grafiky a odesílání hodnot na display při zadávání čísla 35. 21
Vytváření testů/4 Analogicky pokračujeme s 5. Vkládání testu ukončíte stisknutím tlačítka Ukončit v panelu testů a test se automaticky ukončí, testovací přípravek se uklidí. Prohlédněte si vygenerovaný zdrojový kód testu, smažte vzorovou metodu testxxx(). public void test35() { mujkalku1.cislice(3); assertequals(3, mujkalku1.gethodnotakzobrazeni()); mujkalku1.cislice(5); assertequals(35, mujkalku1.gethodnotakzobrazeni()); } 22
Spuštění testu Test spustíme v lokálním menu testovací třídy, můžeme spouštět jednotlivé testovací metody nebo všechny testy. 23
Úkoly Vytvořte další testovací metody podle tabulky uvedené na slidu 15 v této prezentaci 24
Úkoly Zkuste naprogramovat metody cislice() a gethodnotakzobrazeni() zamyslete se nad tím, zda budete potřebovat nějaký datový atribut ve třídě MujKalkulator Po každém úspěšném přeložení třídy MujKalkulator spusťte všechny testy. Naprogramujte metodu vymaz() Naprogramujte metodu plus() atd... 25
26