20. 09. 2015
V tomto článku se dozvíte jaké má Java nástroje pro testování, kompilaci, verzování, loggování, atd …
Motivací příspěvku je vytvoření aktuálního obrazu nejlepších dostupných nástrojů a jejich vzájemné porovnání. Zaměříme se na nástroje pro podporu vývoje v jazyce Java na platformě Windows, ale většina nástrojů je dostupných i pro široké spektrum dalších platforem. Následující text vám pomůže s výběrem vývojového prostředí, verzovacího systému, ticket systému, buildovacích nástrojů a logovacích nástrojů.
V současné době je možné vybrat si z opravdu široké nabídky různých nástrojů. Při výběru nástroje bychom se měli zaměřit především na tyto vlastnosti produktu: aktivní komunita , produkt je stále vyvíjen a udržován, s produktem je na trhu dobrá zkušenost a jde integrovat s ostatními našimi nástroji. Univerzální návod jak vybrat ten správný nástroj neexistuje. Je potřeba mít zkušenosti s nástroji ze kterých se má zvolit a také jistá dávka intuice a předvídatelnosti, aby vybrané nástroje pokryly i problémy které teprve vzniknou.
Vývojová prostředí
Při vývoji jakékoliv aplikace máme prakticky vždy možnost vybrat si, jestli budeme používat nějaké „sofistikované“ vývojové prostředí, nebo jestli raději použijeme jednoduchý testový editor (VIM, Emacs, PsPad, …) a spolu s ním velké množství dalších nástrojů na kompilaci, testování, atd. Vývojové prostředí nám obvykle integruje všechny potřebné nástroje a poskytne nám tak robusní základ pro vývoj naší aplikace, tudíž je velice vhodné nějaké vývojové prostředí používat. Od vybraného vývojového prostředí se pak často odvíjí další související nástroje a proto je vhodné jeho volbě věnovat dostatek pozornosti.
V následujícím textu se budeme věnovat těmto čtyřem prostředím: Eclipse, NetBeans, BlueJ a IntelliJ IDEA. Jedná se o v současné době nejpoužívanější prostředí s velkou komunitou a velkým množstvím doplňků a integrovaných podpůrných nástrojů.
Eclipse je opensource nástroj, který ve svém základu poskytuje pouze základní funkčnost potřebnou pro vývoj v Javě, ale disponuje velkým množstvím pluginů. Celé prostředí je implementované v jazyce Java, ale nepoužívá pro vykreslování GUI Swing, ale vlastní knihovnu SWT. Použití vlastního vykreslovacího kladně ovlivňuje rychlost celé aplikace. Eclipse zkrze své pluginy podporuje i mnoho dalších programovacích jazyků a hodí se tak i pro vývoj webových řešení, kde si pouze s Javou nevystačíme.
Vývojové prostředí NetBeans je taktéž opensource vyvýjený v Česku pod záštitou Sun Microsystems. NetBeans se snaží již v základu obsáhnout co nejvíce funkcionality a možnost psát vlastní pluginy byla proto přidána relativně nedávno. Podporována je široká škála programovacích jazyků, integrována je i podpora webových frameworků, práce s XML, UML, GUI builder a další. NetBeans mají proti Eclipse vyšší nároky na hardware, ale zato poskytují lepší integraci základních technologií díky velkému množství funkčnosti již v základní instalaci.
Prostředí BlueJ lze doporučit těm co se chtějí naučit programovat v jazyce Java, naopak pokročilí Java programátoři mohou tento odstavec přeskočit. BlueJ vám bude dobrým pomocníkem při učení objektově orientovaného programování i jazyka Java. Umožňuje vyvíjet aplikace spolu s jejich návrhem ve zjednodušené verzi UML, prohlížet si instance objektů a interaktivně mezi nimi posílat zprávy a pozorovat co se za běhu programu děje. BlueJ je vhodné doplnit o další rozšíření, například PMD, které zmíníme v sekci testování a které vám pomůže s dodržováním konvencí ve vašem kódu.
IntelliJ IDEA je další prostředí vyráběné v čechách, tentokrát společností JetBrains. Jako jediné ze čtyř zde uváděných je jediné komerční. Hlavním cílem tohoto prostředí je dosažení co nejvyšší produktivity programátora. Například doplňovač kódu je opravdu velice intaligentní a dokáže doslova číst programátorovy myšlenky.
Podle čeho si vybrat vývojové prostředí? Nainstalujte si všechny tři zde zmiňované a vyzkoušejte je na napsání malé aplikace. Pak si vyberte to, které vám bude nejvíce vyhovovat. Myslím, že programátor by měl mít prostředí ve kterém pracuje rád a proto bych volil podle tohoto „prvního dojmu“.
Testování software
Dobré testování začíná ještě dříve než vznikne samotný program. Vhodné je proto využít různé nástroje pro testování na úrovni modelu. Tyto nástroje však nejsou předmětem tohoto příspěvku. Věnovat se budeme nástrojům pro automatické testování zdrojového kódu vašich programů. Hezká prezentace na toto téma od firmy Profinit je zde.
Pokud se mezi vývojáři řekne automatizované testování většina z nich si představí Unit testing. Pro kvalitní otestování je však nutné k unit testům přibrat ještě nástroje pro statickou analýzu kódu, integrační testy, funkční testy a výkonové testy.
Pro testování prvních napsaných řádků kódu se použivají takzvané Unit (jednotkové) testy. Tyto testy slouží k otestování každé jednotlivé třídy, kterou vytvoříme. Je zvykem nejprve vytvořit pro třídu sadu testů a až následné třídu implementovat. Pro Unit testování v Javě můžeme použít nástroje JUnit a TestNG. Oba nástroje jsou integrovány s nejrozšířenějšími vývojovými prostředími. Nástroj JUnit je starší a existuje proto kolem něj větší komunita. Naproti tomu TestNG nemá některé problémy související se zpětnou kompatibilitou.
Statická analýza kódu nám zkontroluje věci ve kterých se nejčastěji dělají chyby, jako je používání I/O, synchronizačních primitiv, dodržování jmenných konvencí v kódu. Pro statickou analýzu kódu existují nástroje FindBugs, PMD a jlint. Nástroje FindBugs a PMD se zaměřují na typické programátorské prohřešky, jako je jsou prázdné klauzule try/catch/finally/switch, nepoužívaný kód, a především pak duplicitu kódu. Oba nástroje jsou velice dobře integrované s opravdu velkým množstvím vývojových prostředí. Nástroj jlint klade důraz na hledání chyb při používání vláken a jejich synchronizaci. Bohužel pro jlint není podporována integrace s žádným vývojovým prosředím a ve zkompilované podobě je dostupný pouze pro Microsoft Windows.
Integrační testy zajistí otestování spolupráce jednolivých tříd a také jejich nasazení v přirozeném prostředí. Důležitým faktorem je testování produktu včetně připojení do databáze. Pro tento typ testý lze využít již zmíněny TestNG, nebo nástroj DbUnit, který je rozšířením JUnit pro integrační testy. První nástroj nám pomůže při samotné organizaci a provádění testů, druhý s počáteční inicializací a následným úklidem dat. U rozsáhlých projektů však můžete narazit na problém velmi dlouhou dobou přípravy data a jejich následného úklidu. Tento problém je možné vyřešit uzavřením celého testu do transakce, která je na konci testu rollbacknuta (více zde).
Funkční testy testují hotový systém jako celek. Testy se provádějí tzv. „zvenku“, tedy pracujeme s BlackBoxem. Pro testování GUI existují například nástroje UISpec4J, JFCUnit a Abbot. Tyto nástroje zajišťují komplexní automatizaci testování GUI testů, vyhodnocení výsledků testů a jejich report. JFCUnit je dalším rozšířením pro JUnit, který společně s DBUnit dělá z JUnitu opravdu univerzální testovací nástroj. Všechny tři nástroje se zaměřují na testování Swing aplikací, pouze Abbot disponuje i podporou pro AWT. Pokud v Javě vyvíjíte webové aplikace, předchozí zmíněné nástroje vám s testováním GUI nepomohou. Pro webové aplikace existuje výborný nástroj Selenium, které se zaměřuje na testování webových grafických rozhraní. Selenium je integrováno s oblíbeným webovým prohlížečem Firefox.
Poslední fází automatizovaného testování jsou výkonové testy. Výkonové testy zjišťují „úzká hrdla“ v systému a umožňují je odstranit již během vývoje aplikace. Opomenutí provedení výkonových testů se může na aplikaci projevit postupným zpomalováním některých operací tak jak budou přibývat data, nebo dokonce náhlý kolaps aplikace pro nedostatek výkonu. Pro tyto testy se hodí například nástroj jMeter, existuje samozřejmě velké množství dalších nástrojů, ale jMeter patří mezi nejrozšířenější a je pro něj dostupné nepřeberné množství plug-inů.
S testováním souvisí ještě jeden problém při vývoji multiplatformních Java aplikací. Multiplatformnost totiž není použitím multiplatformní platformy zajištěna, ale pouze podpořena. Je proto velice vhodné zvolit alespoň jednu linuxovou distribuci, Mac OS X a možná i další operační systémy jako Solaris, BSD, atd. na kterých budete váš produkt testovat.
Verzovací systém
Pro verzování zdrojových kódů jazyka Java je možné použít kterýkoli z běžně používaných centralizovaných (CVS, SVN) i decentraliovaných (Git, Bazaar, Mercurial a další.) verzovacích nástrojů. Konkrétní volba záleží na vašich preferencích.
Buildovací nástroje
Pro sestavení a distribuci aplikace máme na víběr mezi dvěma nejrozšířenějšími nástroji. Starším z nich je Ant. Ant nám umožní udělat vše od kompilace, přes sestavení JAR soubrů až po upload na FTP. Existuje mnoho rozšíření, které přidávají další funkčnost. Samozřejmostí je nadefinování závislostí podobně jako u nástroje make.
Novější nástroj je Maven. Maven se znaží ještě více zjednodušit proces vytváření build scriptů a především zavádí určitou strukturu celého projektu a tak se programátor znalé této struktury ve všech projektech v Mavenu snadno orientuje.
Logovací nástroje
Mezi nejoblíbenější logovací nástroje patří Log4j a součást Java API Java Logging API. Oba nástroje poskytují velice podobnou funkčnost, ale Log4j obvykle poskytuje ještě něco navíc. Výhodou Java Logging API je jeho přítomnost ve všech instalacích Javy od verze 1.4.
Logovací nástroje nejsou bohužel schopny odchytit RuntimeException a její potomky. Pro tyto vyjímky je vhodné alespoň provést přesměrování chybového výstupu do textového souboru, kde pak mohou být vyjímky přečteny a tedy i následně odstraněny jejich příčiny.
Závěrem
Na předchozích rádcích jste se dozvěděli jaké jsou současné trendy na poli nástrojů pro vývoj v jazyce Java. Tato kompilace by vám měla pomoci rychle se zorientovat v problematice nástrojů, ale rozhodně by neměla sloužit jako jediný podklad pro volbu nástrojů. Autor se snaží popsat všechny běžně používané nástroje, existují však i jiné, které mohou být pro váš projekt užitečnější.