Sikeres végrehajtás(pass): ez azt jelenti, hogy a teszt rendben lefutott, és az ellenőrzési feltételek mind teljesültek.



Hasonló dokumentumok
JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

public class HelloWorld extends TestCase { public void testmultiplication() { // Testing if 3*2=6: assertequals ("Multiplication", 6, 3*2);

JUnit.

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

A legalacsonyabb szintű tesztelés. A programot felépítő egységek tesztelése Unit: egy rendszer legkisebb önálló egységként tesztlehető része.

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Java és web programozás

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Programozási nyelvek Java

Segédanyag: Java alkalmazások gyakorlat

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22

Segédanyag: Java alkalmazások gyakorlat

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

Java programozási nyelv 6. rész Java a gyakorlatban

Szűgyi Zalán. Unit tesztek Java és C++ környezetben

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

WebService tesztelés. SOAPui Pro, GreenPepper és Confluence használatával. Verhás & Verhás Szoftver Manufaktúra KNOW-HOW

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

Osztályok. 4. gyakorlat

Programozási nyelvek II. JAVA

Java programozási nyelv 5. rész Osztályok III.

Programozási nyelvek Java

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Programozási technológia

Szoftvertechnológia alapjai Java előadások

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Java programozási nyelv 9. rész Kivételkezelés

Abstract osztályok és interface-ek. 7-dik gyakorlat

Java Programozás 11. Ea: MVC modell

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

JNDI - alapok. Java Naming and Directory Interface

Bevezetés a Python programozási nyelvbe

Modern unit és integrációs tesztelés

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozási nyelvek Java

Programozási nyelvek II. JAVA

Kivételkezelés, naplózás. Exception handling, logging

Java IX. telkezelés a Java-ban

Globális operátor overloading

Hardver és szoftver követelmények

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

QBE Édes Otthon lakásbiztosítás tarifáló webservice. Fejlesztői dokumentáció 1.0.2

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Java IX. telkezelés a Java-ban

Programozás I. 1. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Concurrency in Swing

Interfészek. PPT 2007/2008 tavasz.

OOP: Java 8.Gy: Abstract osztályok, interfészek

Programozási nyelvek II.: JAVA

Alap számológép alkalmazás

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Java programozási nyelv 4. rész Osztályok II.

Kivételek. A program végrehajtása során ritkán bekövetkező események Nem a fő végrehajtási ág ; logikailag alacsonyabbrendű feladat jelzése

Szoftvertechnológia alapjai Java előadások

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Programozási nyelvek Java

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

BME MOGI Gépészeti informatika 4.

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

Programozási technológia

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Bevezető. Servlet alapgondolatok

Java gyakorlat feladatai e s megolda sai ( )

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Informatikai Navigátor

Már megismert fogalmak áttekintése

Objektumorientált programozás C# nyelven

Java Programozás 3. Gy: Java GUI. Swing, AWT

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

7. K: JAVA alapok Konzultáció

Grafikus felületek a programozó szempontjából grafikus elemek absztrakt reprezentációja az egyes elemek tulajdonságait leíró adatstruktúrák.

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Delphi programozás I.

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Java I. A Java programozási nyelv

Operációs rendszerek gyak.

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

C++ programozási nyelv

Eclipse és Java teljesen kezdőknek Segédanyag

Programozási alapismeretek 4.

BME MOGI Gépészeti informatika 8.

A GeoEasy telepítése. Tartalomjegyzék. Hardver, szoftver igények. GeoEasy telepítése. GeoEasy V2.05+ Geodéziai Feldolgozó Program

A GeoEasy telepítése. Tartalomjegyzék. Hardver, szoftver igények. GeoEasy telepítése. GeoEasy V2.05 Geodéziai Feldolgozó Program

Angolul: Extreme Programming, röviden: XP Agilis módszertan. Más módszertanok bevált technikáinak extrém módú (nagyon jó) használata

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

3. Osztályok II. Programozás II

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

PHP5 Új generáció (2. rész)

A dokumentáció felépítése

OOP #14 (referencia-elv)

Átírás:

1 1. fejezet A JUnit tesztelési környezet A JUnit egy szabad forráskódú modultesztelő rendszer, amely Java programjaink automatikus teszteléséhez nyújt segítséget. A rendszer letölthető a http://junit.org webcímről, ahol további hasznos információkat is találhatunk a JUnit használatáról és általában a tesztelésről. A JUnit redszer használatával javíthatjuk programjaink minőségét, amivel hibakeresési időt takarítunk meg. 1.1. JUnit tesztek A JUnit tesztek a junit.framework.testcase leszármazottjai, és a tesztelendő kódot publikus testvalami() nevű metódusokban adjuk meg. (Valami tetszőleges azonosító lehet.) A teszt futása során az összes ilyen metódus futtatásra kerül, amelynek háromféle eredménye lehet: Sikeres végrehajtás(pass): ez azt jelenti, hogy a teszt rendben lefutott, és az ellenőrzési feltételek mind teljesültek. Sikertelen végrehajtás(failure): a teszt lefutott, de valamelyik ellenőrzési feltétel nem teljesült. Hiba(error): A teszt futása során valami komolyabb hiba merült fel, például egy Exception dobódott valamelyik tesztmetódus futása során, vagy nem volt tesztmetódus a megadott tesztosztályban. Az alábbiakban példákon keresztül mutatjuk be hogyan kell JUnit teszteket írni. 1.1.1. A legegyszerűbb teszt Az alábbi kis példa tesztprogram a java.util.hashtable isempty() metódusát teszteli egy üres hashtáblával: import junit.framework.testcase; import java.util.hashtable; /** Hashtable tesztelő osztály */ public class HashtableTest extends TestCase { /** Ellenőrzi, hogy egy újonnan készített Hashtable üres-e. */

2 FEJEZET 1. A JUNIT TESZTELÉSI KÖRNYEZET public void testemptyhashtable() { Hashtable ht = new Hashtable(); asserttrue(ht.isempty()); Az asserttrue metódus ellenőrzi, hogy a paraméterében megadott kifejezés igaz-e. Ha nem, akkor hibát jelez a tesztelési rendszernek. Az alábbi táblázat bemutatja, milyen egyéb ellenőrző metódusok állnak rendelkezésre JUnit tesztjeinkben: Metódus Leírás asserttrue(boolean) Ellenőrzi, hogy a paraméter igaz-e. assertfalse(boolean) Ellenőrzi, hogy a paraméter hamis-e. assertnull(object) Ellenőrzi, hogy a paraméter null-e. assertnotnull(object) Ellenőrzi, hogy a paraméter nem null. assertsame(object, Object) Ellenőrzi, hogy a két paraméter ugyanarra az objektumra mutat-e. assertnotsame(object, Object) Ellenőrzi, hogy a két paraméter különböző objektumra mutat-e. assertequals(int, int) Ellenőrzi, hogy a két paraméter egyenlő-e. (Az összes primitív típushoz létezik változata.) assertequals(double, double, double) Ellenőrzi, hogy a két double paraméter egyenlő-e a megadott tolerancián belül. (A tolerancia a harmadik double paraméter.) assertequals(object, Object) Ellenőrzi, hogy a két paraméter egyenlő-e. (Az equals() metódust használva.) fail() A tesztet azonnal sikertelenné teszi(megbuktatja). Az összes, assert-tel kezdődő nevű ellenőrző metódusnak van olyan változata is, amelynek az első paramétere egy hibaüzenet. Ezt a tesztelő környezet írja ki akkor, amikor a teszt megbukik (azaz nem teljesül a feltétel). Így a fenti assert sort a következőképpen is írhattuk volna: asserttrue("az új hashtábla nem üres!", ht.isempty()); 1.1.2. Több teszt egy tesztosztályban Egy tesztosztályba több tesztet is tehetünk. Ilyenkor hasznosak lehetnek a setup() és a teardown() metódusok, amelyek minden egyes tesztmetódus előtt és után lefutnak. Ezekben a tesztek által használt közös változókat lehet inicializálni, fájlokat megnyitni, lezárni, stb. A tesztmetódusok végrehajtási sorrendje nem garantált, így azok nem támaszkodhatnak egymás mellékhatására! Csak annyi biztos, hogy minden egyes teszt előtt lefut a setup(), utána pedig a teardown() metódus. Az alábbi teszt a korábbi bővített változata:

1.1. JUNIT TESZTEK 3 /** Hashtable tesztelő osztály */ public class HashtableTest extends TestCase { Hashtable ht; /** Kezdeti beállítások, minden egyes teszt előtt lefut. */ protected void setup() throws Exception { ht = new Hashtable(); /** Ellenőrzi, hogy egy újonnan készített Hashtable üres-e. */ public void testemptyhashtable() { asserttrue("az új hashtábla nem üres!", ht.isempty()); /** Ellenőrzi, hogy a táblába beszúrt és kivett elem azonos-e. */ public void testcontainskey() { String kulcs = "első kulcs"; String ertek = "első érték"; ht.put(kulcs, ertek); assertequals("a hashtáblába beszúrt érték nem azonos a kivett" " értékkel!", ertek, ht.get(kulcs)); 1.1.3. Tesztek összefűzése A junit.framework.testsuite osztály segítségével összetett teszteket is létrehozhatunk, a- melyek több tesztosztályt is egybefoghatnak. Ehhez egy suite() nevű gyártó metódust kell csak biztosítanunk: /** Példa összetett tesztek készítésére: */ public class OsszetettTeszt { /** Ez a gyártó metódus készíti el az összetett tesztet: */ public static TestSuite suite() { TestSuite suite = new TestSuite(); // Egyedi tesztmetódusok hozzáadása: suite.addtest(new HashtableTest("testContainsKey")); suite.addtest(new HashtableTest("testEmptyHashTable")); // Többszörösen összetett teszt: suite.addtest(masikteszt.suite()); // Tesztosztály összes metódusának hozzáadása: suite.addtestsuite(harmadikteszt.class);

4 FEJEZET 1. A JUNIT TESZTELÉSI KÖRNYEZET return suite; 1.1.4. Kivétel ellenőrzése Korábban említettük, hogy a teszt során kapott kivétel hibát jelez. De mit kell csinálni, ha azt szeretnénk tesztelni, hogy adott kód kivált-e valamilyen kivételt? Ezt a következőképpen tehetjük meg: /** Ellenőrzi, hogy null kulcs beszúrása esetén dobódik-e * NullPointerException kivétel. */ public void testnullkey() { try { ht.put(null, "érték a null kulcshoz"); catch (NullPointerException e) { return; fail("nem dobódott NullPointerException null kulcs esetén!"); 1.2. A tesztek futtatása A tesztek futtatására többféle lehetőségünk van: Használhatjuk a szöveges vagy valamelyik grafikus (awt vagy swing) futtatási felületet. Arra ügyelni kell, hogy a letöltött junit.jar szerepeljen a CLASSPATH-ban. 1.2.1. Szöveges felület A szöveges felület futtatása a parancssorból a következőképpen történhet: java junit.textui.testrunner <Tesztosztály neve> Sikeres teszt esetén az OK üzenetet kapjuk: $ java junit.textui.testrunner tests.osszetettteszt... Time: 0 OK (6 tests) Hiba esetén pedig a sikertelen vagy hibás tesztek üzeneteiről kapunk értesítést, hasonló formátumban mint ahogyan a le nem kezelt kivételek jelennek meg: $ java junit.textui.testrunner tests.osszetettteszt...e.f.f Time: 0 There was 1 error: 1) testexception(tests.failtest)java.lang.nullpointerexception at tests.failtest.testexception(failtest.java:16) at sun.reflect.nativemethodaccessorimpl.invoke0(native Method)

1.2. A TESZTEK FUTTATÁSA 5 at sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:39) at sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25) There were 2 failures: 1) testsimplyfail(tests.failtest)junit.framework.assertionfailederror: i!= j at tests.failtest.testsimplyfail(failtest.java:20) at sun.reflect.nativemethodaccessorimpl.invoke0(native Method) at sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:39) at sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25) 2) testasserttrue(tests.failtest)junit.framework.assertionfailederror: Kivett érték!= betett érték at tests.failtest.testasserttrue(failtest.java:24) at sun.reflect.nativemethodaccessorimpl.invoke0(native Method) at sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:39) at sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25) FAILURES!!! 1.2.2. Grafikus felület A grafikus futtató környezet esetén választhatunk a swing és awt verziók között. A swing verzió több funkcionalitást tartalmaz, ezért inkább annak a használatát javasoljuk. A futtatást a következő paranccsal indíthatjuk: java junit.swingui.testrunner <Tesztosztály neve> illetve java junit.awtui.testrunner <Tesztosztály neve> 1.1. ábra. A JUnit swing felülete sikeres teszttel. A grafikus felületen az ablak tetején megválaszthatjuk a futtatandó tesztosztályt (amennyiben a paraméterben megadott nem megfelelő), ez alatt egy jól látható színes csík jelöli a teljes teszt eredményét:

6 FEJEZET 1. A JUNIT TESZTELÉSI KÖRNYEZET 1.2. ábra. A JUnit swing felülete egy sikertelen összetett teszttel. Képünkön a középső doboz a teljes teszthierarchiát tartalmazza, de lehetőség van csak a sikertelen tesztek megjelenítésére is. Sikeres futás esetén a csík színe zöldre vált. Hiba vagy sikertelen futás esetén a csík színe pirosra vált. Ilyenkor a csík alatti dobozban a hibás és sikertelen tesztmetódusok nevei jelennek meg. A sikertelenség okának részleteit pedig a legalsó doboz tartalmazza. 1.2.3. Futtatás API-ból Mivel a JUnit rendszer maga is Java-ban íródott, egyszerűen beépíthetünk egy kényelmi main metódust a tesztjeinkbe: public void main(string[] args) { junit.textui.testrunner.run(new TestSuite(OsszetettTeszt.class)); Így a futtatást egyszerűen a következőképpen letudjuk: java tests.osszetettteszt A fenti lehetőségeken kívül a legtöbb fejlesztői környezet is támogatja JUnit tesztek futtatását és debuggolását.

1.3. TIPPEK ÉS TRÜKKÖK 7 1.3. Tippek és trükkök Az alábbiakban összegyűjtöttünk néhány ajánlást, amely a JUnit tesztelés eredményességét növeli és megkönnyíti használatát. 1.3.1. Tesztelés mint minőségbiztosítási rendszer Egy alapos tesztrendszer mindig pontos képet ad arról, milyen állapotban van a programunk. Így például segít annak a tervezésében is, hogy mikor adhatunk ki új verziót. Egy ilyen rendszerrel a háttérben bátrabban állhatunk neki nagyobb kódátszervezési feladatoknak is, hiszen ha a végén a teszt lefut, akkor biztosak lehetünk benne, hogy nem rontottunk el semmit. A tesztek mintegy minőségi tanúsítványt is jelentenek. Tesztek írása időt takarít meg, mégpedig hibakereséssel és -javítással töltött időt. Ha egy hibajelentés érkezik a programról, érdemes az új hibát bevenni a tesztrendszerbe. Ezzel biztosíthatjuk, hogy ugyanaz a hiba nem kerül ismét vissza a programba. 1.3.2. Egy kis tesztelés egy kis programozás A tesztek írását érdemes párhuzamosan végezni a programok írásával. Így a munka nem olyan egysíkú, és hatékonyabban megy mindkettő munkafolyamat. A tesztjeinket mindig tartsuk 100%-ig szinkronban a tesztelendő kóddal! Ha a tesztek nem az aktuális, hanem a két héttel ezelőtti verziót tesztelik, akkor nem sokat érnek. Érdemes rendszeres időközönként (pl. minden éjjel automatikusan) lefuttatni a teszteket. Az Extrém Programozási módszertan (extreme programmming XP) nagy hangsúlyt fektet a programok tesztelésére. Eszerint a teszteket a programok előtt kell megírni, ezzel mintegy specifikálva a feladatot. 1.3.3. A JUnit rendszer egyszerűsége növeli a hatékonyságot A JUnit rendszer egyszerűsége miatt hatékonyan írhatunk és futtathatunk teszteket. A tesztrendszer rögtön környezetet teremt a tesztelendő kód számára, így egyből a funkcionalitásra koncentrálhatunk. A JUnit tesztek automatikusak: nem kell kézzel összehasonlítani a kapott és a várt eredményeket, a tesztek futtatása után azonnal megkapjuk a választ, hogy a programunk jó-e vagy sem. A JUnit tesztek csoportosíthatósága miatt könnyű egybefogni egy nagyobb programrendszer összes tesztjét, és azokat egyszerre futtatni. Ugyanakkor a teszthierarchia egyes részei egyenként is futtathatók. Sokszor a teszteket ugyanolyan csomaghierarchiában tárolják mint a tesztelendő osztályokat. Ez abból a szempontból hasznos, hogy így az osztályok csomagszintű láthatósággal rendelkező tagjai is közvetlenül tesztelhetők.

8 FEJEZET 1. A JUNIT TESZTELÉSI KÖRNYEZET 1.3.4. Speciális tesztelési feladatok Sajnos sok hasznos tulajdonsága ellenére a JUnit rendszer nem minden tesztelési feladatra alkalmas. A JUnit honlapján(http://www.junit.org) számos kiterjesztése is elérhető. Említésre méltó az Abbot 1 GUI tesztelési felület, amellyel swing vagy awt grafikus felületeinket lehet tesztelni. A teszt egy előre rögzített eseménysorozatot hajt végre a grafikus felületen, és közben ellenőrzéseket végez. A rendszer tartalmaz egy forgatókönyvszerkesztőt, amivel a programunkon végzett egér- és billentyűzeteseményeket tudjuk rögzíteni egy forgatókönyvbe, majd azokat módosítani, ellenőrzéseket szúrni közéjük, stb. A JUnit további kiterjesztései lehetőséget adnak párhuzamos programok, programhatékonyság (sebesség), J2EE és JSP(Java Server Pages) programok tesztelésére is. 1 http://abbot.sourceforge.net/