Java na web XI. - Testování
Dnes se budeme věnovat takzvaným jednotkovým testům. Díky nim můžeme mít jistotu, že vše funguje jak má a vyhneme se „špinavé“ práci při ručním testování.
3.8.2013 00:00 |
Petr Horáček
| Články autora
| přečteno 9586×
V minulém díle jsme si pověděli něco o možnostech autentizace a autorizace. Dnes se budeme věnovat problematice, která sice není pro koncové uživatele přímo viditelná, přesto je ale velice důležitá, půjde o testování aplikace. Nepůjde ani tak o testování rychlosti nebo zátěže, ale o pouhé zjišťování faktu zda apliakce funguje jak má.
Unit testing
Unit testing, neboli testování jednotek, je proces, při kterém testujeme funkčnost co nejmenších částí (jednotek) aplikace (tedy metod apod.). Při správném používání nám unit testing zaručí přehled o funkčnosti aplikace a to bez nutnosti neustálého testování při úpravách kódu. O samotné testování se starají k tomu určené frameworky.
JUnit
JUnit je unit testing framework vytvořený pro jazyk Java. Usnadňuje testování širokou škálou připravených metod, v aktuální verzi 4 je navíc jeho syntaxe díky použití anotací skvěle přehledná a snadná na použití. Protože je JUnit široce rozšířený, je implementovaný do řady vývojových prostředí, a to včetně NetBeans. Domovská stránka projektu: http://junit.org/
JUnit testy mají podobu obyčejných tříd, mohou se zde nacházet různé metody, jenž pomocí anotací přiřadíme k jednotlivým procesům testování. Zde je základní schéma třídy testu:
import org.junit.*;
public class Test {
@BeforeClass
public static void setUpClass() throws Exception {
// Kód který se vykoná ještě před prvním testem,
// pokud testujete metody jedné třídy, je ji zde
// vhodné initializovat, pokud testujete databázi,
// je zde to pravé místo pro navázání spojení atd.
}
@Before
public void setUp() throws Exception {
// Kód který se vykoná před každým testem
}
@Test
public void prvniTest() {
// První kód testování
}
@Test(Timeout = 100)
public void druhyTest() {
// Druhý kód testování, selže, pokud neskončí do 100 ms
}
@Test(expected = Exteption.class)
public void tretiTest() {
// Třetí kód testování, selže, pokud neskončí určenou vyjímkou
}
@Ignore
@Test
public void ignorovanyTest() {
// Ignorovaný kód, nebude do testování zahrnut
}
@After
public void tearDown() throws Exception {
// Kód který se vykoná po každém testu
}
@AfterClass
public static void tearDownClass() throws Exception {
// Kód který se vykoná po posledním textu
}
}
Pozn.: Ve verzi JUnit 4.10 (která je součástí aktuálního NetBeans) jsou metody označené anotací @Test vykonávány asynchronně, jejich pořadí v kódu tedy nemá význam a nelze počítat s jejich postupným plněním.
Pozn. 2: Pokud přesto chcete udržovat přesné pořadí testů, můžete ze stránek JUnit stáhnout aktuální verzi 4.11 a vložit ji do projektu, poté stačí třídě testů přidat anotaci @FixMethodOrder. Tento postup ale není vhodný, testy by na sobě neměly být závislé.
Pro vyhodnocování průběhu testů se používají tzv. assert statements. Pomocí těchto metod můžete porovnávat očekávané výsledky s reálnými. Zde jsou vypsané některé z nich:
assertTrue(zprava, stav);
// kontroluje, zda je předaná boolean proměnná True,
// pokud ne, test neuspěje a předá danou zprávu
assertEquals(zprava, ocekavane, ziskane);
// porovnává hodnotu očekávanou se získanou
assertEquals(zprava, ocekavane, ziskane, tolerance);
// porovnává dvě float či double proměnné, tolerance
// udává možnou odchylku
assertNull(zprava, objekt);
// kontroluje zda je objektu null
assertNotNull(zprava, objekt);
// kontroluje zda objekt není null
assertSame(zprava, ocekavane, ziskane);
// kontroluje zda obě proměnné odkazují na stejný objekt
assertNotSame(zprava, ocekavane, ziskane);
//kontroluje zda obě proměnné odkazují na jiné objekty
Jednoduchý příklad celého testu, po jeho vykonání se vrátí hlášení o neúspěchu:
package testy;
import org.junit.Test;
import static org.junit.Assert.*;
public class TestPoctu {
@Test
public void testSouctu() {
int int1 = 1;
int int2 = 1;
int int3 = 3;
assertEquals("Součet nesouhlasí", int3, int1 + int2);
}
}
JWebUnit
JWebUnit je framework rozšiřující JUnit (to mimo jiné usnadňuje jeho použití ve vývojových prostředích). Usnadňuje testování webových aplikací, konkrétně jejich uživatelského prostředí. Díky JWebUnit můžete kontrolovat funkčnost formulářů, tabulek či prostých odkazů. Domovská stránka projektu: http://jwebunit.sourceforge.net/
Tento framework je v podstatě rozšíření JUnit v podobě několika balíčků. Stačí tedy vložit příslušné knihovny JWebUnit do projektu a používat jejich funkce v testech. Zde je několik příkladů použití přejatých z oficiální dokumentace:
/*
NAVIGACE
*/
setBaseUrl("http://localhost:8080/aplikace");
// nastaví kořenovou adresu aplikace
beginAt("index.jsp");
// začne prohlížení na adrese http://localhost:8080/aplikace/index.jsp
assertTitleEquals("Úvod");
// testuje přítomnost titulku
assertLinkPresent("prihlasit");
// testuje přítomnost odkazu s určenou ID
clickLink("prihlasit");
// stiskne odkaz s určeným ID
assertLinkNotPresent("prihlasit");
// testuje nepřítomnost odkazu
assertLinkPresentWithText("Přihlásit se");
// testuje přítomnost odkazu s textem
clickLinkWithText("Přihlásit se");
// stiskne odkaz s určeným textem
assertTextPresent("Vítáme vás na naší stránce");
// testuje přítomnost textu na stránce
assertElementPresent("uvitani");
// testuje přítomnost objektu na stránce podle jeho ID
assertTextInElement("uvitani", "Vítame vás na naší stránce");
// testuje přítomnost textu v objektu s určenou ID
/*
PRÁCE S FORMULÁŘI
*/
assertFormPresent("vzkaznik");
// testuje přítomnost formuláře
assertFormElementPresent("vzkaz");
// testuje přítomnost vstupu formuláře
setTextFileld("vzkaz", "Ahoj");
// vyplní vstup
assertFormElementEqueals("vzkat", "Ahoj")
// testuje vyplnění vstupu
submit()
// odešle formulář
setWorkingForm("id_formulare")
// specifikuje formulář pro práci
assertButtonPresent("id_tlacitka")
// testuje přítomnost tlačítka
clickButton("id_tlacitka")
// stiskne tlačítko
/*
PRÁCE S TABULKAMI
*/
assertTablePresent("id_tabulky");
// testuje přítomnost tabulky
assertTextInTable("id_tabulky", "Hrušky");
// testuje přítomnost řetězce v tabulce
assertTextInTable("id_tabulky",
new String[] {"Jablka", "Hrušky"});
// testuje přítomnost skupiny řetězců v tabulce
assertTableEquals("id_tabulky",
new String[][] {{"Jablka", "6"},
{"Hrušky", "3"}});
// testuje obsah tabulky
A zde je příklad jednoduchého testu s použitím JWebUnit:
import org.junit.*;
import static net.sourceforge.jwebunit.junit.JWebUnit.*;
public class PrikladTestu {
@Before
public void prepare() {
setBaseUrl("http://localhost:8080/aplikace");
}
@Test
public void test1() {
beginAt("/");
assertTitleEquals("Vzkazník");
setTextField("vzkaz", "Ahoj");
submit();
}
}
Testování
Nyní už přejděme k praxi. Budeme využívat funkcionalit NetBeans a jako pokusný projekt využijeme naší aplikace (text ale jistě bude mít přínos pro uživatele jiných prostředí a programátory jiných aplikací). V našem případě vytvoříme jeden test webového rozhraní, ve kterém vyzkoušíme přihlášení, přidání zápisku a jeho následovné smazání.
Příprava projektu
Nejprve bude třeba vytvořit nový adresář pro třídy obsahující jednotlivé testy a importovat knihovny JUnit, NetBeans se naštěstí skoro o vše postará.
Otevřete tedy projekt s aplikací, v levém bloku klikněte pravým tlačítkem na jeho položku a zvolte Propreties, mělo by se otevřít nastavení. V kartě Sources u položky Test package zvolte Add Folder, ve složce projektu vytvořte novou složku s názvem „test“ a vyberte ji. Label složky změňte na „Test Packages“ a potvrďte. Nyní by se ve stromu projektu měly objevit dvě nové položky: První s názvem Test Packages, do ní budeme vkládat všechny třídy spojené s testováním a oddělíme je tak od zbytku aplikace. Druhá s názvem Test Libraries do které budeme vkládat knihovny unit testing frameworků.
Import knihoven
Knihovny JUnit se importují automaticky po přidání prvního testu, JWebUnit však musíme přidat ručně. Stáhněte tedy archiv z adresy http://sourceforge.net/projects/jwebunit/files/ a rozbalte jej do jakékoliv složky, ve které si uschováváte stažené knihovny (při importu do projektu se na ně pouze vytvoří odkaz, nepřekopírují se). Já pro tento účel vytvořil novou složku v adresáři projektu.
Nyní klikněte pravým tlačítkem na položku Test Libraries a přidejte nejdříve stažené knihovny jwebunit-core-xxx.jar, jwebunit-htmluni-plugin-xxx.jar a poté všechny knihovny ze složky lib.
Úprava databáze
Jak již bylo řečeno, budeme testovat přihlášení a přidání zápisku. Pro tento účel si vytvoříme testovacího uživatele. Připojte se tedy k dabázi a odešlete tento příkaz pro vytvoření uživatele „test“ s heslem „heslo“.
INSERT INTO JNW.users VALUES ("test", "955db0b81ef1989b4a4dfeae8061a9a6");
INSERT INTO JNW.user_roles VALUES ("test", "user");
Úprava zapisky.jsp
Abychom mohli kontrolovat úspěšnost přihlášení, potřebujeme identifikovat stránku s výpisem zápisků. Upravme trochu view zapisky.jsp, přidejte do tagu form prvního formuláře tento kód:
id="pridat-zapisek"
Vytvoření testu
Klikněte pravým tlačítkem na položku Test Packages a přidejte nový Java package s názvem testy. Do vytvořeného balíčku přidejte nový JUnit Test. V průvodci vytvořením zadejte název třídy WebTest, z dolních check boxů odškrtněte pouze Test Initializer, pro vygenerování metody s anotací @Before. Po potvrzení přidání ještě vyberte verzi JUnit 4.x. Všimněte si, že po přidání této třídy přibyl pod položku Test Packages balíček JUnit.
Nejprve přidejte import knihovny JWebUnit:
import static net.sourceforge.jwebunit.junit.JWebUnit.*;
Poté do třídy přidáme dvě proměnné uschovávající jméno a heslo testovacího uživatele. Vepište tedy do třídy mimo metody toto:
static private String uzivatel = "test";
static private String heslo = "heslo";
Dalším krokem bude nastavení adresy testování a přihlášení (to musíme dát buď do metody označené anotací @Before, nebo do testu společně s přidáním zápisku, protože se testy spouští asynchronně, nelze je řadit za sebe). Vygenerovanou metodu s anotací @Before přejmenujte na prihlaseniTest a přidejte do ní tento kód:
setBaseUrl("http://localhost:8080/JavaNaWeb");
beginAt("/");
assertTitleEquals("Zápisky");
setTextField("j_username", uzivatel);
setTextField("j_password", heslo);
submit();
assertElementPresent("pridat-zapisek");
Nejprve nastavíme základní adresu aplikace, poté se přesuneme se do jejího kořene. Následuje kontrola titulku, vyplnění formulářů a odeslání. Nakonec zkontrolujeme zda se přihlášení vydařilo.
Teď už vytvoříme novou metodu s testem přidání a smazání zápisku:
@Test
public void novySmazatTest() {
assertElementPresent("pridat-zapisek");
setWorkingForm("pridat-zapisek");
setTextField("nadpis", "nadpisTest");
setTextField("obsah", "obsahTest");
submit();
assertTextPresent("nadpisTest");
assertTextPresent("obsahTest");
submit("", "Smazat");
assertTextNotPresent("nadpisTest");
assertTextNotPresent("obsahTest");
}
Nejprve zkontrolujeme, zda se nacházíme na stránce s výpisem zápisků. Dále nastavíme formulář pro práci, vyplníme textová pole a odešleme. Zkontrolujeme zda se nový zápisek nachází na stránce a následovně jej smažeme. Nakonec zkontrolujeme zda zápisek zmizel.
To je k našemu malému testu všechno, pro představu by to mělo stačit. Pokud chcete, můžete si vytvořit testy i na zbývající funkcionality aplikace.
Spuštění testu
Teď už zbývá jen vytvořený test spustit, protože jsme ale přidali do aplikace nové třídy a knihovny, musíme ji znovu sestavit, klikněte pravým tlačítkem na položku aplikace a zvolte Deploy. Z důvodu použití webového rozhraní v testu, je ještě potřeba spustit server. Přejděte do karty Services, rozklikněte položku Servers, klikněte pravým tlačítkem na Apache Tomcat a zvolte Start.
Pro spuštění testu existuje hned několik cest: Můžete z nabídky Run spustit všechny testy v projektu (Test Project) nebo pouze samotný test (Test File). Další možností je kliknout na položku projektu a zvolit Test či kliknout přímo na soubor testu a zvolit Test File. Spusťte tedy libovolným způsobem test WebTest.
V prostředí by se měl objevit nový blok Test Results s ohlášením o úspěšném provedení.
Každý test se otevře ve vlastní záložce. Na výpisu se nachází seznam všech testů ve třídě. Nad výpisem je zobrazena procentuální úspěšnost testu (pokud se podaří 1 ze 2 → 50 %). Tlačítky vlevo lze spustit testy znovu (všechny nebo pouze nezdařené).
Tip: Pokud chcete mít tlačítko pro spuštění testů po ruce, klikněte pravým tlačítkem na horní lištu s ikonami, zvolte Customize a přetáhněte do lišty tlačítka Test Project a Test File.
Závěr
To je pro dnešek vše. V příštím díle se budeme věnovat debuggování, logování, sledování protokolu a dalším věcem, které nám usnadní vývoj a nasazení aplikace.
Zdrojové kódy aplikace naleznete na GitHubu: https://github.com/PetrHoracek/JavaNaWeb
Verze pro tisk
|
Nejsou žádné diskuzní příspěvky u dané položky.
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|