A szoftvertesztelés fontossága, formái, eredménye, unit tesztelés a gyakorlatban



Hasonló dokumentumok
Miskolci Egyetem Általános Informatikai Tanszék

A tesztelés feladata. Verifikáció

Dialízis gép software komponensét alkotó unitok modul tesztje követelmény és struktúra alapon

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

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

Verifikáció és validáció Általános bevezető

Miskolci Egyetem Alkalmazott Informatikai Intézeti Tanszék A minőségbiztosítás informatikája. Készítette: Urbán Norbert

Rubin SPIRIT TEST. Rubin firmware-ek és hardverek tesztelése esettanulmány V1.0. Készítette: Hajnali Krisztián Jóváhagyta: Varga József

cím: 6725 Szeged Bokor u. 18. telefon: Innomedio Kft Scrum módszertan 1.0 Verzió Érvényes: április 1-től

MŰSZAKI TESZTTERVEZÉSI TECHNIKÁK A TESZT FEJLESZTÉSI FOLYAMATA A TESZTTERVEZÉSI TECHNIKÁK KATEGÓRIÁI

Szoftverminőségbiztosítás

Feladat. Bemenő adatok. Bemenő adatfájlok elvárt formája. Berezvai Dániel 1. beadandó/4. feladat április 13. Például (bemenet/pelda.

Név: Neptun kód: Pontszám:

Kulcs Számla frissítés

Szkriptnyelvek. 1. UNIX shell

Szoftverminőségbiztosítás

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

OO rendszerek jellemzői

ÁNYK53. Az Általános nyomtatványkitöltő (ÁNYK), a személyi jövedelemadó (SZJA) bevallás és kitöltési útmutató együttes telepítése

Integrációs mellékhatások és gyógymódok a felhőben. Géczy Viktor Üzletfejlesztési igazgató

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

Követelmény alapú minőségbiztosítás az államigazgatásban

Webes alkalmazások fejlesztése

Orvosi készülékekben használható modern fejlesztési technológiák lehetőségeinek vizsgálata

"Eseményekre imm/connection Server scriptek futtatása

Mesterséges intelligencia alapú regressziós tesztelés

Bár a szoftverleltárt elsősorban magamnak készítettem, de ha már itt van, miért is ne használhatná más is.

ESZKÖZTÁMOGATÁS A TESZTELÉSBEN

Integráci. ciós s tesztek. ciós s tesztek (folyt.) Integration Level Testing (ILT) Ficsor Lajos. Miskolci Egyetem Általános Informatikai Tanszék

Rubin SPIRIT TEST. Domino net provisioning tesztelése esettanulmány 1.0. Készítette: Dobó Arnold Jóváhagyta: Varga József. Rubin Informatikai Zrt.

C programozási nyelv

Operációs rendszerek. Az NT folyamatok kezelése

Intelligens eszközök fejlesztése az ipari automatizálásban Evosoft Hungary kft., Evosoft Hungary Kft.

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

Kormányzati Elektronikus Aláíró és Aláírás-ellenőrző Szoftver

Autóipari beágyazott rendszerek. Komponens és rendszer integráció

Viczián István IP Systems JUM XIX szeptember 18.

GPRS Remote. GPRS alapú android applikáció távvezérléshez. Kezelési útmutató

Programrendszerek tanúsítása szoftverminőség mérése

Történet. Számítógépes vírusok. Mik a vírusok? A vírusok felépítése

Iman 3.0 szoftverdokumentáció

IRC beüzemelése Mach3-hoz IRC Frekvenciaváltó vezérlő áramkör Inverter Remote Controller

DAT adatcserefájl AutoCAD MAP DWG mapobject konvertáló program dokumentáció

Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1

1. Origin telepítése. A telepítő első képernyőjén kattintson a Next gombra:

Kameleon Light Bootloader használati útmutató

Megoldások a mintavizsga kérdések a VIMIAC04 tárgy ellenőrzési technikák részéhez kapcsolódóan (2017. május)

Szimuláció RICHARD M. KARP és AVI WIGDERSON. (Készítette: Domoszlai László)

Szoftvertesztelés - Bevezető

Szilipet programok telepítése Hálózatos (kliens/szerver) telepítés Windows 7 operációs rendszer alatt

Erdő generálása a BVEPreproc programmal

Sú gó az ASIR/PA IR Públikús felú lethez

A hazai alállomási irányítástechnika kezdete. Szakmai félnap a debreceni alállomási irányítástechnika üzembehelyezésének 20. évfordulója alkalmából

Hardver és szoftver követelmények

S z á m í t ó g é p e s a l a p i s m e r e t e k

DuneHD.hu. Kompatibilis médialejátszók: Dune HD Center Dune BD Prime Dune HD Base 2.0 Dune HD Base 3.0 Dune BD Prime 3.0

Elektronikusan hitelesített PDF dokumentumok ellenőrzése

Laborsegédlet 3. Labor

Használati alapú és modell alapú tesztelés kombinálása szolgáltatásorientált architektúrák teszteléséhez az ipari gyakorlatban

Írásjogtól Rootig AIX-on

Jelentkezési lap képző szervek részére

TESZTMENEDZSMENT TESZTELŐ SZERVEZET TESZTTERVEZÉS ÉS BECSLÉS

InCash számlázó program és a Webshop Hun rendszer összekötése

Hogyan váljunk profi felhasználóvá 80 nap alatt, vagy még gyorsabban? Ingyenes tanfolyam.

MŰSZAKI TESZTTERVEZÉSI TECHNIKÁK STRUKTÚRA ALAPÚ, VAGY FEHÉRDOBOZ TECHNIKÁK TAPASZTALAT ALAPÚ TECHNIKÁK

Infocentrum Számlázó hálózatos verzió + Firebird Adatbázismotor

A WebEye Comlink v (84) és a WebEye Connect v (84) kapcsolata Rövid felhasználói útmutató

ÜGYFÉL OLDALI BEÁLLÍTÁSOK KÉZIKÖNYVE

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét

LabVIEW példák és bemutatók KÉSZÍTETTE: DR. FÜVESI VIKTOR


Csoportos üzenetszórás optimalizálása klaszter rendszerekben

MIÉRT KELL TESZTELNI?

Bevezetés: Mi a CRM? A tervezési fázis helye és szerepe a CRM implementációs projektekben Jógyakorlatok: mire figyeljünk a CRM tervezés közben.

A TESZTELÉS ALAPJAI A TESZTELÉS ALAPVETŐ FOLYAMATA A TESZTELÉS PSZICHOLÓGIÁJA A TESZTELÉS ETIKAI KÓDEXE

Tanári óratartás nyilvántartása a ZMNE-n

Szoftverminőségbiztosítás

A rendszer célja. Funkciók

Automatikus tesztgenerálás modell ellenőrző segítségével

Marketing szolgáltatás tájékoztató

Programozási alapismeretek 4.

Az internet az egész világot behálózó számítógép-hálózat.

Dr. Schuster György október 14.

Ami a vízesésen túl van

Tájékoztató a T2S piaci tesztek lebonyolításáról (2016. december 1-16.)

SystemDiagnostics. Magyar

A csõdelõrejelzés és a nem fizetési valószínûség számításának módszertani kérdéseirõl

Teszt terv Új funkció implementációja meglévı alkalmazásba

Procontrol Device Detector. Felhasználói leírás

M-Fájlok létrehozása MATLAB-ban

Norway Grants. Az akkumulátor mikromenedzsment szabályozás - BMMR - fejlesztés technológiai és műszaki újdonságai. Kakuk Zoltán, Vision 95 Kft.

Mezo gazdasa gi fordı tott a fa mu ko de se

Felhasználói segédlet

Használati utasítás.

Dr. Mileff Péter

KARAKTERFELISMERÉS AZ EVASYS-BEN

3. ZH-ban a minimum pontszám 15

Átírás:

A szoftvertesztelés fontossága, formái, eredménye, unit tesztelés a gyakorlatban Szerző: Dobó Ferenc Kelt: 2014. Augusztus

I.) A szoftvertesztelés fontossága, bevezetése A szoftvertesztelés fontos, szinte elengedhetetlen része a szoftverfejlesztésnek és tagadhatatlan alkotóeleme a szoftver megbízhatóságának és az erőforrások optimalizálásának. Elméletben lehetséges volna, kellő körültekintéssel, tökéletes programot írni, akár az első próbálkozásra. Ám ez a gyakorlatban lehetetlen, hiszen a programok fejlesztői emberek, ráadásul a környezet, a bevitt adatok, sőt akár az elvárt működés is változhat a fejlesztés közben, így a program változása, változtatásai során keletkezett különbségek is generálhatnak problémás működést, még ha az emberi tényezőt nem is vesszük figyelembe. Tehát biztosan állíthatjuk, hogy a szoftver tesztelésére szükség van. De a fejlesztés melyik részén célszerű bevonni a tesztelés faktorát? A válasz a rendelkezésre álló financiális keret és munkaerő függvénye is, ám a legköltséghatékonyabb megoldás a már tervezés szintjén való megfogalmazása a teszteseteknek. Ha a követelmények alapján építjük fel a teszteket, akkor biztosak lehetünk a tesztek pontosságán, fontosságán. Ám ezeket a teszteket a program változtatásaival együtt kell módosítanunk is. Ami az adott változtatásoktól függően körülményes lehet, vagy akár az egész teszt könyvtár újraírását eredményezheti. Mindenképpen javallott viszont a módszer, ami manapság elterjedt is, hogy amint létrejön futtatható állomány a program fejlesztése során, azt már teszteljük. Erre azért van szükség, mert tudhatjuk, hogy fejlesztés közben folyamatosan működő programot állítunk elő, illetve, ha hibát találunk, azt korábban javítva egyszerűbben, gyorsabban, kevesebb pénz és energia befektetéssel lehet elérni. Hiszen mikor építkezünk is, ha az alapot rosszul rakjuk le, a rá épülő házat is egészen vissza kell bontani, ha az alapot újra akarjuk rakni. Ehhez hasonlóan a program alapját alkotó részeket, ha megváltoztatjuk, lehet, hogy az összes rá épülő modulon módosítanunk kell. A folyamatosan bővülő program tesztelése tehát biztosíthat minket arról, hogy működő programot adunk ki a kezünkből. Viszont a nem implicit módon tesztelhető tulajdonságok is problémát jelenthetnek a későbbiekben, mint például a program tesztelhetősége, terhelhetősége illetve, hogy egyáltalán az igényeknek megfelelő programot fejlesztünk-e. Ezeknek a kiküszöbölése miatt érdemes a tervezés szintjén elkezdeni a tesztelést, ami ezeknek a figyelembe vételét is jelentheti. II.) A regressziós tesztelés Ahogy fejlődik a program, többfajta tesztelési metódusnak vethetjük alá. Az egyik legegyszerűbb tesztelési forma, amit már a fejlesztés elején gyakorolni lehet a regressziós tesztelés. A regressziós tesztelés lényege, hogy a programot ugyanazon teszteknek vetjük alá meghatározott időszakonként. Ebből adódóan megbizonyosodhatunk arról, hogy a program továbbra is képes ellátni azokat a feladatokat amiket korábban, illetve az alkalmazott változtatások nem rontották el a program funkcionalitását. Mivel szinte folyamatos tesztelés alatt áll a fejlesztett program, a tesztek futtatásának sűrűségétől függően, hamar észrevehetjük a hibás működést. Amennyiben ez jelentkezik a hiba javítását gyorsan meg lehet kezdeni, ezzel minimalizálva a javítás költségét. A regressziós tesztek hátránya, hogy a program bővítése folyamán újabb teszteket kell írni, amiket hozzáadva a futtatandó tesztek listájához, növeljük azt az időt, ami alatt a regressziós tesztek lefutnak. A túl sok időkiesést elkerülendő azok a fejlesztők, akik megtehetik, erre dedikált szervereket állíthatnak fel, amiken folyamatosan futhatnak a regressziós tesztek. Viszont ezeknek az automatizálása is kihívás, de csak egyszeri befektetést jelent. Míg nem automatizálva havi kiadást, fizetés formájában a munkaerőnek. A regressziós tesztelés viszonylag különleges helyen áll, hiszen a program legelső működőképes verziójától egészen a kiadásig, vagy akár utána is jelen lehet. A tesztelés többi részére ez nem igazán jellemző.

III.) A tesztelési fázisok A tesztelés fázisai általában a következők: részegység teszt (unit teszt), modul teszt, alrendszer tesz, rendszer teszt, elfogadási teszt. Ezeknek a tesztelési mennyiségét akár egymásra épülve egy piramis formájában lehetne a legegyszerűbben ábrázolni. A unit teszt lényege, hogy az implementáció során elkészült egységek önmagukban helyesen működnek-e. Bár ez úgy tűnhet, hogy elegendő feltétel lenne egy program jól működésének, sajnos nem az. Ha házat építenénk, ez lenne az a fázis, ahol megnézzük, hogy minden tégla, amit vettünk (készítettünk), képes-e betölteni a feladatát. Az, hogy jó építőanyagot használunk elengedhetetlen, de szükséges az is, hogy ezek megfelelően legyenek egymásba ágyazva. A unit teszteléskor fontos, hogy minél szélesebb választékban használjunk változó típusokat, és értékeket, főleg a szélső értékekre koncentrálva. Ha van jó tesztesetünk normális értékekre és szélső értékekre is, akkor elvárható, hogy a program minden normál értékre jól működik. Modul tesztelés során az egymásra épülő, magukban még jól működő egységeket tesztelünk. Például egy, vagy több együttműködő osztály. Ilyenkor vizsgálható, hogy az egységek közötti kommunikáció jól működik-e. A következő lépcső az alrendszer teszt. A nagyobb rendszerű programok esetén elkülöníthetünk különböző alrendszereket, melyek modulokból állnak. Ezeknek a tesztelése szintén a megfelelő kommunikációt célozza meg prioritásként. Rendszer tesztelés során is a kommunikáció vizsgálata egy fontos szempont, emellett pedig megnézhetjük, hogy a fejlesztett rendszer megfelel-e a támasztott funkcionális, vagy nem funkcionális követelményeknek. Az utolsó teszt az elfogadási teszt, melyet már nem szimulációban végzünk, hanem a valós programot futtatjuk valós környezetben. Erre javasolt egy valós potenciális felhasználót használni, hisz ilyenkor derülhet ki, hogy a program nem felel meg a követelményeknek, vagy a követelmények felállításakor nem vettünk mindent figyelembe, vagy a hatékonyság, teljesítmény nem felel meg az általános felhasználó által fenntartott elvárásoknak. Ezt a tesztelési fázist szokásos alfa tesztelésnek is nevezni. Ennek egy nagyobb körben történő, főleg piaci termékek esetében bevezetett, elterjedt fajtája a béta tesztelés, melynek során a kiadó egy korlátolt csoportnak hozzáférést biztosít a még ki nem adott programhoz, akik cserében használják, ezáltal tesztelik a programot, és ha hibát találnak, akkor azt jelzik a fejlesztők felé. IV.) A unit tesztelés bemutatása gyakorlati példán keresztül Az én feladatom a Bbraun cégnél a szoftverfejlesztésben a unit tesztek helyes működésének ellenőrzése, új tesztesetek írása, illetve ha szükség volt rá, teljesen új unitok tesztelése, és az azokhoz tartozó tesztkörnyezet beállítása, felépítésének apróbb módosítása volt. Mivel a tesztelés nem az egész programot érintette, hanem mindig csak egy-egy önmagában működő unitot, szükséges egy olyan környezet bevezetése, mely szimulálja az adott unit beágyazódását a szoftver egészébe. A különböző programrészek azonosítása (unitok) egyedi processz ID-k megadásával volt lehetséges, így az adott unitok különböző processzekként futottak. A processz ID-k, amik változóak voltak mindig egy bizonyos processz névhez tartoztak, ami konstansként, a kódban volt definiálva az egyes unitokhoz. Ezek a nevek alapján tudtak tehát kommunikálni a unitok egymással. Ezek tudatában már könnyen levezethetővé válik, hogy a tesztkörnyezet ezeknek a neveknek a használatával stubokat (temporális, a teszteléshez szükséges változókat) hoz létre, úgynevezett dummy taszkok formájában. A dummy taszkok a tesztelt taszk nézőpontjából megegyeztek a hozzájuk kapcsolódni igazi taszkokkal, ám valójában csak egy csatornaként működnek, amik az információkat egyenesen továbbítják a tesztkörnyezetet vezérlő taszkhoz (test organizer). A test organizer pedig a bejövő adatokra, az eredeti taszkokat szimuláló, akciót hajt végre, ezzel becsapva a tesztelendő taszkot. A test organizer további feladata a bejövő adatok rögzítése és a tesztesetek futtatása. Hogy lehetséges tehát a tesztesetek írása? Nos, ha egy teljesen teszteletlen taszkot veszünk alapul, akkor definiálnunk kell néhány dolgot, amiknek bemutatásával érthetőbbé válik az egész folyamat. Tegyük fel, hogy van egy unit, amihez tartozik két másik, amikkel kommunikálni szokott, illetve ír a

közös memóriába is.(common memory, CM) Ahhoz, hogy ezt a unitot a test organizer tesztelni tudja, meg kell adnunk: 1) az adott unit nevét; 2) a hozzá tartozó unitok nevét, illetve azt, hogy azok dummy ként legyenek inicializálva; 3) a kimenő adatok helyét; 4) az inklúdálandó fájlok elérési útját; 5) a tesztesetek elérési útját. Ezeknek az adatoknak a definiálása konfigurációs (cfg) fájlokban történik, melyeket minden taszkhoz külön meg kell írnunk. A konfigurációs fájlok elérését pedig egy listában adjuk meg, aminek az elérési útját paraméterként adjuk meg egy perl scriptnek, amit mi ténylegesen futtatunk. A perl script kiolvassa a listát és a benne levő elérési út alapján megkeresi a különböző konfigurációs (cfg) fájlokat, majd mindhez létrehozza a megfelelő könyvtárat (kimenet), valamint legenerálja a test organizert, a dummy taszkokat, valamint az eredeti taszkot és a hozzá tartozó include fájlokat is lefordítja, és futtatja. A test organizer a megadott teszteseteket kezdi el futtatni, amiknek a szokásos felépítését a továbbiak jellemzik. Először mindig egy inicializáló c állomány futtatódik, aminek a lényege a különböző taszkok, dummy taszkok processz ID-jának a hozzákapcsolása, beazonosítása, hogy össze tudjuk kapcsolni a dummy taszkokat a test organizerrel. Aztán az ezekhez tartozó különböző üzenetváltási formákhoz kapcsolódó üzenet fajták változóinak inicializálása. Ezt követően pedig megkezdődhet a taszk tesztelése a már teljesen taszktól függő tesztesetek alapján. Azok a taszkok melyekkel nekem kellett foglalkozni tartalmaztak egy igen érdekes kis változtatást, melyeket csak a tesztelésnél lehetett figyelembe venni. Alapjában véve minden taszknak van egy ciklusa melyben folyamatosan fut. A ciklust időszakosan triggerelni kell, azaz kell jelezni a taszknak, hogy futhat a ciklusában. Ez általában 250ms ként szokott megtörténni, egy természetes timer által, aminek a feladata, hogy a taszkokat triggerelje. Ám tesztelés során nem lehet figyelemmel követni ha a taszkok ilyen gyorsan fordulnak le, ezért meg kellett valósítani azt, hogy ezt a timert is stubként helyettesítjük. Ennek a megvalósítása hasonló módon történik, mint a dummy taszkok létrehozása. Viszont ami érdekes, hogy a taszkban mindkét timernek definiálva kell lennie ami bonyodalmakat okoz, hisz nem várhat egyszerre két timertől jelzést a taszk, mert az összekuszálná a taszk működését. Annak érdekében, hogy ez ne történjen meg, a taszkban preprocesszor segítségével #define-t, illetve #ifdefet használva választjuk el a különböző timerek inicializálását. Azt, hogy mi van definiálva és mi nem, az még a taszk lefordításánál dől el, amit különböző paraméterek megadásával érhetünk el a perl script futtatásakor. Miután lefutott a tesztelés, a test organizer kitöröl egy.lock fájlt, aminek a létezésének megszüntetésével lehet megszakítani a teszteket. Akár akkor is, amikor a teszt rosszul futása miatt egy végtelen ciklusba kerülnénk. Amint megszűnik ez a fájl, a script elkezdi feldolgozni, majd kitörölni a nyersnek mondható fájlokat amik a tesztelés során létrejöttek. Ebben a folyamatban létrehoz HTML és java script fájlokat, amik megnyitásával egyszerűen és átláthatóan tájékozódhatunk arról, hogy mi is folyt le a tesztelés közben. Láthatjuk azt benne, hogy ki milyen üzenetet váltott és kivel. Ennek a lényege, hogy meglássuk, hogy a taszk valóban úgy működik-e ahogyan azt eltervezték. Azt is láthatjuk ha az üzenetek nem jöttek meg, vagy olyan üzenetet kaptunk, amire nem számítottunk. Kiolvashatjuk még a CM aktuális állapotát az adott üzenetváltás előtt és után, tehát tisztában lehetünk azzal, hogy milyen változtatások mentek végben a közös memóriában. Mivel vannak beállított elvárt értékek, a HTML fájlból az is szépen látszik, hogy az éppen aktuális értékek megegyeznek-e a tesztesetben beállított elvárt értékekkel. Ha minden olyan, mint ahogy azt a beállított elvárásokban feljegyeztük akkor azt zölddel jelöli a java script, ellenkező esetben a piros az a szín amit láthatunk. Ezeken a HTML fájlokon kívül létrejönnek coverage, azaz lefedettséget ábrázoló fájlok is. Melyekből megtudhatjuk, hogy a taszk milyen működést is hajtott végre. Láthatjuk, hogy melyik sorokra, és hányszor futott rá, illetve, hogy mikor melyik elágazás hajtódott végre. A coverage fájl még tartalmaz pusztán statisztikai, százalékos értékeket is, melyeken látni lehet, hogy mennyi sor kód az, amire ráfutott a program, illetve, hány százalékos az elágazások lefedettsége. A minél nagyobb mértékű lefedettség jobb bizonyosságot ad arról, hogy a programunk jól működik. Hiszen minél több elágazásról tudjuk megállapítani, hogy megbízható, annál kisebb a lehetősége, hogy a programunk ki fog fagyni.

V.) Elsajátított kompetenciák, személyes konklúzió Ittlétem során nagyon sokat foglalkoztam a teszteléssel, azzal, hogyan kell minél kevesebb kódból álló, jól működő teszteseteket összehozni, lényegre törően de eredményesen. Valamit sokat fejlődött a kódolvasási készségem is, hiszen a tesztelések mindegyike white-box módon folyt, tehát a feladataim közé tartozott az is, hogy megismerjem az itteni szoftver működését, és minél inkább belelássak a fejlesztés különböző lépéseibe. Ezen túl még megismerkedtem a scrum fejlesztési stílussal is, ami egy agilis szoftverfejlesztési metódus, aminek lényege, hogy a fejlesztői csoport mindig készen áll arra, hogy a program elvárt működése az igények változásával fejlődjön, illetve hasonló módon, megváltozzon. Ez a fejlesztési forma sok kommunikációt és együtt működést igényel. Tesztelés szempontjából pedig sokszor a tesztesetek módosítását, vagy akár újraírását jelentheti. Mivel egy hatalmas csapatként folyik a munka a kódon, naponta többször változtatások lépnek fel, amiknek a lokális gépen való frissítését az SVN rendszerrel oldották meg, így azzal is meg kellett ismerkednem. Az svn rendszer az egyéni felhasználó által bevezetett módosításokat egy közös szerverre viszi fel, ahonnan aztán mindenkinek elérhetővé válik. Előnye, hogy könnyen összehasonlíthatjuk a lokális kódunkat avval amit feltöltöttek (bekommitáltak), illetve a kódot vissza is tudjuk állítani egy korábbi verzióra, mert az is fenn van a szerveren. Mindent összevetve nagyon örülök annak, hogy itt dolgozhattam, és hogy ez lehetett az első a valódinak mondható munkaélményeim közül. Sokat tanultam és úgy érzem kellemesen fogadtak a kollégák és nagyon segítőkészek, türelmesek voltak velem, mint egyénnel és gyakornokkal. VI.) Források http://en.wikipedia.org/wiki/software_testing http://www.inf.unideb.hu/kmitt/konvkmitt/szoftverteszteles/book.xml.html http://codeguide.hu/2013/03/18/hogyan-teszteljuk-programunkat-szoftverteszteles-alapok/ http://users.iit.uni-miskolc.hu/ficsor/inftervseg/swteszteles/