JavaBeans, Junit, JavaDoc

Slides:



Advertisements
Podobné prezentace
© 2000 VEMA počítače a projektování spol. s r. o..
Advertisements

Překlad Bath profilu 2.0 Martin Vojnar
Úvod do platformy Java EE
PrecisPlanner 3D Software pro plánování přesnosti měření v IG
Dynamické dokumenty na straně klienta Informatika pro ekonomy II.
Přednáška č. 3 Normalizace dat, Datová a funkční analýza
Přednáška č. 5 Proces návrhu databáze
Uživatelská rozhraní Uživatelská rozhraní 9. cvičení.
C# pro začátečníky Mgr. Jaromír Osčádal
CZ.1.07/1.4.00/ VY_32_INOVACE_133_IT7 Výukový materiál zpracovaný v rámci projektu Vzdělávací oblast: Informační a komunikační technologie Předmět:Informatika.
Přínosy virtualizace a privátního cloudu
PROGRAMOVACÍ JAZYKY (c) Tralvex Yeap. All Rights Reserved.
Desáté cvičení Java Core API Java Collection Framework JavaDoc.
Adobe Dreamweaver CS4 Ing. Martin Dosedla.
VY_32_INOVACE_INF_RO_12 Digitální učební materiál
Tvorba webových aplikací
State. State – kontext a problém Kontext  chování objektu má záviset na jeho stavu, který se typicky mění za běhu Neflexibilní řešení  metody obsahují.
NET Genium software pro výstavbu a provoz informačního portálu Martin Vonka
Představujeme službu Samepage
Náhoda, generátory náhodných čísel
Slide 1 A Free sample background from © 2003 By Default! Jiří Kůsa Testování propustnosti síťového firewallu.
Vývoj aplikací pro SharePoint
Michael Juřek Software Architect Microsoft s.r.o.
Úvod. školní: příprava na předmět Databázové systémy praktický: webové aplikace databázové systémy základy vývoje webových aplikací od návrhu databáze.
Návrh a tvorba WWW Přednáška 1
PHP – Základy programování
Objektové programování
Rozšíření jednouživatelské verze IS na víceuživatelskou Prezentace Diplomové práce Autor : Libor Tomášek Spoluautoři : Pobucký M., Drábek L. Vedoucí :
Tomáš Urych, ESO9 Intranet a.s.
Plán testů Tým FelPay. Testování a kvalita obecně Přispívá ke správné funkci systému Přispívá ke správné funkci systému Snižuje finanční a časové ztráty.
4IT445 – Testování a ladění v PHP Ing. Jan Mittner
Ant Připravil: Ing. Jan Kolomazník. strana 2 Proč vznikl Potřeba sestavovat komplexní Nezávisle na platformě Popis založený na xml Spouštění různých úloh.
Metainformační systém založený na XML Autor: Josef Mikloš Vedoucí práce: Ing. Jan Růžička, Ph.D. V/2004.
Databázové systémy Přednáška č. 6 Proces návrhu databáze.
LiveContent Univerzální Formulářové Řešení Michal Petrtýl, Marek Beneš.
Transparentní modelování a provádění procesů Michael Juřek Software Architect Microsoft s.r.o.
CSS styly Kaskádové styly (CSS – Cascading Style Sheets) jsou prostředkem, který zajišťuje jednotný vzhled publikovaných stránek. Technologii CSS podporují.
Dokumentace objektů a zveřejnění funkcí
Ing. Jan Mittner Životní cyklus požadavku 2. Moduly 3. Pluginy 4. Jak řešit komponenty typu menu 5. atd. 2.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
Algoritmizace a programování Objektově orientované programování - 16 Mgr. Josef Nožička IKT Algoritmizace a programování
Dílna Caché II. CSP pro pokročilé Tomáš Vaverka. Zdroje HTML Tag Reference v sekci Reference Material v dokumentaci Caché HTML Tag Reference v sekci Reference.
Návrhový vzor Factory v JAVA API Martin Kot Katedra informatiky VŠB – Technická univerzita Ostrava
Návrh a tvorba WWW Přednáška 5 Úvod do jazyka PHP.
Gymnázium, SOŠ a VOŠ Ledeč nad Sázavou I NFORMAČNÍ A KOMUNIKAČNÍ TECHNOLOGIE Ing. Jan Roubíček.
Databázové systémy I Cvičení č. 8 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
WWW – hypertextový informační systém
Dokumentace informačního systému
Analýza infromačního systému. Matice afinity ISUD matice – Insert (vkládání dat) – Select (výběr dat) – Update (aktualizace dat) – Delete (vymazání dat)
TNPW1 Technologie pro publikování na webu Cvičení č. 2 Překlad URL na fyzickou adresu stránky Editor Macromedia Homesite „Hello world“ v XHTML (úvod do.
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
Šesté cvičení Výjimky Balíky.
2005 Adobe Systems Incorporated. All Rights Reserved. 1 Inteligentní PDF formuláře Vladimír Střálka Territory Account Manager Adobe Řešení pro.
Import záznamů diplomových prací nové řešení Antonín Vaishar, SUAleph, 26. –
14. června 2004Michal Ševčenko Architektura softwarového systému DYNAST Michal Ševčenko VIC ČVUT.
PHP Programy pro tvorbu WWW stránek - 01
Jan Růžička, Leden /01/05 Proč pro prezentaci prostorových dat využívat nástrojů WWW Nízké náklady na vybavení klientského počítače Snadné zvýšení.
MICROSOFT OFFICE 2007/2010. Důvod změny Inovace technologií Nové možnosti použití Kompatibilita Ukončení tech. podpory starších verzí Office 2003 –
JavaScript úvod. Jazyky webového vývojáře Dynamická stránka  aktivně mění svůj obsah v reakci na činnost uživatele  zpracování na straně serveru (PHP,
Internet. je celosvětový systém navzájem propojených počítačových sítí („síť sítí“), ve kterých mezi sebou počítače komunikují pomocí rodiny protokolů.
Návrh uživatelského rozhraní. Volba akcí uživatele – Systém menu Formát ukládání a modifikace dat – Vstupní formuláře Způsob formulování dotazů – SQL,
Testování aplikací v Javě Petr Adámek IBA CZ, s.r.o. © 2010.
NÁZEV ŠKOLY:SOŠ Net Office, spol. s r.o. Orlová Lutyně
Vypracoval / Roman Málek
Připravil: Ing. Jan Kolomazník, Ph.D.
Návrhový vzor Flyweight
Tradiční metodiky vývoje softwaru
Tradiční metody vývoje softwaru
Web Application Scanning
Přednáška 9 Triggery.
Transkript prezentace:

JavaBeans, Junit, JavaDoc Lumír Návrat Katedra informatiky FEI VŠB-TUO A-1018 / 597 323 252 http://www.cs.vsb.cz/navrat/ lumir.navrat@vsb.cz

Obsah Úvod do komponent JavaBeans komponenty JUnit JavaDoc

Motivace Vývoj Distribuce Údržba Opakovaná použitelnost Snadnost testování Možnost specializace výrobců Distribuce Rychle uvedení na trh Nezávislost na dodavateli Údržba Snížení nákladů na údržbu Zaměnitelnost – tlak odběratelů na standardizaci

Co je to komponenta? (1) Stavební jednotka se smluvně definovanými: rozhraními; explicitními kontextovými vazbami Napájení Mobilní telefon IKeyboard GSM modul IBluetooth

Co je to komponenta? (2) Může být použita nezávisle na prostředí, pro které byla vytvořena, prostředí, ve kterém byla vytvořena. MS Office Print MyApp MPEG Player (C++) Home Video (Java) Movie Library (PHP)

Co je to komponenta? (3) Je určena pro integraci třetí stranou Autor komponenty Neví, kdo a k čemu bude jeho komponenty využívat Musí dodržet stanovené rozhraní Autor aplikace Neví, kdo bude dodávat komponenty Komunikuje přes stanovené rozhraní Integrátor Propojí aplikaci s vhodnými komponentami

Požadavky na komponenty Úplná dokumentace Důkladné testování Robustní kontrola platnosti vstupů Vracení dostatečných informativních chybových zpráv Vycházet s toho, že komponenta bude použita k předem nepředpokládaným účelům.

Specifikace komponenty Stav Vlastnosti – čtení, nastavení Chování Operace – volání, parametry, výsledek Interakce s okolím Události – registrace, oznámení

Java Beans “Write once, run anywhere, reuse everywhere” Přidávání funkcí bez nutnosti přepisovat úplně všechno Provádění na všech platformách Použití v různých scénářích – aplikacích, jiných komponentách, dokumentech, www stránkách, nástrojích pro vývoj aplikací, … Komponenta jako stavební blok Kontejnery – kombinace komponent do struktur Principy manipulace a komunikace s komponentami z vnějšího prostředí Introspekce Zpracování událostí Persistence

Typy komponent Vizuální komponenty Nevizuální komponenty Mají vizuální reprezentaci zabírající prostor v okně aplikace Příklad: tlačítko, tabulka, rolovací seznamy Podpora ve vizuálních nástrojích Nevizuální komponenty Příklad: časovač, databázové spojení, kontrola pravopisu, …

Scénáře použití (1) Využití grafického návrhového prostředí Rozložení komponent v okně aplikace Nastavení vlastností komponent Barva, typ písma, klávesové zkratky, … Využití editorů vlastností (property editor) Propojení komponent a zápis metod pro zpracování událostí Testování Vytvoření instalace aplikace včetně komponent

Scénáře použití (2)

Scénáře použití (3) Použití v ručně psaném programu Vytvoření instancí komponent a nastavení jejich rozměrů a pozic Nastavení vlastností komponent Vytvoření metod pro zpracování událostí Registrace metod pro zpracování událostí Testování Vytvoření instalace aplikace včetně komponent

Scénáře použití (4) import java.awt.Color; import javax.swing.JLabel; import java.io.Serializable; public class SimpleBean extends JLabel implements Serializable { public SimpleBean() { setText( "Hello world!" ); setOpaque( true ); setBackground( Color.RED ); setForeground( Color.YELLOW ); setVerticalAlignment( CENTER ); setHorizontalAlignment( CENTER ); }

Scénáře použití (4) JTextField textovePole = new JTextField(); JButton okTlacitko = new JButton(); SimpleBean nasBean = new SimpleBean(); private void jbInit() throws Exception { textovePole.setCaretColor(Color.orange); textovePole.setText(“Přednastavená hodnota”); okTlacitko.setText(“&Ok"); okTlacitko.addActionListener( new Aplikace_OKTlacitko_actionAdapter(this)); this.add(nasBean); this.add(textovePole); this.add(okTlacitko); } public void okTlacitko_actionPerformed(ActionEvent e) { //TODO: obsluha stisknutí Tlačítka

Demo Ukázka vytvořené komponenty Její použití v GUI Zdrojové soubory: http://www.cs.vsb.cz/navrat/ctc/cviceni1/SimpleBean.java http://www.cs.vsb.cz/navrat/ctc/cviceni1/buildSimpleBean.xml

Struktura komponenty Vlastnosti (properties) Metody (methods) Přístup prostřednictvím přístupových metod (čtení, zápis hodnoty), ne přímo Metody (methods) Operace nad komponentami Události (events) Vazby mezi komponentami

Příklad komponenty Counter vlastnosti CounterBean int value void clear() void increment() metody

Vlastnosti – Přístupové metody (1) public int getValue() private int value; public void setValue(int val) PTE - Kompnentní technologie

Přístupové metody (2) public class CounterBean implements Counter { private int value; public int getValue() { return this.value; } public void setValue(int val) { this.value=val; //Pokračovaní kódu příště 

Přístupové metody (3) Vlastnosti určené pouze pro čtení Mají pouze metodu getXXX() Vlastnosti určené pouze pro zápis Mají pouze metodu setXXX() Vlastnosti typu boolean Metoda pro čtení se může jmenovat isXXX() public boolean isEmpty();

Indexované vlastnosti public int getValue(int index) private int[] value; public void setValue(int index,int val)

Speciální vlastnosti Vázané vlastnosti (bound proprties) Generují událost PropertyChange, pokud se mění jejich hodnota Vlastnosti s omezením (constrained properties) Generují událost VetoableChange, pokud se mění jejich hodnota Změna může být zakázaná

Použití vlastností komponent Atributy objektů ve skriptovacích jazycích JavaScript, El-expresion language Programový přístup přes veřejné přístupové metody Přístup přes formuláře (property sheets) v návrhových prostředích Čtení a zápis do perzistentní paměti PTE - Kompnentní technologie

Úkol Rozšiřte komponentu Counter o následující vlastnosti: Název vlastnosti Typ Přístup Popis jeNula boolean Čtení Test zda Counter je ve výchozí hodnotě. pocetPrekroceni int Čtení, bounded Každé dosažení maxima, zvýší hodnotu o jedna Maximum Čtení/zápis, constrained Maximální hodnota čítače. Po dosažení bude čítač vynulován.

Metody Za metody komponenty se považují všechny veřejné (public) metody třídy public void clear() { val=0; } public void increment() { val++; Miniúkol: Přidejte metodu: increment

Události (1) Zdroj událostí Posluchač (listener) Objekt, který generuje události Spravuje seznam registrovaných posluchačů Posluchač (listener) Objekt, který chce být o události informován Musí být registrován u zdroje událostí Musí implementovat dohodnuté rozhraní

Události (2) Registrovaní posluchači Posluchač registrace Posluchač Zdroj událostí registrace Posluchač addEventListener vznik události nastala událost (e) Informace o události EventObject e

Zpracování událostí Posluchač se zaregistruje u zdroje událostí (např. u tlačítka, na jehož stisknutí čeká) Uživatel stiskne tlačítko – vznikne událost Zdroj události (tlačítko) projde seznam registrovaných posluchačů a každému z nich oznámí vznik události: Zavolá dohodnutou metodu rozhraní posluchače Metodě předá informace o události (podtřída java.util.EventObject)

Informace o události //Objekt přenášející informace i vygenerované public class CounterEvent extends EventObject { public CounterEvent(Counter source) { super(source); } public Counter getCounter() { return (Counter)source;

Posluchač (1) public interface CounterEventListener extends EventListener { //byla překročena maximální hodnota void limitReached( CounterEvent event); void reseted(CounterEvent event); } Miniúkol: Přidejte událost: Reseted

Posluchač (2) class MyListener implements CounterEventListener { public void limitReached(CounterEvent event){ System.out.println(“Čítač vynulován“); } public void reset(CounterEvent e) { System.out.println(“Překročen limit!“); //Pokračování, pokud máme více událostí Miniúkol: Implementujte pro předchozí události příslušné reakce.

Registrace posluchače (1) public class CounterBean implements Counter{ //Slíbené pokračování třídy  public void addCounterEventListener( CounterEventListener listener) { //registrace posluchačů } public void removeCounterEventListener( CounterEventListener listener) //zrušení registrace posluchače

Registrace posluchače (2) class MyListener implements CounterEventListener { void run() { Counter counter = new CounterBean(); counter.addCounterListener(this); counter.clear(); // … } public void limitReached(CounterEvent event){//…} public void reset(CounterEvent e) {//…} PTE - Kompnentní technologie

Adaptér (1) Rozhraní EventListener pro konkrétní komponentu může obsahovat mnoho metod Chceme-li reagovat jen na některé události: Musíme buď implementovat prázdné reakce na ostatní události Nebo použijeme adaptér jako bázovou třídu a implementujeme jen zvolené metody Adaptér implementuje implicitní odezvu na všechny události PTE - Kompnentní technologie

Adaptér (2) class CounterAdapter implements CounterEventListener { public void reset(CounterEvent e) {} public void limitReached(CounterEvent e) } PTE - Kompnentní technologie

Adaptér (3) Counter counter = new Counter(); //použití anonymní vnitřní třídy counter.addCounterListener( new CounterAdapter { public void reset(CounterEvent e) { System.out.println(“Reset”); } }); PTE - Kompnentní technologie

Úkol Vytvořte komponentu, která bude představovat zásobník. Podrobné zadání: http://www.cs.vsb.cz/navrat/vyuka/ctc/cviceni2/cviceni2.html

Persistence Automatická Vlastní Implementace rozhraní Serializable Pomocí klíčového slova transient Metody readObject() a writeObject() private void writeObject(java.io.ObjectOutputStream out) throws IOException; private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; Implementace rohraní Externalizable

Další informace Introspekce – automatická analýza komponenty, pomocí níž získáme informace o vlastnotech, metodách, událostech Property editory – možnost editovat vlastnosti v rámci jejich editorů (v GUI apod) BeanContext – vazby mezi komponentami a prostředím, ve kterém běží Odkazy na domovské stránky k Java Beans http://java.sun.com/products/javabeans/ http://java.sun.com/docs/books/tutorial/javabeans/

Co je to chyba? Jakýkoliv problém, snižující kvalitu programu. Funkcionalita Užitná hodnota Spolehlivost Výkon Požadavky uživatele

Testování programů (1) Verifikace Validace Ověřování interní konzistence produktu (zda produkt odpovídá návrhu, návrh analýze, analýza požadavkům) Formální verifikace – často obtížná Validace Ověřování (externím nezávislým zdrojem), zda celé řešení splňuje očekávání uživatelů nebo klientů.

Testování programů (2) Cíl: Snížení rizika výskytu chyby Nutný pesimismus! Výskyt chyby je třeba očekávat. Nejdůležitější pravidlo pro testování je dělat ho. (B. Keringham a R. Pike – The Practice of Programming) Opakované testování (re-testing) Kontrola, zda jsme chybu odstranili. Regresní testování Kontrola, zda jsme úpravou nevnesli nove chyby

Typy testů (1) Rozdělení na testy, které: jsou součástí výsledného produktu; jsou odděleny od výsledného produktu (náplní této kapitoly). Rozdělení dle množství informací, které máme pro testování. black box testing – osoba, která vytváří test nemusí mít informace o tom, jak funguje aplikace na úrovni, na které je test vytvářen. white box testing – pro vytváření testů je nutné znát informace o fungování testované části

Typy testů (2) „Ruční“ testování Automatické testování náročné není opakovatelné snadno se přehlédnou chyby Automatické testování generování testů – zajištění maximálního pokrytí zdrojového textu

Úrovně testování (1) Jednotkové testy (Unit tests) Jsou vytvářeny pro malé části produktu – „jednotky“. Co to je jednotka závisí na konkrétním produktu, programovacím jazyce,… (třída, metoda třídy, funkcionalita tvořené aplikace,…) Při testování testují jen konkrétní jednotku. Neočekává se, že k testování bude použit zbytek aplikace. Simulují například činnost databáze, síťové zdroje a podobně. Obvykle pojmenované jako TestXXX (kde XXX je jméno testované jednotky).

Úrovně testování (2) Integrační testy Systémové testy Testují větší moduly vytvářené aplikace. Systémové testy Obvykle vytvářeny „testry“ Testují systém jako by byl nainstalován uživateli. Očekává se, že jsou přítomny všechny prostředky nutné pro běh aplikace (databáze, síťové zdroje,…). Testy funkcionality, uživatelského rozhraní, bezpečnosti,… Zákaznický test (Customer tests, Acceptance tests) Testují hotový systém. „Black-box testing“ celého produktu, výsledkem je zda je produkt možno předat zákazníkovi.

Úrovně testování (3) Alfa Beta Gama Provádí se před zveřejněním produktu Vývojáři „Výstupní kontrola“ Beta Poskytnutí produktu vybrané skupině externích uživatelů, získání zpětné vazby. Gama Kompletní dílo, které zcela neprošlo interní kontrolou kvality

Funkce prostředí pro testování Prostředí pro testování by minimálně mělo: umět spustit série testů; rozhodnout, zda testy proběhly úspěšně. Jednotlivé testy by měly být prováděny nezávisle na ostatních; v případě, že test skončil chybou určit proč; sumarizovat získané výsledky. V ideálním případě by prostředí pro testování by mělo být nezávislé na vlastních testech.

Příprava před testováním Plánování testů Rozdělení do skupin podle toho, jaké části aplikace testují. Rozdělení do skupin tak, aby mohly být testy prováděny paralelně. Příprava dat Simulace různých zdrojů – databáze,… Generování náhodných dat. Příprava prostředí pro testování. Definování zodpovědnosti za části tvořené aplikace. Nástroje pro tvorbu programů

Spuštění testů Provedení jednoho, nějaké skupiny, všech testů. Jsou-li testy prováděny paralelně a nebo jsou některé činnosti prováděny na pozadí může být nutné tyto činnosti synchronizovat. Pokud používáme více počítačů a nebo více platforem může nám prostředí pro testování pomoct při řízení těchto strojů a nebo stírá rozdíly mezi platformami. Uchování výstupu nebo vstupu testů.

Po skončení testování Vygenerování zprávy, která shrnuje výsledky testu. Přehledný, úplný, flexibilní,… Měl by poskytovat přehled, které soubory a jak byly testovány. Měli bychom být schopni rozlišit mezi neúspěšně provedeným testem a chybě při testování. Měli bychom být schopni uměle vytvořit nalezenou chybu.

JUnit (1) prostředí Java, varianty i pro jiné jazyky (NUnit, CPPUnit,…) programátorské rozhraní pro tvorbu testů různé nástroje pro automatické provádění testů grafické rozhraní příkazový řádek, akce pro Ant podpora v řadě IDE využití reflexe pro vyhledání testů uvnitř tříd rozšíření pro testování webových aplikací, servletů, databázových aplikací...

JUnit (2) import junit.framework.TestCase; public class TestXYZ extends TestCase { } void setUp() {…} inicializace void tearDown() {…} finalizace void testX() {…} krok testu assertTrue(podmínka), assertFalse(…) assertEquals(x,y), assertNotNull(x) …

JUnit (3) package cviceni3; import junit.framework.TestCase; public class TestZlomek extends TestCase { protected Zlomek z1 = new Zlomek(1, 3); protected Zlomek z2 = new Zlomek(2, 6); protected Zlomek z3 = new Zlomek(2, 3); protected void setUp() { } protected void tearDown() { } public void testEquals() { assertEquals(z1, z1); assertEquals(z1, z2); } public void testAdd() Zlomek result = Zlomek.plus(z1, z2); assertEquals(result, z3);

Junit (4) JUnit verze 4.x Java 1.5 Použity anotace Testy Inicializace @Test public void testVyhledej() { … } Inicializace @Before protected void setUp() throws Exception {…} @After protected void tearDown() throws Exception {…}

JUnit (5) import static org.junit.Assert.*; public class PoleTest { @Before protected void setUp() throws Exception { pole = new Pole(); } @After protected void tearDown() throws Exception { pole = null; @Test public void vratPocet() { … assertEquals("return value", expectedReturn, actualReturn);

Demo Spuštění vytvořených testů, odhalení chyby http://www.cs.vsb.cz/navrat/ctc/cviceni3/cviceni3.zip

Jak napsat testy v JUnit(1) Obecně chceme, aby testy ověřovaly funkcionalitu nějaké části vyvíjeného produktu. Informace co testovat získáme spíše z popisu funkcionality než ze zdrojových kódů. Test by měl odhalit, pokud testovaná část neimplementuje „popsané“ funkce. Nástroje pro tvorbu programů

Jak napsat testy v JUnit(2) Příklad: Testujeme metodu isEmpty() třídy Vector. Metoda vrátí true v případě, že vektor je prázdný a false v případě že není. Můžeme test napsat takto: public void testIsEmpty () { Vector vector=new Vector(); assertTrue(vector.isEmpty()); } Špatné řešení! Takováto implementace metody isEmpty by testem prošla a přitom neodpovídá popisu! public boolean isEmpty() { return true;} Lepší řešení by bylo otestovat obě varianty výstupů.

Jak napsat testy v JUnit(3) Konkrétní řešení závisí na testovaném problému! Obecné rady Pokud testovaná metoda vrací víc „typů“ výsledku (například metoda compareTo() třídy Integer vrací -1, 0, 1) otestujte všechny varianty. Obvykle nejsme schopni otestovat všechny varianty vstupů a výstupu. Ověříme nejčastěji používané. Otestujeme „krajní meze“ vstupů a výstupů.

Úkol Vytvořte sadu testů, které budou pokrývat testy vaši komponentu Zasobnik Měli by jste testovat činnost následujících metod: E pop() Otestujte i výjimku, kterou tato metoda generuje. E peek() Otestujte i výjimku, kterou tato metoda generuje. Při řešení předpokládejte, že konstruktor i metoda push již byly otestovány a fungují správně.

Další vlastnosti JUnit (1) Testy lze „združovat“ pomocí třídy TestSuite Výsledek testu lze získat pomocí třídy TestResult Další informace naleznete na:http://junit.sourceforge.net/javadoc/ Aplikace ke stažení na: http://xprogramming.com/software.htm public static Test suite() { TestSuite suite = new TestSuite(); suite.addTestSuite(cviceni2.TestPredmet.class); suite.addTestSuite(cviceni2.TestPredmetIO.class); return suite; } TestResult result = new TestResult(); suite.run(result); result.wasSuccessful();

Další nástroje pro testování aplikace (1) Analyzátory paměti Uchovává informace o tom, jak a kolik paměti bylo při běhu aplikace použito. Purify, Electric Fence, … Coverage tools Nástroje zjišťující jak velká část aplikace je použita při testování. Výsledek může být zdrojový kód, který nebyl při testování použit. Další možností (branche coverage) je, které části podmínek nebyly provedeny respektive, které větve programu nebyly použity.

Další nástroje pro testování aplikace (2) Testování výkonnosti Sledování počtu volání určitých funkcí Sledování času stráveného výpočtem různých částí programu podklad pro optimalizaci změnou algoritmu Nástroje označované jako profilery. Bývají součástí vývojových prostředí. Profilaci může podporovat překladač a nebo lze použít samostatný program jako: gprof. Nástroje pro tvorbu programů

Další nástroje pro testování aplikace (3) Analyzátory kódu (static code analyzers) Testují různé statické vlastnosti zdrojových kódů Jak přesně splňují normy pro daný programovací jazyk (ANSI C). Bezpečnost – hledá potencionálně nebezpečné příkazy. Korektnost – některé jazyky umožňují matematicky dokazovat vlastnosti (funkcionální jazyky) nebo hledají vzory častých chyb (FindBug) Velikost případně komplexnost Analýzy dokumentace, která je součástí zdrojových kódů. „Stabilita“ API – jak často se v čase mění Nástroje pro tvorbu programů

Vývoj řízený testy (TDD) Napíšeme testy Napíšeme program Spustíme automatizované testování Provedeme refaktorizaci Opakujeme až do odstranění všech chyb Hlavním cílem je dosáhnout toho, aby všechny testy prošly Mohou být ale chybné testy! Nástroje pro tvorbu programů

Refaktorizace (1) Transformace zdrojového kódu, která vede ke zlepšení jeho čitelnosti nebo struktury, avšak bez změny významu nebo chování. Přejmenování proměnné Vytvoření podprogramu ze zadaného úseku programu. Nahrazení posloupnosti příkazu if polymorfismem. … Důležitá součást metodiky TDD, XP Nástroje pro refaktorizaci bývají součástí IDE. Nástroje pro tvorbu programů

Testování programů – Refaktorizace (2)

Sledování chyb (1) Nástroj, který umožňuje uložit informace o chybách a rozliší jednotlivé chyby (jednoznačně je identifikuje). Nástroj využívají všichni členové týmu. Nástroj pomáhá celé skupince lidí pracovat na řadě malých problémů (jednotlivých chybách). Celá řada nástrojů Bugzilla, GNATS, FogBugs, JIRA, TestTrack,… Většina nástrojů jsou informační systémy, které pro uložení dat používají databázi a nejčastěji komunikují přes webové rozhraní.

Sledování chyb (2) Dobrý nástroj pro sledování chyb by měl: uchovávat informace o chybě, včetně stavu ve kterém je (nevyřešena, řešena, …); umět pracovat se skupinami chyb (odstranění komplexnějšího problému); vyhledat chyby a sledovat aktuální změny; generovat statistiky a komplexnější zprávy o sledovaných chybách; podporovat historii jednotlivých chyb a být schopen spojit chyby s příslušnou verzí dané aplikace (integrace s SCM); rozlišovat závažnost chyby; …

Sledování chyb – Bugzilla Asi nepoužívanější volně dostupný nástroj pro sledování chyb. Napsána v Perlu, komunikuje přes internetový prohlížeč a používá email ke komunikaci. Implementuje běžné funkce očekávané od nástroje pro sledování změn. Vyhledávání - regulární výrazy, boolovské výrazy LDAP, historie změn každé chyby, podpora závislostí mezi chybami, „hlasování“ pro určení „otravných“ chyb …

Generování dokumentace Dokumentace je vytvářena současně s aplikací Oddělená dokumentace problémy s aktualizací nutnost uvádět kompletní specifikace Dokumentace určená pro: uživatele aplikace; pro potřeby tvůrců aplikace. Dokumentace jako součást zdrojového textu snadnější údržba (např. včetně verzování) literární programování (D. Knuth) dokumentační značky - javadoc

Program javadoc Dokumentace ve speciálních poznámkách /** * Dokumentační poznámka */ Dokumentační značky + HTML @author <a href=mailto:joe@mit.edu>Joe</a> @param x Popis parametru x http://java.sun.com/j2se/javadoc/writingdoccomments/ Rozšíření – generování zdrojových textů pomocí šablon - XDoclet

Konvence - pořadí @param (třídy, rozhraní, metody a konstruktory) @return (jen metody) @exception (@throws synonymum přidané v Javadoc 1.2) @author (třídy a rozhraní, povinné) @version (třídy a rozhraní, povinné) @see @since @serial (nebo @serialField nebo @serialData) @deprecated

Program javadoc /** * Konstruktor zlomku. * Naplní čitatele a jmenovatele a převede * zlomek do normalizovaného tvaru. * @param citatel Čitatel zlomku. * @param jmenovatel Jmenovatel zlomku. */ public Zlomek(int citatel, int jmenovatel) { this.citatel = citatel; this.jmenovatel = jmenovatel; normalizuj(); }

Generování (1) - Ant <javadoc packagenames="com.dummy.test.*" sourcepath="src" excludepackagenames="com.dummy.test.doc-files.*" defaultexcludes="yes" destdir="docs/api" author="true" version="true" use="true" windowtitle="Test API"> <doctitle><![CDATA[<h1>Test</h1>]]></doctitle> <bottom><![CDATA[<i>Copyright © 2000 Dummy Corp. All Rights Reserved.</i>]]></bottom> <tag name="todo" scope="all" description="To do:"/> <group title="Group 1 Packages" packages="com.dummy.test.a*"/> <group title="Group 2 Packages" packages="com.dummy.test.b*:com.dummy.test.c*"/> <link offline="true" href="http://java.sun.com/j2se/1.5.0/docs/api/" packagelistLoc="C:\tmp"/> <link href="http://developer.java.sun.com/developer/products/xml/docs/api/"/> </javadoc>

Generování (2) - IDE

Úkol Již dříve vytvořené třídy doplňte o Javadoc komentáře.

Technologie Java Server Pages Architektury informačních systémů Technologie Java Server Pages doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz (c) Miroslav Beneš, Katedra informatiky FEI VŠB-TU Ostrava

Obsah přednášky Java Servlets Struktura webové aplikace Java Server Pages Komponenty Java Beans Uživatelské značky Knihovny značek (JSTL / Jakarta Struts) Technologie JSP

Java Servlet Container Java Servlets Standardní metoda rozšiřování webových serverů o dynamické generování obsahu Základní rozhraní pro aplikace s tenkým klientem (webový prohlížeč) Web Browser Java Servlet Container Servlet Servlet Technologie JSP

Výhody servletů Perzistence mezi voláními – rychlejší odezva na požadavky, sdílení dat CGI – opakované zavádění Přístup k celému Java API JDBC – databáze JAXP – práce s XML JNDI – adresářové služby Technologie JSP

Servletový kontejner Zajišťuje běh servletu JVM Správa sezení Udržování kontextu Konfigurační informace Perzistence Různí dodavatelé – standardizace Java Servlet API 2.4 Technologie JSP

Typy servletových kontejnerů Rozšíření WWW serveru Apache/JServ S vestavěným WWW serverem Jetty (Mortbay.com) WebSphere (IBM) Samostatné aplikační servery Apache Tomcat Sun Application Server /Glassfish JBoss Technologie JSP

Java Servlet API GenericServlet servletInfo init() service(request, response) destroy() ServletConfig servletName getInitParameter(n) servletConfig 1 1 * servletContext 1 ServletContext attribute(n) getInitParameter(n) HttpServlet lastModified doGet() doPost() … javax.servlet.* javax.servlet.http.* Technologie JSP

Reprezentace požadavku ServletRequest remoteHost, … parameter(name) reader http://www.lib.com/catalog - context path HttpServletRequest contextPath header(name) cookies[] HttpSession attribute(n) removeAttribute(n) invalidate() session * 1 Technologie JSP

Reprezentace odpovědi ServletResponse contentType writer outputStream HttpServletResponse header(name) addCookie(cookie) addHeader(name, value) sendError(sc, msg) Technologie JSP

Struktura webové aplikace http://www.lib.com/catalog Servlety .class Statický obsah .html, .jpg, .gif, … JSP .jsp Knihovny tříd .jar WEB-INF classes lib web.xml images … index.jsp http://www.lib.com/catalog/WEB-INF/... Technologie JSP

Java Server Pages Oddělení prezentace od aplikační logiky Zjednodušení realizace stránek Servlety na všechno Statický obsah HTML + servlety pro akce Dynamický obsah v rámci statického Možnost editace HTML editory Kompilace na Java servlet Při prvním požadavku, kontrolují se změny Technologie JSP

Prvky JSP Direktivy Vložený úsek programu Výraz Vestavěné značky akcí <%@ page contentType=“text/html” %> Vložený úsek programu <% out.println(“x : “ + x); %> Výraz x : <%= x %> Vestavěné značky akcí <jsp:include page=“/headers/header.jsp” /> Uživatelem definované značky <my:Date /> <% @ taglib uri=http://lib.com/tags prefix=“my” %> Technologie JSP

Příklad 1 <%@ page contentType=“text/html; charset=iso-8859-2” %> <%@ page import=“java.util.*” %> <html> <head> <title>První pokus</title> </head> <body> <h1>Vítejte na mé stránce</h1> <p> Dnešní datum je <%= new Date().toString() %> </p> </body> Technologie JSP

Příklad 2 <%@ page contentType="application/vnd.ms-excel" %> out.println("x\tx^2"); for(int i = 1; i <= 10; i++) { out.println(I + "\t“ + (i * i)); } %> Technologie JSP

Příklad 3 <% Iterator i = cart.getItems().iterator(); <%     Iterator i = cart.getItems().iterator(); while (i.hasNext()) { ShoppingCartItem item = (ShoppingCartItem)i.next();      BookDetails bd = (BookDetails)item.getItem(); %>  <tr>      <td align="right” bgcolor="#ffffff">       <%=item.getQuantity() %>      </td><td bgcolor="#ffffaa">       <strong><a href="<%=request.getContextPath()%> /bookdetails?bookId=<%=bd.getBookId()%>"> <%=bd.getTitle()%></a></strong>     </td>      ... <%    // End of while    } Technologie JSP

Předdefinované proměnné HttpServletRequest request <%= request.getRemoteHost() %> HttpServletResponse response HttpSession session PrintWriter out ServlerContext application ServletConfig config PageContext pageContext page (= this) Technologie JSP

Komponenty Java Beans Konstruktor Vlastnosti (properties) Metody public StringBean() {} Vlastnosti (properties) private String msg = “Nic”; public String getMsg() { return msg; } public void setMsg(String m) { msg=m; } Metody public void clear() { msg = “Nic”; } Události (events) Technologie JSP

Příklad package cviceni2; import java.util.Hashtable; import java.util.Collection; public class SeznamUzivatelu { private Hashtable tabulka = new Hashtable(); public void uloz(Uzivatel u) { tabulka.put(u.getLogin(), u); } public Uzivatel hledej(String login) { return (Uzivatel)tabulka.get(login); } public Collection getSeznam() { return tabulka.values(); } } Technologie JSP

Použití JavaBeans v JSP Zavedení komponenty <jsp:useBean id=“sb” class=“StringBean“ /> Přístup k vlastnostem <jsp:getProperty name=“sb” property=“msg” /> Nastavení vlastnosti <jsp:setProperty name=“sb” property=“msg” value=“Ahoj” /> <jsp:setProperty name=“sb” property=“msg” param=“message” /> <jsp:setProperty name=“sb” property=“*” /> Technologie JSP

Sdílení komponent <jsp:useBean id=“…” class=“…” scope=“…”/> scope=“page” (implic. hodnota) v objektu PageContext scope=“application” v objektu ServletContext sdílí se všemi servlety ve stejné aplikaci scope=“session” v objektu HttpSession scope=“request” v objektu ServletRequest Technologie JSP

Uživatelské značky Třída obslužného programu (handler) rozhraní javax.servlet.jsp.tagext.Tag metody doStartTag(), doEndTag() Deskriptor knihovny značek soubor xxx.tld ve formátu XML Soubor JSP používající značky <%@ taglib uri=“xxx.tld” prefix=“xxx”%> <xxx:znacka param=“…”> … </xxx:znacka> Technologie JSP

Příklad – DatumTag.java package tis.tags; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class DatumTag extends TagSupport { public int doStartTag() { try { JspWriter out = pageContext.getOut(); out.print(new java.util.Date()); } catch( java.io.IOException e ) {…} return SKIP_BODY; } Technologie JSP

Příklad – tis-taglib.tld <?xml version="1.0" encoding=“iso-8859-2” ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>tis</shortname> <uri></uri> <info>Testy pro TIS</info> <tag> <name>datum</name> <tagclass>tis.tags.DatumTag</tagclass> <info>Vloží dnešní datum</info> </tag> </taglib> Technologie JSP

Příklad – tags.jsp <%@ taglib uri="/WEB-INF/tis-taglib.tld" prefix=“tis" %> Dnes je <tis:datum/> Technologie JSP

JSTL – JavaServer Standard Tag Library Core výrazy <c:out value=“…”/> tok řízení <c:forEach var=“…“ items=“…">…</c:forEach> práce s URL <c:url var=“…” value=“…”/> XML analýza <x:parse …/> transformace <x:transform xslt=“…” xml=“…”/> I18n (Internationalization) formátování textů <fmt:message key=“…”/> formátování čísel a data/času <fmt:formatDate …/> Database volba zdroje dat <sql:setDataSource dataSource=“…”/> SQL dotazy a transakce <sql:query var=“…>…</sql:query> Technologie JSP

Apache Struts Tag Library bean definice a zpřístupnění JavaBeans z různých zdrojů html HTML formuláře a další prvky uživ. rozhraní logic řízení toku aplikace template práce se šablonami stránek tiles tvorba stránek z komponent Technologie JSP

Příklad <%@ page contentType="text/html; encoding=iso-8859-2" %> <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <jsp:useBean id="uzivatele" class="cviceni2.SeznamUzivatelu" scope="session"> <% uzivatele.uloz(new Uzivatel("wal314", "Johnny", "Walker")); %> </jsp:useBean> <html:html> <body> <h2>Seznam uživatelů</h2> <table border="1"> <c:forEach var="uziv" varStatus="st" items="${uzivatele.seznam}"> <tr> <td><c:out value="${st.count}"/></td> <td><c:out value="${uziv.login}"/></td> <td><c:out value="${uziv.jmeno}"/> <c:out value="${uziv.prijmeni}"/></td> </tr> </c:forEach> </table> </body> </html:html> Technologie JSP

Literatura Marty Hall: Java servlety a stránky JSP. Neocortex, Praha, 2001, ISBN 80-86330-06-0 http://java.sun.com/products/jsp http://www.jboss.org http://jakarta.apache.org Technologie JSP