Vývoj aplikací řízený testy Miroslav Beneš
Obsah přednášky Principy extrémního programování (XP) Open Source nástroje pro XP Testy v prostředí Java JUnit Testy v prostředí.net NUnit Testování webových aplikací Mock Objects Testování výkonnosti aplikací Generování souborů XDoclet Další nástroje Testování aplikací 2
Extrémní programování (XP) Evoluční proces vytváření návrhu Vývoj aplikací v malých přírůstcích Úzká spolupráce programátorů (dvojice) Vývoj je řízen pomocí testů Nejdříve testujeme, pak píšeme zdrojový text Častá integrace Integrace (a integrační testy) následuje hned po vývoji Využití automatizačních nástrojů Testování aplikací 3
Požadavky na nástroje pro XP Automatizace Časté opakování základních kroků: překlad, instalace, testování One-button testing provedení celého procesu jedním příkazem, např. ant junit Využití generátorů zdrojového kódu pro opakující se vzory Hlavní cíl: snížit množství chyb zaviněných člověkem, minimalizovat rutinní činnosti Testování aplikací 4
Požadavky na nástroje pro XP Regresní testování Hlavní princip XP Každá nová vlastnost se vyvíjí zároveň s testem (nejprve test) Při objevení chyby vytvoříme test, na němž se chyba projevuje Psaní, spouštění a vyhodnocování testů musí být jednoduché (jinak to programátoři nebudou dělat ) Testování aplikací 5
Požadavky na nástroje pro XP Konzistence mezi vývojáři Časté změny pracovního prostředí (počítače, týmy), zásahy do celého vytvářeného systému Nutné identické prostředí pro všechny členy týmu (např. stejné akce spouštěné stejným způsobem) Podpora týmové práce konzistentní konfigurace projektů Stejné verze vývojových nástrojů, komponent a utilit Testování aplikací 6
Požadavky na nástroje pro XP Refaktorizace Vylepšování návrhu programů bez porušení jejich funkčnosti Důraz na neustálou refaktorizaci udržení co nejjednoduššího kódu bez velkých skoků Podpora vývojového prostředí Přejmenování Přesun ve struktuře (např. package) Vytvoření metody z úseku programu Testování aplikací 7
Požadavky na nástroje pro XP Spojitá integrace Časté vytváření kompletní aplikace (i několikrát denně) Umožňuje nabídnout zákazníkovi něco co funguje již během vývoje Snaha o automatizaci celého procesu až po vytvoření obrazu instalačního CD Nutnost malých kroků omezení šíření změn do velké části projektu Testování aplikací 8
Open Source nástroje pro XP Řízení verzí (CVS) http://www.cvshome.org Repository originální kopie všech souborů Programátoři pracují na svých kopiích modifikované soubory posílají zpět (commit) aktualizují kopie modifikované ostatními programátory řeší konflikty slévání (merge) Požadavky: Práce v malých krocích (méně konfliktů) Častá synchronizace s repository Udržování repository v provozuschopném stavu Testování aplikací 9
Open Source nástroje pro XP Ant http://ant.apache.org/ systém pro automatizaci opakovaných operací při vytváření aplikace XML soubor - build.xml Zajišťuje jednotně konfigurované prostředí přístup ke zdrojovému kódu, nastavení classpath, komponent a knihoven, instalace aplikace, Typické cíle: prepare, compile, clean, junit, Testování aplikací 10
Open Source nástroje pro XP JUnit http://www.junit.org/ Framework pro testování na úrovni programových jednotek tříd, metod Unit test testuje jednu funkční vlastnost aplikace Akceptační test testuje aplikaci jako celek, je řzeno zákazníkem Automatizované spouštění a vyhodnocení sady testů v grafickém nebo textovém prostředí Rozšiřitelné prostředí, na kterém jsou založeny další testovací nástroje Spolupráce CVS / Ant / JUnit Testování aplikací 11
Doporučený postup 1. Aktualizace zdrojových textů z CVS 2. Vytvoření testů pro JUnit (nová vlastnost nebo pokrytí objevené chyby) 3. Překlad zdrojových textů a spuštění testů (ant junit) 4. Při chybě oprava zdrojového textu 5. Opakování kroků 2-5 až do úspěšného běhu všech testů 6. Další aktualizace zdrojových textů z CVS zachycení změn provedených ostatními 7. Spuštění ant clean junit 8. Při úspěšném provedení všech testů vložení změn do CVS, jinak návrat zpět na 4 Testování aplikací 12
Open Source nástroje pro XP DbUnit http://www.dbunit.org/ Rozšíření JUnit na testování databázových aplikací Uvedení databáze do definovaného počátečního stavu před každým testem Testovací data např. XML Testování aplikací 13
Open Source nástroje pro XP HttpUnit Testování webových aplikací Testy probíhají na straně klienta Simulace webového prohlížeče http://www.httpunit.org/ Testování funkčnosti (ne programových jednotek) Cactus http://jakarta.apache.org/cactus/ Mnohem komplikovanější Testy servletů, JSP, filtrů Běží současně na straně serveru i klienta Testování aplikací 14
Open Source nástroje pro XP JUnitPerf Rozšíření JUnit pro testování výkonnosti aplikací Ověřuje, zda konkrétní test proběhne v zadané době Nevyhledá slabá místa - používá se typicky ve spolupráci s profilery Testování aplikací 15
Open Source nástroje pro XP StrutsTestCase http://strutstestcase.sourceforge.net/ Rozšíření třídy TestCase pro testování aplikací vytvořených pomocí Struts Nepotřebuje servletový kontejner mock objects ( falešné objekty ) in-server ( Cactus ) testing Podpora speciálních testů mapování, form beans, forwards Testování aplikací 16
Server pro budování aplikací Sdílený server Vytvoření aplikace z čistého stavu Získá čerstvou kopii zdrojových textů Vytvoří aplikaci Spustí testy Oznámí výsledky testování (např. e-mail) autorům provedených změn Testování aplikací 17
Server pro budování aplikací Automatické spouštění v době nečinnosti uživatelů CruiseControl http://cruisecontrol.sourceforge.net Zajišťuje provoz serveru Linux / Windows Testování aplikací 18
Testy v prostředí Java - JUnit programátorské rozhraní pro tvorbu testů nástroje pro automatické provádění testů grafické rozhraní příkazový řádek, akce pro Ant využití reflexe pro vyhledání testů uvnitř tříd rozšíření pro testování webových aplikací, servletů,... Testování aplikací 19
JUnit import junit.framework.testcase; public class TestXYZ extends TestCase { } void setup() { } inicializace void teardown() { } finalizace void testx() { } krok testu Testování aplikací 20
JUnit assertequals(, x, y) assertfalse(, podmínka) assertnotnull(, x) assertnotsame(, x, y) assertnull(, x) assertsame(, x, y) asserttrue(, podmínka) fail( ) Testování aplikací 21
Příklad import junit.framework.testcase; public class TestPerson extends TestCase { public void testgetfullname() { Person p = new Person( Bill, Gates ); assertequals( Bill Gates, p.getfullname()); } } public void testnulls() { Person p = new Person(null, Gates ); assertequals(? Gates, p.getfullname()); } Testování aplikací 22
Příklad Spuštění java junit.textui.testrunner TestPerson java junit.swingui.testrunner TestPerson Testování aplikací 23
Testy v prostředí.net - NUnit http://www.nunit.org/ Implementace JUnit pro.net Využívá principů atributově orientovaného programování [TestFixture] [Test] [SetUp] [TearDown] [TestFixtureSetUp] [TestFixtureTearDown] Testování aplikací 24
Příklad [TestFixture] public class CountryBoxTest { [Test] public void CheckContent() { CountryLib.CountryList list = new CountryLib.CountryList(); } } Assert.AreEqual("UK", list.getcountry(1)); Assert.AreEqual("US", list.getcountry(2)); Assert.AreEqual("CZ", list.getcountry(3)); Assert.AreEqual(null, list.getcountry(4)); Testování aplikací 25
Testování webových aplikací Potřebujeme simulovat činnost webového prohlížeče Analýza HTML Odesílání formulářů Sledování hyperlinků Nastavování cookies HttpUnit Poskytuje rozhraní pro interakci s HTTP servery Metody testxxx() využívají HttpUnit API Testování aplikací 26
Příklad import com.meterware.httpunit.*; import junit.framework.testcase; public class TestApp extends TestCase { public void testindexpage() { WebConversation web = new WebConversation(); WebResponse resp = web.getresponse( http://localhost:8080/app ); String text = response.gettext(); asserttrue(text.indexof( Hello ) > -1); } } Testování aplikací 27
Mock Objects Jak řešit složité závislosti mezi různými částmi aplikace? Nahradíme některé objekty falešnými Jednoduchá implementace Poskytují dobře definovaná data Možnost testovat, zda se správně používají (např. zda se inicializace volá právě jednou) Měly by se samy validovat Testování aplikací 28
Mock Objects http://www.mockobjects.com Sada hotových objektů nahrazujících často používané objekty Např. JDBC Connection, ResultSet http://www.mockmaker.org/ Generátor mock objektů pro zadané rozhraní Testování aplikací 29
Testování výkonnosti aplikací Obvykle se používají nástroje, jejichž výsledky je třeba vyhodnotit ručně JUnitPerf http://www.clarkware.com/software/junitperf.html TimedTest kontroluje dobu běhu testu LoadTest testuje chování při určité zátěži (např. počet současně pracujících uživatelů) Využívá návrhového vzoru Dekorátor Testování aplikací 30
Příklad public static Test suite() { Test testcase = new TestSearchModel( testsearch ); } TestSuite suite = new TestSuite(); suite.addtest( new TimedTest(testCase, 2000, false) ); return suite; Testování aplikací 31
Příklad public static Test suite() { Test testcase = new TestSearchModel( testsearch ); Timer timer = new RandomTimer(1000, 500); } TestSuite suite = new TestSuite(); suite.addtest( new LoadTest(testCase, 100, 10, timer) ); // 100 uživatelů, každý 10 krát return suite; Testování aplikací 32
Generování souborů - XDoclet http://xdoclet.sourceforge.net Rozšíření Javadoc Doclet API pro generování souborů na základě Javadoc značek @ a šablon (.xdt) Předdefinované šablony JavaBean, EJB Struts Hibernate Testování aplikací 33
Důvody pro použití XDoclet Zajištění konzistence Konfigurační soubory Struktura dat např. databáze / aplikační objekty Zjednodušení údržby Odstranění redundantní práce Rozhraní a implementace Abstrakce Atributově orientované programování (i v.net) Testování aplikací 34
XDoclet Systém předdefinovaných šablon Podpora aplikací v prostředí J2EE Podpora hlavních serverů JBoss, WebSphere, Resin, JonAS, SunONE, Spolupráce s programem Ant Možnost rozšiřování Uživatelem definované šablony Testování aplikací 35
Příklad /** * Přidělení externích oponentů projektům. * * @struts.action * path="/pridelenioponentuext" * name="seznamprojektuform" * scope="request" * validate="false" * @struts.action-forward * name="success" * path="/web-inf/jsp/ok/prideloponentyext.jsp" * * $Revision: 1.6 $ $Date: 2004/05/18 14:15:36 $ */ Testování aplikací 36
Příklad <target name="xdoclet.web"> <webdoclet destdir="${web.dir}/web-inf" mergedir="${xdoclet.dir}"> <fileset dir="${src.dir}"> <include name="**/*action.java"/> <include name="**/*form.java"/> <include name="**/*tag.java"/> <include name="**/*filter.java"/> <include name="**/*servlet.java"/> </fileset> <deploymentdescriptor servletspec="2.3"> <taglib uri="page" location="/web-inf/page.tld"/> </deploymentdescriptor> <strutsconfigxml version="1.1"/> <strutsvalidationxml/> </webdoclet> </target> Testování aplikací 37
Další nástroje XMLUnit http://xmlunit.sourceforge.net Testování XML aplikací Validace, XSLT transformace, vyhodnocení XPath výrazů a testování výsledku, HTML ServletTestCase, J2EEUnit Testování J2EE aplikací na straně serveru JFCUnit, Abbot, Pounder, Jemmy Testování Swing GUI Testování aplikací 38
Literatura Kent Beck: Extrémní programování. Grada Publishing, 2002, ISBN 80-247-0300-9 Eric M. Burke, Brian M. Coyner: Java Extreme Programming Cookbook. O Reilly, 2003, ISBN 0-596-00387-0 Testování aplikací 39