Struktura třídy, operátory, jednoduché algoritmy, jUnit Programování II 2. cvičení Alena Buchalcevová
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
©Alena Buchalcevová
• • • • • •
Programování II
Cíle cvičení
2
• 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.
©Alena Buchalcevová
• Z IS (materiály) si stáhněte projekt Kalkulacka • Otevřete projekt Kalkulacka v BlueJ • Spusťte si kalkulačku
Programování II
Projekt Kalkulacka
3
Interface IKalkulator definuje rozhraní mezi grafikou kalkulačky a logikou kalkulačky Implementace Kalkulatoru, která nic neumí, slouží k otestování grafiky
Implementace grafického uživatelského rozhraní kalkulačky
4
Hlavní třída, která propojí grafiku s odpovídající implementací rozhraní Kalkulator Programování II
©Alena Buchalcevová
Propojení grafiky a logiky
/** * 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
©Alena Buchalcevová
// 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
Programování II
• část kódu třídy Kalkulacka
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 Programování II
©Alena Buchalcevová
• 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.
©Alena Buchalcevová
• Třída MujKalkulator musí mít implementovány všechny metody z rozhraní IKalkulator
Programování II
Jak se implementuje rozhraní
7
/** * 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; }
©Alena Buchalcevová
public int getHodnotaKZobrazeni() { return 0; }
Programování II
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í */
8
}
©Alena Buchalcevová
public Kalkulacka() { //Inicializujte atributy instance kalk = new MujKalkulator(); gui = new GrafikaKalkulacky(kalk);
Programování II
Zapojení třídy MujKalkurator do třídy Kalkulacka
9
Jednotkové testování
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ě
©Alena Buchalcevová
• v našem případě chceme otestovat třídu MujKalkulator
Programování II
• umožňuje testovat jednotlivé třídy
• K dispozici na www.junit.org ve verzi 4.4 10
Vytváření testů v JUnit • 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),
©Alena Buchalcevová
• každý test je samostatná metoda
Programování II
• testovací třída je potomkem třídy junit.framework.TestCase
11
Testy v BlueJ
©Alena Buchalcevová
• Jestliže není nastavíte ji volbou Nástroje-Nastaveni
Programování II
• Je třeba, aby v BlueJ byla zobrazena nabídka pro vytváření testů
zaškrtnout
12
©Alena Buchalcevová
Programování II
Vytvoření třídy s testy
13
Testovací třída
• je vygenerován konstruktor a prázdné metody • protected void setUp() • protected void tearDown()
©Alena Buchalcevová
• testovací třída je potomkem junit.framework.TestCase
Programování II
• název testovací třídy = název testované třídy + test
14
hodnota na displeji
35
35
35C
0
25+12=
37
2 5 + 12 = 3
3
25+2+3=
30
25 + 12 + 25++ 25+= 25++= 25+12-= 25-12=
©Alena Buchalcevová
kombinace kláves
Programování II
Co chceme testovat
25-12-= 25== 25-25+12== 25++12= 25--12= 25-2+3=
15
Programování II
2. cislice(3) 3 Grafika kalkulačky
Můj kalkulátor
1. 3. getHodnotaKZobrazeni()
©Alena Buchalcevová
4.
3
16
1.
Grafika kalkulačky
Programování II
5
4.
©Alena Buchalcevová
2. cislice(5)
Můj kalkulátor
3. getHodnotaKZobrazeni()
35 17
Programování II
2. vymaz() 4.
Můj kalkulátor
3. getHodnotaKZobrazeni()
©Alena Buchalcevová
1.
Grafika kalkulačky
0
18
Vytváření testů/1
©Alena Buchalcevová
Programování II
• 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
©Alena Buchalcevová
• 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
Programování II
Vytváření testů/2
20
©Alena Buchalcevová
• 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.
Programování II
Vytváření testů/3
21
public void test35() { mujKalku1.cislice(3); assertEquals(3, mujKalku1.getHodnotaKZobrazeni()); mujKalku1.cislice(5); assertEquals(35, mujKalku1.getHodnotaKZobrazeni()); }
©Alena Buchalcevová
• 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().
Programování II
Vytváření testů/4
22
Spuštění testu
©Alena Buchalcevová
Programování II
• Test spustíme v lokálním menu testovací třídy, můžeme spouštět jednotlivé testovací metody nebo všechny testy.
23
©Alena Buchalcevová
• Vytvořte další testovací metody podle tabulky uvedené na slidu 15 v této prezentaci
Programování II
Úkoly
24
• 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...
©Alena Buchalcevová
• Zkuste naprogramovat metody cislice() a getHodnotaKZobrazeni()
Programování II
Úkoly
25
26
©Alena Buchalcevová
Programování II