Szoftverminőség

A tesztelés célja a szoftverfejlesztésben a szoftver minőségének biztosítása. Ennek megfelelően a tesztelés módszertanának is elsődleges célja a szoftver minőség biztosításának segítése. Olyan tesztelési módszertant kell követni a szoftver élettartama, tehát a fejlesztése, bevezetése és üzemeltetése során, amelyik elősegíti, hogy az egyéb, a szoftverminőséget segítő eszközökkel együtt garantálni lehessen a szoftver jó minőségét, használhatóságát, hogy a szoftver segítsen az alkalmazó cégnek vagy intézménynek a céljai elérésében.

A szoftver minősége akkor jó, ha a szoftver képes a célját betölteni, és ennek megfelelően a szoftvert alkalmazó intézmény, vállalat intézményi, üzleti céljait a szoftvertől elvárt mértékben képes segíteni. Ez a minőségdefiníció egyrészről rendkívül általános, másrészről viszont pontosan meghatározza azt az értéket, amelyet a szoftvernek kell előállítani. Az általánosság miatt a fenti definíció direkt módon ugyan nem használható a tesztelések tervezése és módszertan kialakítása során, de minden más definíciónak, amely vagy amelyek a szoftver minőséget határozzák meg valamilyen aspektus szerint, összhangban kell lennie a fenti definícióval. Minden olyan kérdés, amelyik a szoftverminőséggel kapcsolatban felmerül akár konkrét, akár általános módszertani szinten olyan választ kell, hogy kapjon, amelyik a szoftverminőség általános definíciója szerinti szoftver használati cél elérését segíti.

Az általános definíció szerinti szoftverminőség ugyanazon szoftver esetében más és más lehet különböző felhasználóknál, különböző elvárások és szoftverhasználati célok esetében. Ha alacsony a szoftverrel szembeni elvárás, vagy más célra akarják használni a szoftvert akkor a minőség megítélése is más lesz. Ennek megfelelően a projektek során a szoftverhasználat céljait kell először definiálni, majd pedig azt, hogy milyen módon kell a projekt során ezen célok elérését mérni, tesztelni.

A szoftverminőség értékelésére vonatkozó általánosan elfogadott nemzetközi szabvány az ISO 9126. A szabvány célja, hogy a szoftverfejlesztési projektek során általánosan ismert emberi hibákból adódó minőségi hibákat segítsen felismerni, és kiküszöbölni. A szabvány a szoftverminőségre is egy modellel szolgál, amely modell hat kategóriára, és azon belül számos alkategóriára osztja azokat a tulajdonságokat, amelyeket figyelembe kell vagy lehet venni a szoftverminőség értékelése, és így a tesztel tervezése , végrehajtása és kiértékelése során.

Funkcionalitás

A funkcionalitás olyan tulajdonságok halmaza, amelyek a szoftver működésének funkcióival kapcsolatosak, és amelyek szükségesek a szoftverrel szemben támasztott működési igények kielégítésére. A funkcionalitás témakörébe tartozó fogalmak.

Megbízhatóság

A megbízhatóság fogalma arról szól, hogy a szoftver mennyire stabilan működik, és milyen szinten adja azt a teljesítményt (beleértve a funkcionalitást), amelyik megfelel az elvárásoknak. A megbízhatóságot szokás mérni (tesztelni) mérési időszakra (beégetési tesztek), vagy speciális feltételek között (sokk teszt). A megbízhatóság témakörébe tartozó fogalmak a

Használhatóság

A használhatóság arra jellemző, hogy a rendszert mennyire könnyű használni, mennyi energiát kell a használónak belefektetni a rendszer használatába. A használhatóság alacsony szintje nem csak a használati költségeket növeli, hanem egy bizonyos szint alatt növeli a hiba lehetőségeket, és így kihathat a szoftveralkalmazás biztonságára, és megfelelőségére is. A használhatóság témakörébe olyan fogalmak tartoznak, mint a

Hatékonyság

A hatékonyság a rendszer által nyújtott teljesítmény, és az eközben felhasznált erőforrások közötti arányt határozza meg. A hatékonyságot olyan erőforrások mentén érdemes megvizsgálni, amelyek költsége szignifikáns, és amelyek gazdasági és/vagy műszaki okok miatt korlátozottak. Így tipikusan a háttértárak mérete, memória és processzor használat, de ebbe a témakörbe tartozhatnak olyan erőforrások is, mint üzemeltető személyzettől igényelt karbantartási munkák mennyisége. A hatékonyság vizsgálata során két területet kell mindenképpen vizsgálni.

Az időszükséglet vizsgálata azért különül el a többi erőforrás felhasználásától, mert az idő, mint erőforrás speciális. Míg diszk terület, memória és processzorkapacitás bővítése elvileg lehetséges az időnél ez nem képzelhető el. Tipikusan például offline, tehát nem üzem közbeni mentési folyamatoknak üzemszünet alatt, általában hétvégén, vagy estétől reggelig le kell futniuk.

Karbantarthatóság

A karbantarthatóság arra jellemző, hogy a szoftveralkalmazás mennyire módosítható, mennyi energiát kell egy módosításhoz a munkába fektetni. Ezen belül meg szokták említeni a szoftver

Hordozhatóság

A hordozhatóság az utolsó nagy témakör a szoftverminőség fogalmi rendszerében. Ez a fogalom arra jellemző, hogy mennyire könnyű a rendszert installálni, lecserélni, hozzáigazítani a környezethez. Ebben a témakörben a szokásos felmerülő fogalmak a

A tesztelés célja

A tesztelés célja, hogy segítse a szoftverminőség kontrolljának egyes részeit, összetevőit. A tesztelés önmagában nem elegendő a szoftverminőség garantálásához. Nem lesz jobb egy szoftver ha csak teszteljük, és nem javítjuk ki a hibákat. Ugyanakkor vannak olyan szoftverminőségi mutatók is, amelyek nem javíthatóak teszteléssel.

A tesztelés feladata kettős. Egyik feladata, hogy bizonyítsa a szoftver minőségét, a másik, hogy segítse a szoftverminőség javítását (tipikusan a hibakeresést). Ezek a feladatok az szoftverfejlesztés során a tervezéstől az üzemszerű működésig tartanak. A fejlesztés korai fázisában a hibakeresésen, mint fő feladaton van a hangsúly, és kevésbé a helyes működés bizonyításán. A szoftver fejlődése során a fontosság folyamatosan kerül át a hibakeresésről a helyes működés bizonyítására, és az átadási fázisra ez a feladat súlyozás teljesen megfordul, és az ügyfél általi átvételi tesztek során szinte nem is számít, hogy az egyes tesztek mennyire segítik a szoftverben esetleg még maradt hibák megkeresését, azon túlmenően, hogy létüket demonstrálhatóan bizonyítják, ha vannak hibák.

Ezzel párhuzamosan a tesztelés elvégzése, mint feladat is átkerül a fejlesztő, szállító cégtől az átvevő, üzemeltető céghez, intézményhez. A korai fázisban a tesztelés a szállító feladata, azt saját hatáskörben, saját felelősségére és rizikójára végzi. Ebben a fázisban a megrendelő nem is vesz részt a tesztelésben, és nem is érintett ezekben a tesztekben azon túlmenően, hogy bizonyos tesztelési módszertant megkövetelhet a szállítótól, mint általános rezsimet a szállító általános minőségének ellenőrzésére.

A szállítás során az egyes fázisokban a tesztelés folyamatosan átkerül a megrendelő felelősségi körébe. Ez teljesen összhangban van az egyes tesztek céljával: minőség bizonyítás és hibakeresés. A szállító számára direkt módon nem érték a szoftver minőségnek a bizonyítása, csak annyiban, amennyiben az érdekei a megrendelő érdekein keresztül realizálódnak. A szállító számára a tesztelés elsősorban hibakeresést segítő eszköz. A megrendelő ugyanakkor nem érdekelt a hibakeresésben, nem is ért hozzá feltétlenül, és nem a feladata és általában az eszközei sincsenek meg hozzá. A megrendelő számára a tesztelésben az a fontos, hogy az bizonyítja számára, hogy a szoftver megfelelő minőségű, és így a tesztelés a megrendelő számára csökkenti az szoftver esetleges minőségi hiányosságaiból adódó üzleti kockázatot.

Az átvételi teszt — mint az egyik utolsó teszt a szállítási fázisban és amely lezárja az elfogadás, és teljesítési fázist — teljes felelőssége az megrendelőé, még akkor is ha annak kivitelezésében a szállító segíti szakmai tudásával, vagy éppen a rendszer ismeretével a megrendelőt. Azonban ebben az esetben is pontosan tudatában kell lennie a megrendelő képviselőinek, hogy a megrendelő és a szállító ebben a fázisban a tesztelés szempontjából részben ellenérdekelt. A szállító érdeke ebben a fázisban a tesztek helyes lefutása, hiszen ez az ami a gazdasági célját, a szoftverszállítás teljesítését segíti, ekkor már függetlenül a szoftver minőségétől. A szállító érdeke azonban a szoftver minőségének biztosítása, és a szoftver átvétel megtagadása, ha a szoftver nem éri el azt a minőségi szintet, amelyet a megrendelő megkövetel a szállítótól a szerződéses keretek között.

Emiatt a megrendelő cég vagy intézmény nem ruházhatja át a tesztelés késői fázisait a szállítóra. A tesztelés felelőssége még akkor is a megrendelőn marad, ha az átvételi tesztek tervezését és technikai kivitelezését a szállítótól független harmadik, szakmailag kompetens félre bízza.

Ahogyan a tesztelés célja a fázisok során eltolódik a hibakeresés felől a bizonyítás felé, ennek megfelelően a tesztelés technológiája, és kivitelezése is eltolódik a technikai, fejlesztői szintről egyre inkább a felhasználói szint felé.

Természetesen a tesztek minden fázisban technikailag megalapozottak kellenek, hogy legyenek, különben nem képesek betölteni a feladatukat, de a fejlesztés korai szakaszában a tesztek megjelenés és a tesztek eredményének a prezentációja részletes és technikai. A fejlesztés későbbi szakaszában a tesztek eredménye átlátható, olvasható, egyszerűen értelmezhető kell, hogy legyen. Amíg a hibakeresés a tesztelés fő feladata, addig a teszt eredményének minden olyan adatot tartalmaznia kell, amelyik a hibakeresést segíti. Ezért a tesztelés eredménye ebben a fázisban gyakran szöveges naplófájlok formájában jelenik meg, amelyet a fejlesztők használnak információ forrásként. A tesztelés későbbi fázisában ez a teszteredmény forma használhatatlan lenne. Annak eldöntése, hogy egy teszt hibátlanul lefutott, és így bizonyítja-e a szoftver minőségének azt a szeletét, amelyet bizonyítani hivatott nem követelheti meg hosszú, és könnyen „elnézhető” naplófájlok vizsgálatát. A teszteket úgy kell kivitelezni, hogy azok eredményének értelmezése, magyarán annak eldöntése, hogy a teszt sikeres volt-e vagy sem szinte emberi hibalehetőség nélkül elvégezhető legyen. Így tipikusan egy átvételi teszt futtatási eredménye tipikusan egy „teszt sikeres” vagy „hibás teszt” kiírás, vagy zöld – piros jel egy eredmény lapon.

A tesztek tulajdonságai

A teszteket úgy kell elkészíteni, hogy megfeleljenek a konkrét teszt céljának. Ennek elérésére a teszteknek

kell lenniük.

Amikor egy tesztet megvizsgálunk, akkor hatásos ha a teszt sikeres futtatása nagy valószínűséggel bizonyítja, hogy a tesztelt minőségi kritérium a szoftver alkalmazása során is megfelelő lesz. Ha például tesztelünk egy funkciót, akkor nem teszteljük végig az összes létező bemeneti adattal a teszt rendszert, mert ez fizikai képtelenség. A tesztünk mégis lehet hatásos, ha olyan tesztadat-sort használunk, amelyik tartalmaz mintát a legfontosabb esetekre, és amelyek alapján joggal köveztethetünk arra, hogy a szoftver minden bemenő adatra megfelelőképpen fog viselkedni.

A teszt akkor hatékony, ha nem csak hatásos, de nem fogyaszt feleslegesen erőforrásokat. A fenti funkcionális teszt példánál maradva a teszt nem hatékony ha több olyan bemenettel is teszteli a szoftver működését, amelyek esetében az egyik lefutása esetén nem marad kétség, hogy a többivel is működni fog a rendszer.

A teszt költséghatékonysága azért is fontos, mert sokszor a tesztelés igényeit figyelembe nem vevő tervezés olyan szoftver eredményez, amelyiknek a tesztelése csak nagyon nagy költséggel végezhető el, és emiatt sokszor el is marad. Ennek a következménye, hogy a szoftver hibái csak a szállítási fázist követően a jótállási fázisban derülnek ki, amikor egyrészről a szoftver már üzemben van és így minden minőségi deficit üzleti hátrányt jelent a megrendelőnek; másrészről pedig ebben a fázisban a megrendelő jóval kisebb érdekérvényesítő erővel rendelkezik a szállítóval szemben.

A szoftverrendszereket úgy kell megtervezni, és kivitelezni, hogy azok a szoftver élettartama során, tehát nem csak a szállítási fázis lezárásáig hanem azt követően is költséghatékonyan tesztelhetők legyenek.

A költséghatékonyságnál nem csak a tényleges kiadásokat kell figyelembe venni, hanem azokat a költségeket is, amelyek sokszor nem kerülnek pénzbeli kifejezésre. Ilyen tipikusan a tesztelésre fordított idő, a szükséges koncentráció, a kiértékelés ideje és hibázási lehetőség a kiértékelés során.

A teszt sebessége szorosan összefügg a hatékonysággal és a költséghatékonysággal. Az, hogy egy teszt elég gyors-e beleérthető az előző kettőbe, de az idő, mint speciális, nem többszörözhető erőforrás, szükségessé teszi, hogy a teszt sebességét mindenképpen, mint külön kritériumot vegyük figyelembe.

A tesztnek definiáltnak kell lennie. Ez azt jelenti, hogy pontosan elő kell írni a teszt futtatásának kritériumait, az előfeltételeket, hogy hogyan kell a tesztet végrehajtani, milyen módon kell a teszt eredményét begyűjteni és az eredményt értékelni. Gyakori hiba, hogy nincsenek definiálva a teszt előfeltételei, és emiatt a teszt reprodukálhatósága csökken. Más esetekben a teszt eredményeinek begyűjtése nincs definiálva vagy az eredmények értékelése és e miatt a teszt sikeressége vagy sikertelensége egyes esetekben definiálatlan.

A teszt eredményeknek értékelhetőnek kell lenniük. Ezt a definiáltsággal összefüggő fogalmat attól függetlenül is ki kell emelni, mert nem elegendő, hogy a teszt eredménye definiált, ha az nem értékelhető. Definiált például ha egy teszt eredménye egy megabájt méretű bináris fájl, amely nem tartalmazhat egy meghatározott szekvenciát. Ezt az eredményt azonban további segéd programok nélkül nem tudja a teszt végrehajtója értékelni, ez az eredmény ilyen módon nem értékelhető. A konkrét esetben a példa azzá tehető, ha a kiértékelő program használatát is a teszt részévé tesszük, és definiáljuk, hogy mely programmal, és milyen módon kell elemezni a keletkezett bináris fájl.

Végül és nem utolsó sorban a teszteknek reprodukálhatóaknak kell lenniük. A tesztelés, mint minőség bizonyítási eszköz semmit nem ér ha néha működik egy teszt eset, néha meg nem. A reprodukálhatóság nagymértékben elősegíthető ha a teszt hatásos, definiált és értékelhető, de nem garantálja a teszt reprodukálhatóságát. Lehetnek a tesztelt működés során olyan külső körülmények, üzemelési paraméterek, amelyek változnak a tesztfuttatások között és amelyek hatással vannak a teszt eredményre, de nem a teszt bemenő paraméterei. Ezeket a hatásokat a tesztek elkészítése során amennyire lehet ki kell küszöbölni. Amennyiben a teszt nem reprodukálható, különböző időben látszólag azonos körülmények között a teszt különböző eredményeket ad, akkor az általában instabil, hibás működésre utal, és a szoftverminőségi szint bizonyítására alkalmatlan.

Teszt típusok

A gyakorlatban a szoftverfejlesztés élettartama során különböző teszteket szoktak használni. Ezek a tesztek sokszor egymásra épülnek, és amennyiben valamelyik teszt hibát tár fel, meg kell vizsgálni a hiba kijavítását követően, vagy annak során, hogy kell-e valamilyen tesztet készíteni a hiba ismételt előfordulásnak megakadályozására az alsóbb szinteken.

Ennek az az oka, hogy egy hiba nem csak egyszer fordulhat elő. Annak ellenére, hogy a szoftver kódban egy kijavított hibás kód megszüntet egy hibajelenséget, nem biztos, hogy a hibát is kiküszöbölte. Elvileg is csak annyit lehet állítani, hogy bizonyos teszt adatokra, bizonyos inputra már nem jelenik meg a hiba. Ugyanakkor előfordulhat, hogy más adatokra, vagy a kód egy másik részének megváltoztatása esetén a hiba ismételten jelentkezik. Ez tipikusan abban az esetben fordul elő, amikor a hiba kijavítása nem kellő körültekintéssel, és kellően általánosan történik meg.

Mivel egy hiba kijavítása annál olcsóbb, minél alacsonyabb szintű teszt során derül ki a hiba, ezért érdemes a kijavított hibákra is minden szinten teszteket készíteni, kiegészíteni a meglevő teszt eseteket.

Az egymás után következő tesztek a fejlesztési fázisoknak megfelelően egyre nagyobb részeket tesztelnek, míg végül a felhasználói elfogadási teszt már az egész rendszert teszteli. Ennek megfelelően azok a tesztek, amelyek csak egy részt tesztelnek, a többi, a teszt által nem vizsgált részt a tesztelési környezettel helyettesítik, szakszóval mock-olják a környezetet. Ebből a szempontból is érdemes megkülönböztetni a különböző teszteket, az alapján, hogy a tesztelt részek és a mock környezet milyen felületen kapcsolódik egymáshoz. Amennyiben a megrendelő, vagy megbízott technikai szakemberei részt vesznek a felhasználói elfogadási tesztet megelőző teszteken is, nagyon fontos tisztázni, hogy a mock környezetek közül mi az amit a szállító biztosít, és mi az amit a megrendelői oldalnak kell nyújtania. Amennyiben a szállító biztosítja a mock környezetet vagy annak egy részét a megrendelői oldalnak különös gondot kell fordítania arra, hogy meggyőződjön a mock környezet megfelelőségéről.

A fejlesztési és átadási fázisoknak megfelelően szokásos tesztek:

Unit tesztek

A unit tesztek a fejlesztési unitokat tesztelik, és ezeket a teszteket a megfelelő iparági gyakorlat szerint a fejlesztők készítik el az egyes unitok fejlesztése során. Egy unit tipikusan lehet egy Java class, amihez általában egy teszt class-t készítenek, amelyik futtatása során teszteli a Java class-t. A unit tesztek futtatása általában minden fordítás során megtörténik, és a fordításvezérlő rendszerek többnyire a szintaktikai hibával egyenértékűnek tekintik, ha egy unit teszt nem fut le sikeresen.

Ideális esetben az egyes unit tesztek függetlenek egymástól. Az éles futtatás során történő egymástól való függőséget mock osztályokkal valósítják meg a unit tesztek, amelyek megfelelő, külső fél által fejlesztett mock könyvtárak segítségével hozhatók létre.

A unit teszt értelme, hogy az egyes unitokat egyenként, egymástól függetlenül lehet tesztelni, és ezzel bizonyítani, hogy az egyes részek megfelelően működnek. Sokszor a unit teszt kódja a fejlesztői dokumentáció része, amely természetéből adódóan abszolút precízen írja le a unit működését.

A unit tesztek biztonságossá teszik a unitok módosítását, például a nagyobb teljesítmény kedvéért. A fordítási időben lefutó unit teszt azonnal megmutatja, ha a módosított kód nem felel meg a korábban megírt unit tesztnek, és gyakorlatilag nem sikerül a fordítás, amíg a kód nem megfelelő (regressziós teszt).

A unit tesztek esetében gyakran merül fel a kód lefedettség fogalma, ami azt jelenti, hogy az adott unit minden egyes programsora meghívásra került-e a unit teszt futtatása során. Nem feltétlenül követelmény még egy szigorúan szabályzott fejlesztői környezetben sem a teljes lefedettség, mert vannak olyan kódok, amelyeket nem érdemes tesztelni. Ilyenek tipikusan a fejlesztői környezet által automatikusan generált setter és getter metódusok. Ugyanakkor a teljes lefedettség sem garantálja a kód hibátlanságát. Ha minden egyes kódsor legalább egyszer futott a unit teszt alatt, az még nem garantálja, hogy minden kódsor a lehetséges lefutások minden kombinációjában, a kód összes lehetséges lefutási útvonalán tesztelve lett, és még kevésbé, hogy az összes lehetséges adattal lett tesztelve, ez triviális programok kivételével ugyanis elvileg sem lehetséges.

Unit tesztet akkor tekintünk megfelelőnek, ha a unit minden dokumentált funkcióját teszteli minden lehetséges bemeneti adatcsoporttal. (Egy adatcsoportba tartozónak tekintünk két bemeneti adathalmazt, ha az várható, hogy az egyik helyes kezelése esetén a unit a másikkal sem fog hibásan futni.) Ennek megfelelően a unit teszt elkészítéséhez valójában nem is szükséges a unit kódjának ismerete, csak a funkciók ismerete, és néha alkalmazott fejlesztési szabály az is, hogy a unit tesztet a unit kódjának megírása előtt készítik el. Ennek következtében nem is a unit tesztre, hanem a kódra lehet jellemző, ha van olyan lényeges kódsor, amit a unit teszt nem fed le nem használ. Az ilyen kódsor valószínűleg szükségtelen.

A unit teszt szállítási szempontból a forráskód része, és a megrendelő akkor követelheti meg a szállítótól a unit tesztek kódjainak szállítását, ha a forráskód átadása is a szállítás része. Általában a unit teszteket a megrendelői oldalon nem ellenőrzik sem tartalmilag, sem pedig teszt futtatás során. A unit tesztek meglétét és minőségét a megrendelői oldalnak legfeljebb szúrópróba szerűen kell ellenőriznie. Ezzel a megrendelő nem a kódot, hanem a szállító a minőségét ellenőrzi.

Modul tesztek

A modul teszteket a QA szállító a szállított, és tesztelésre készre jelentett modulokon végzi, általában mint fekete doboz teszteket. Modulnak olyan egységeket tekintünk ebben az esetben, amelyek üzemeltetési szempontból külön egységként jelennek meg. A felhasználó számára gyakran nem jelennek meg az egyes modulok, nem feltétlenül kell ismernie az egyes modulokat és azok egyedi funkcionalitását. Lehetnek olyan modulok, amelyek nem is biztosítanak egyáltalán végfelhasználói funkcionalitást, csupán más modulok veszik igénybe az általuk nyújtott szolgáltatásokat.

A modulokra jellemző, hogy jól definiált, általában szabványos felületeken keresztül kommunikálnak egymással. A modultesztelés során az ezeken a felületeken keresztül elért vagy nyújtott szolgáltatásokat mock modulokkal helyettesíti a tesztelő rendszer. Szabványos felületek esetében erre kész eszközök állnak általában rendelkezésre, saját felületek esetében a teszt mock modulokat ki kell fejleszteni. Ez a fejlesztés a QA folyamatban külön költséget jelenthet amennyiben a szállító nem szállítja a mock modulokat. Mivel a külön fejlesztett mock modulok maguk is lehetnek a tesztelés során hiba források ezért különösen fontos tesztelési szempontból is a szabványos felületek használata.

Különösen érdekes azoknak a moduloknak a tesztelése, amelyek humán felületen keresztül is kommunikálnak, azaz kezelői felületük is van. Ezek a felületek általában nem annyira jól definiáltak, mint a gépi felületek. Ennek az oka, hogy az ember, mint a felületet használó „modul” intelligens, és egészen más módon értelmez egy felületet, mint egy gép. Egy felhasználói felület lehet úgy is jól használható, hogy géppel nehezen tesztelhető, és lehet úgy is nehezen használható, hogy közben pontos definíció szerint épül fel.

A felhasználói felületek gépi teszteléséhez léteznek különböző módszerek, amelyek a tesztelés végrehajtása során az emberi viselkedést (begépelt karakterek, egérrel történő kattintások) ismétlik el, és így a tesztek regressziós futtatása automatizálható. Sok esetben azonban az ilyen tesztek fals hibát jeleznek, például egy megnyomható gomb arrébb kerül, és az automatizált teszt a gomb mellé kattint mert nem veszi észre automatikusan a változást úgy, ahogy egy ember észrevenné. Emiatt az ilyen felületek tesztelése teljes mértékben nem automatizálható.

A tesztek során nem csak a garantált, „szállított” külső felületeket teszteljük, hanem az egyes modulokat külön, egymástól szeparáltan vizsgáljuk, a másik, éppen nem tesztelt modul által nyújtott interfészeket pedig mock szolgáltatásokkal biztosítjuk. Ezzel nem csak a publikus interfészeket teszteli az integrációs teszt, hanem azokat az interfészeket is, amelyekkel az egyes modulok egymás között kommunikálnak. Ez lehetővé teszi a modulok valódi modularitását és kiválthatóságát a későbbiekben a definiált és tesztelt interfészeken keresztül.

Integrációs tesztek

Az integrációs tesztek során a már összekapcsolt modulok működését teszteljük. Ilyenkor már nem az egyes modulok működését vizsgáljuk, hanem azt, hogy az egyes modulok valóban együtt tudnak-e egymással működni, integrálódnak-e. Elvileg ha a modul tesztek nem találtak hibát, akkor az integrációs teszteknek is sikerülniük kell, feltéve, hogy a tesztelő mock implementációk, amelyek a modul tesztek során a nem tesztelt modulok által nyújtott felületeket implementálják tökéletesek és minden szempontból megfelelnek a valós környezetnek. Ez azonban a gyakorlatban nm biztosítható, és elvileg sem cél olyan mock modulokat készíteni, amelyek 100%-ig emulálják a modulok viselkedését.

Az integrációs tesztek során kiderülő hibák olyan hibák, amelyek egyben jelzik a modul tesztek valamilyen hibáját is, vagy olyan hibák, amelyek még korábban elkövetett terezési hibára utalnak. Az integrációs tesztek során feltárt hibák esetében mindig meg kell vizsgálni, hogy az adott hiba miért nem derült ki a modul tesztelés során, és vagy javítani kell a modulteszten új teszteset felvételével, vagy valamelyik mock modul kódját, vagy konfigurációját kell módosítani a hiba alapján, és megismételni a modultesztet, ellenőrizve, hogy a módosított formában felfedezi-e a hibát.

Az integrációs tesztek során kiderülő hibák zöme konfigurációs hiba. Ebben az esetben a modulok összekapcsolásának paraméterei a nem megfelelőek. Az ilyen hiba kijavítása nem a kódban történik, hanem a teszt rendszere konfigurációjában, és mint ilyen nem is tekinthető a rendszer hibájának. Amennyiben az derül ki, hogy a hiba a rendszer kódjában van, akkor vissza kell lépni a kód kijavításához, a unit tesztek, modul tesztek kibővítéséhez és ezt követően lehet megismételni az integrációs teszteket.

Ezek a visszalépések adminisztráció és időigényesek. Az adminisztráció célja az, hogy minden tesztelés, és kód módosítás követhető legyen, és így a később kiderülő hibák esetén tudni lehessen, hogy egy új hibáról van-e szó, ami egyszer már fellépett és javítva lett, de valamilyen oknál fogva ismételten fellépett, vagy egyszerűen a hibát még nem javított ki fejlesztő. Ez könnyen előfordulhat nagyobb léptékű fejlesztés során, amikor a modul tesztek során több száz hiba derül ki. Sok esetben az iteratív tesztelési folyamatban nem vár a projekt addig, amíg a modul tesztben feltárt összes hibát kijavítják, hanem elkezdik az integrációs teszteket tudva, hogy lesznek olyan hibák, amelyek definíció szerint a modul tesztekből öröklődnek, és meg kell, hogy jelenjenek.

Az átlapolódó tesztelési fázisok oka, hogy ebben a projekt struktúrában gyorsabban lehet előre haladni, az ismételt tesztelések extra költségén. A tesztek végrehajtása azonban, főleg ha automatizált tesztekről van szó, nem olyan magas, mint a tesztek kialakításának költsége, ezért általában a projektek során az egyes teszt fázisok átlapolódnak.

Az integrációs tesztek sikeres lefutása esetén bizonyítják, hogy az egyes modulok képesek együttműködni. Ez különösen abban az esetben fontos az egész rendszer tesztelése előtt, ha a különböző modulokat különböző szállítók szállítják. Az integrációs teszt ebben az esetben ki kell, hogy egészüljön olyan monitoringgal és elemzési lehetőséggel, amelyik azt tudja vizsgálni, hogy az egyes modulok közötti felületen milyen kommunikáció zajlik. Ebben az esetben ugyanis nagyon fontos, hogy a két modul közötti integráció hiánya melyik modul nem megfelelő működése miatt történik, és ezt a tesztnek műszakilag ki kell tudnia mutatnia vitathatatlanul.

A modulok kapcsolódási felületeinek ellenőrzése hálózati figyelő eszközökkel, vagy a kommunikációt továbbító és naplózó egyszerű proxy alkalmazásokkal lehetséges. Ilyen jellegű forgalom rögzítés az integrációs teszt során egyébként is ajánlott, akkor is ha a teszt értékelésének nem része a naplófájlok elemzése. Ezek akkor lehetnek hasznosak, ha egy későbbi teszt során valamilyen hiba a felszínre kerül, következtetni lehet a hiba okára és helyére ha kideríthető a naplófájlok alapján, hogy a hiba már korábban is meg volt, csak nem vette észre a teszt, vagy pedig a fejlesztések során keletkezett.

Funkcionális teszt

A funkcionális tesztek a legismertebb tesztek. Azt hivatottak eldönteni, hogy a szállított szoftver rendszer helyesen végzi-e a funkcióit, amelyeket elvárnak tőle. Tulajdonképpen a unit tesztek, a modul és az integrációs tesztek is funkcionális tesztek, de céljuk az egyedi unit, modul, illetve a modulok kapcsolódásának a tesztelése az integrációs teszt, és nem azon funkcióknak a tesztelése amelyek a megrendelő számára fontosak. Úgy is megkülönböztethető a unit, modul és integrációs teszt a funkcionális teszttől, hogy bár az első három is funkciókat tesztel ezek a funkciók elsősorban belső funkciók és nem azok, amelyek a felhasználó számára is direkt módon érdekesek. A felhasználó számára fontos, úgynevezett felhasználói funkciók a belső funkciókra épülnek, így ezek működése is alapvető, de nem a funkcionális teszt vizsgálatának direkt tárgyai.

A funkcionális tesztek lehetnek manuális és automatizált tesztek. Mint minden tesztnek tervezettnek kell lennie, és nem ad-hoc jellegűnek. A funkcionális tesztek elvégzése előtt pontosan meg kell határozni, hogy milyen teszt esetek lesznek, és definiálni kell az egyes teszt eseteket. A teszt esetek definiálása során nem csak műszaki, hanem projekt menedzsment paramétereket is figyelembe kell venni. Így tipikusan a funkcionális teszt előkészítése során a tervben a következőket kell rögzíteni minden egyes teszt esetre:

A funkció mondja meg, hogy a szoftver rendszer melyik funkciója az, amit a teszt vizsgál. Egy teszt leltár során világosan látni kell, hogy nem maradt-e ki olyan funkció amelyet a megrendelő a szállítótól követel, és amelyet teszt nem vizsgál. Amennyiben teszt nem bizonyítja egy funkció működőképességét a funkciót nem lehet biztonsággal működőnek, meglevőnek tekinteni.

A teszt súlya adja meg, hogy mennyire fontos a teszt sikeres lefutása. Lehetnek olyan teszt esetek, amelyek sikertelen lefutása valamely funkció hiányát, vagy hiányosságát jelzik, de a funkció hiánya, vagy hiányossága nem olyan súlyos, hogy emiatt a projekt ne léphessen a következő fázisba. Tipikusan ilyenek a felhasználói felület ú.n. kozmetikai hibái, amelyek a használhatóságot nem csökkentik, de ergonómiai hatásuk hosszabb távon lehet. Ilyen esetben a rendszer átvehető, mert a használatba vétel, még a csökkent funkcionalitással is nagyobb gazdasági haszonnal kecsegtet, mint egy később használatba vett javított rendszer. Természetesen az a szempont sem elhanyagolható, bár nem a tesztelés szigorúan vett hatáskörébe tartozik, hogy a szállító a szállítást követően kijavítja-e ezeket a hibákat szavatossági körben.

Tipikus teszt eset súlyok lehetnek a

hibák.

A blokkoló hiba olyan amelyik megakadályozza a rendszer használatát, amíg a rendszerben ilyen súlyos hiba akárcsak egy is van a rendszer nem tudja ellátni a feladatát.

Komoly hiba az, amely mellett még elképzelhető a rendszer üzembe helyezése, de a rendszer gazdasági haszna lényegesen kisebb, mint ha a hiba nem lenne. Ilyen lehet egy fontos, de nem életbe vágó funkció hiánya, vagy egy olyan funkció hiánya, amely a program használata során csak egy későbbi időpontban válik szükségessé, például évváltáskor. Ilyen esetben a szoftver rendszer használatba vehető, de általában a szállítótól a megrendelő csak részteljesítést fogad el, és a hiba kijavítása is szigorú határidő mellett történik.

Fontos, hogy amennyiben a rendszer átvételre kerül komoly hibával, akkor a szoftverszállítási projektmenedzsmentben a rizikó menedzsment foglalkozzon azzal a kérdéssel, hogy milyen következményei vannak annak, ha a szállító nem szállítja a javítást az elvárt, vagy a projektben kalkulált legvégső határidőig.

Fontos hiba az, amelyik nem akadályozza meg a rendszer használatát, és nem csökken a rendszer gazdasági haszna sem, de a használat költségesebb, vagy (ezzel egyenértékűen) nehézkesebb, mint ha a hiba nem lenne jelen. A fontos hibák kijavítását joggal várja el a megrendelő a szállítótól, de ezek javítása nem feltétlenül az átadás, és a teljesítés során történik.

Apró hibáról beszélünk olyan esetben, amikor a hiba jelenlétével együtt is jól használható a rendszer. Egy hiba kozmetikai akkor ha gyakorlatilag funkció nem sérül csak a felhasználói felületen van olyan eltérés a tervezettől, amely észlelhető.

A teszt esetek súlyának elsősorban átvételi tesztek során van szerepe, ahogyan a fentiekben részleteztük is, hogy az átvételre milyen hatással kell lennie a hibáknak a súlyozástól függően. A teszt tervnek, amennyiben az átvételi teszt meg kell határoznia azt is, hogy az egész teszt mikor tekinthető sikeresnek. Természetesen blokkoló hiba egy sem fordulhat elő, de komoly, fontos, apró és kozmetikai hibákra is meg lehet és érdemes adni maximális számot, ami tipikusan az összes teszt eseten 5-10%-a.

A teszt előfeltételei olyan feltételek, amelyek nem tartoznak ugyan a teszt előkészítés teendői közé, de szükségesek ahhoz, hogy a tesztet végre lehessen hajtani. Ilyenek a tesztelendő rendszer és a mock részek installálása, ami az egész tesztelés, és nem a teszt eset előkészítéséhez tartozik, vagy a megfelelő sávszélesség, amennyiben az nem triviális. A teszt tervben azokat az előfeltételeket kell felsorolni, amelyekkel szemben várható, hogy előfordulhat, hogy nem állnak rendelkezésre, és ez különösen akkor fontos ha valamelyik előfeltétel hiánya olyan hibás tesztfutást eredményez ami miatt fals negatív értékelést kaphat a teszt, holott csak az előfeltételek nem voltak adottak.

Az előkészítésben olyan teendőket kell felsorolni, amelyek nem a teszt részei, de amelyeket a teszt eset elindítása előtt végre kell hajtani, hogy a tesztelt rendszer a teszt eset végrehajtására megfelelő állapotba kerüljön. Ezek a lépések általában minden alkalommal végrehajtandók a teszt eset ismételt futtatása esetén is, és hasonlóan az előfeltételekhez figyelni kell arra, hogy a teszt hibája esetén nem a hibás teszt előkészítés-e a valódi ok.

A végrehajtás részben azt kell leírni, hogy hogyan kell magát a tesztet végrehajtani. A végrehajtás leírásában nagyon precízen, egyértelműen és konkrétan kell fogalmazni, hogy ki legyen zárva a teszt végrehajtásának különböző lehetősége. Amennyiben például várni kell egy eredményre, akkor nem megfelelő az olyan megfogalmazás, hogy „kivárható időn belül megjelenik az eredmény az ablakban”. Az, hogy mi a kivárható idő a tesztelő személyétől, hangulatától is függhet, így a teszt eredménye nem determinált. Helyes megfogalmazás viszont, hogy „10mp-en belül megjelenik az eredmény az ablakban”.

A dokumentálás részben azt kell leírni, hogy a teszt végrehajtása során a teszt jegyzőkönyvben milyen adatokat kell rögzíteni, illetve a számítógépes rendszerben vagy a tesztelőkörnyezetben keletkezett állományok közül melyeket kell begyűjteni, és csatolni a teszthez, mint dokumentumokat.

Az értékelés rész pontosan és precízen kell, hogy definiálja, hogy mikor tekinthető a teszt sikeresnek. Nem létezhet olyan fogalom, hogy egy teszt majdnem sikeres, vagy tulajdonképpen sikeres. Ha olyan értékeléssel találkozunk, hogy a teszt „egyes részei” sikeresen lefutottak, az valószínűleg azt jelenti, hogy valójában a teszt esetet szét kellene vágni több tesztre. Egy funkcionális teszt lehet sikeres, vagy sikertelen.

Az átvételi tesztek során a funkcionális teszteket a teszt tervekből derivált teszt jegyzőkönyvekkel kell dokumentálni, ahol minden egyes teszt esetre rögzíteni kell, az előfeltételek ellenőrzését és az ellenőrzés eredményét, az előkészítés lépéseit, a végrehajtást, a dokumentáció begyűjtését, illetve a dokumentációt és végül az értékelést (sikeres, vagy sikertelen).

Az átvétel során ha egy teszt azért nem sikerült, mert voltak megfelelőek az előfeltételek, akkor tesztelési szempontból a tesztet sikertelennek kell tekinteni. Így teszt csak akkor kerülhet elfogadásra, ha minden blokkoló súllyal rendelkező teszt eset sikeresen lefutott, és a megadott maximális hibaarányon kívül sikeresen futott minden más súlyú teszt eset.

Terheléses tesztek

A terheléses tesztek elsődleges célja nem a rendszer funkcionális működésének ellenőrzése, hanem a rendszer terhelés alatti viselkedésének vizsgálata. A terheléses tesztek között van a terheléses teszt, a sokk teszt és a tartóssági teszt. Ezek mellett lehetséges más terhelés típusú teszteket is definiálni, de ez az a három alaptípus, amelyik a legfontosabb.

Ezeknél a teszteknél a rendszer teljesítményét mérjük, és ehhez definiálni kell a konkrét rendszerre a teljesítmény fogalmát. Pontosan meg kell határozni, hogy mik azok a mérőszámok, amelyeket a rendszer tesztelése során mérni akarunk, és milyen értékeket tudunk elfogadhatónak tekinteni.

Ezek az értékek a terminológia szerint kulcsfontosságú teljesítmény mérők (Key Performance Indicators, KPI), amelyekre a teszt terv minőségi értékeket ír elő, valamint definíció szerűen meghatározza ezek mérésének pontos módszertanát, és azt, hogy az egyes PKI-k egyenként, és összességükben hogyan garantálják a rendszer szolgáltatási szintjeit, amelyet a Service Level Agreement (SLA) megkíván.

Terheléses teszt

A terheléses teszt a rendszer terhelésre adott válaszát vizsgálja. A terheléssel kapcsolatos tesztek körében nem egységes a terminológia, így ide szokták érteni a túlterhelési vagy sokk teszteket, a beégetési (burn) vagy más néven tartóssági teszteket.

A terheléses teszt feladata, hogy ellenőrizze, a rendszer képes az elvárt válaszidőkön belül nyújtani a funkcionalitását olyan terhelés alatt, amilyen terhelésnek az éles rendszerben lesz maximálisan kitéve.

A terheléses tesztek természetszerűleg csak olyan rendszeren végezhetők, amelyek hardver és kapacitás szempontjából megegyeznek az éles rendszerrel, ellenkező esetben a kapott eredmények nem fognak megfelelni az éles rendszernek. Ha a terheléses teszt alatt a rendszer sokkal lassabb, mint azt elvárjuk, de a hardver is kisebb teljesítményű, az még nem jelenti azt, hogy az éles rendszeren sem lesz képes az elvárt teljesítményt hozni. Ugyanakkor fordítva is igaz, ha a terheléses tesztet nagyobb rendszeren végezzük (ezt nem tipikus), mint ami az éles rendszeren áll majd rendelkezésre a sikeres terhelési eredmények nem garantálják, hogy az éles rendszeren is megfelelő lesz a teljesítmény.

Amíg a funkcionális jellegű tesztek esetében nem fontos, hogy a rendszer teljesítménye azonos legyen az éles rendszerével, addig a terheléses tesztek esetében ez alapvető. Ez a terheléses teszteket költségessé teszi, és ezért ezeket csak a sikeres funkcionális tesztek lezárását követően, és később nem ismételten végzik olyan hardveren, amelyet csak ideiglenesen rendelnek a projekt céljaira.

A terheléses teszt eredménye gyakran nem olyan egyértelmű, mint a funkcionális teszteké. A kapott válaszidőket statisztikai módszerekkel lehet érdemes elemezni, vizsgálni a válaszidők minimum, maximum értékét, eloszlását. A gyakorlatban sokszor elegendő az olyan statisztikai kritérium, mint megadni két három értéket a válaszidőkre és megkövetelni, hogy a teszt alatt a válaszok 90%-s, a legkisebb, 97% a második legkisebb stb. kritérium időértéknél kisebb legyen. Gyakran a rendszerrel szemben megkövetelnek maximális válaszidőt is, amely túllépése esetén a kérést meg nem válaszoltnak tekintik, és a terhelési kérdések megválaszolási arányára is egy 100% közeli, de annál természetesen kisebb értéket adnak meg.

A terheléses tesztek során a terhelések megfelelnek a rendszer funkcióinak, és általában a tipikus funkciókkal terhelik a rendszert a funkciók közötti olyan eloszlással, amelyik tipikusan várható az éles környezetben is. Ezek a terhelések azonban nem vizsgálnak minden funkciót. És a funkciók helyes eredményeit sem ellenőrzi általában a terheléses teszt sem valós időben, sem pedig azt követően. Ennek oka, hogy az ellenőrzés valós időben a tesztelt rendszernél lényegesen nagyobb erőforrást igényelne, ami rendkívüli, a legtöbb projekt számára financiálisan elviselhetetlen mértékben megnövelné a tesztelés költségét. A teszt lefutását követő időszakban, a naplófájlok vizsgálatából megállapítani a funkcionális megfelelőséget pedig gyakran nem lehetséges. Ezért a terheléses tesztek során a funkcionális megfelelőséget csak szúrópróba szerűen ellenőrzik a tesztelő rendszerek, illetve azt vizsgálják minden egyes válasz során hogy a visszaadott válasz nem a terhelés következtében általában fellépő rendszerhiba.

Sokk teszt

A sokk teszt során a rendszert olyan terheléssel teszteljük, amely rövid ideig sokkal magasabb, mint a maximálisan megkívánt terhelés. A teszt célja annak vizsgálata, hogy a rendszer képes meghibásodás nélkül elviselni az extrém terhelést, és nem történik ennek hatására adatvesztés, vagy más meg nem engedhető hiba, illetve a rendszer képes-e a terhelés lecsökkenését követően automatikusan visszaállni normál üzemre.

Nem kívánalom a rendszerekkel szemben, hogy a sokk időtartama alatt funkcionálisan helyesen működjenek, csak az, hogy ne történjen olyan változás a rendszerben, amely a normális működést a későbbiekben gátolja.

A sikeres sokk teszt bizonyítja, hogy a rendszer nem támadható hatékonyan (Denial of Service) DoS támadással, és hasonló terhelés esetén is a lehetőségekhez képest automatikusan helyreáll a működés, és nem történik adatvesztés.

Vannak olyan módon felépített rendszerek, amelyek költséghatékonysági okok miatt eleve úgy vannak tervezve, hogy a nominális terhelésnél nagyobb terhelést nem viselnek el, és összeomlanak. Az ilyen rendszereket általában terhelés elosztó rendszerek, tűzfalak védik a túlzott terheléstől. Természetszerűleg a sokk tesztek során a tesztelésbe ezeket az elemeket is be kell vonni, és valójában ilyen esetekben a tesztek a terhelés limitáló tűzfalak funkcionalitását tesztelik, nem a szállított szoftver rendszerét.

A sokk terheléseknél a következőket vizsgáljuk:

A sokk tesztek kivitelezésénél gondosan oda kell figyelni arra, hogy a rendkívül nagy terhelést milyen módon állítja elő a tesztelő rendszer, gyakran sok gépről, hálózati elemeken keresztül kell létrehozni a terhelést. Meg kell határozni a teszt tervezése során a sokk mértékét, és azt is, hogy a terhelés milyen sebességgel és emelkedéssel fut fel, mennyi ideig tart és milyen a lefutása. Ezekre az értékekre nincs általános szabály, ezeket a várható, vagy elképzelhető túlterheléseknek, vagy éppen a rendelkezésre álló terhelő erőforrásoknak, és a tesztelésre fordítható időnek megfelelően szokás beállítani.

A rendes működésre való visszaállás idejét azonban a megkívánt rendelkezésre állási paraméterek alapján kell megkövetelni, és előre rögzíteni a teszt tervben. Ebben figyelembe kell venni, hogy a rendszer milyen görbe szerint áll vissza a rendes üzemre, milyen szolgáltatási szint érhető el a visszaállás alatt, illetve, hogy mennyi idő a rendszert leállítani és újraindítani. Csak olyan visszaállási idő fogadható el, amelyik rövidebb, mint az egész rendszer újraindítása (ellenkező esetben nagyobb szolgáltatási szint érhető el a rendszer újraindításával), illetve annál nem sokkal nagyobb abban az esetben ha a visszaállási idő alatt is elérhető a szolgáltatás megnövekedett, de használható válaszidőkkel. Tipikusan a visszaállási idő pár perctől néhány óráig tarthat a rendszer összetettségétől függően.

Tartóssági teszt

A tartóssági teszt hasonló a sokk teszthez, de nem egyszeri kirívóan nagy terhelésnek teszi ki a rendszert, hanem hosszan terheli azt, és azt vizsgálja, hogy a rendszer képes-e hosszú időn keresztül folyamatosan a specifikációs paramétereknek megfelelően működni.

A tartóssági teszt sikeressége biztosítja, hogy a rendszer hosszú időn keresztül képes ellátni a feladatát, és biztosítani azokat a gazdasági előnyöket, amelyeket a rendszertől a megrendelő elvár. A tartóssági teszt két esetben tekinthető sikeresnek. Az egyik, amikor a rendszer semmilyen működési degradációt nem mutat a teszt alatt. Ebben az esetben a teszt azt mutatja, hogy a tesztelési időszak alatt a rendszer ugyanolyan jól és ugyanolyan jó paraméterekkel működik, mint közvetlenül indulás után.

A működési degradáció lehet olyan paraméter változása, amelyet a felhasználók éreznek, tipikusan a rendszer válaszidejének megnövekedése, de lehetnek olyan paraméterek változása is, amelyeket a felhasználók direktben nem tapasztalnak, de műszakilag biztosnak lehet tekinteni, hogy hosszabb távon a felhasználók által érzékelt paraméterek is degradálódnának. Ilyen tipikusan a memória elfolyás, vagy diszk terület betelése, vagy a rendszerben felgyülemlő halott szálak, adatbázis kapcsolatok elfogyasztása, és fel nem szabadítása. Ezek a paraméterek általában valamilyen rendszer erőforrás elfogyasztását és fel nem szabadítását jelentik.

A másik eset, amikor a tartóssági tesztet sikeresnek kell tekinteni, ha a rendszer ugyan mutat a teszt ideje alatt valamilyen degradációt, ez azonban nem olyan mértékű, hogy egy megkövetelt folyamatos üzemelési periódus alatt ne lenne elfogadható. A megkövetelt folyamatos üzemelési periódus az az időtartam, ameddig a rendszernek folyamatosan üzemelnie kell újraindítás, karbantartás nélkül. Ha a rendszer üzemeltetése során az üzletileg megkívánt rendelkezésre állás megengedi, hogy a rendszert naponta újraindítsák, akkor a tartóssági teszt elegendő ha egy napig tart. Ha a rendszerben ez alatt van némi degradáció, akkor a rendszert lehetséges napi újraindítással üzemeltetni.

A rendszer természetesen ilyen esetben nem tökéletes. A rendszerben valamilyen hiba van, amely a degradációt okozza, de az üzemelés ezzel a hibával együtt is elfogadható. Ennek ellenére az ilyen hibák kijavítására is törekedni kell akár az átadás, vagy a határidőknek és a gazdasági előnyöknek megfelelően a szavatossági időtartam alatt. Ennek oka nem csak az, hogy a rendszerkarbantartás, újraindítás költséget jelent, hanem az is, hogy minden felfedezett és ismert, de be nem határolt hiba rizikót jelent, és nem garantálható, hogy változó üzemelési körülmények között a degradáció nem növekszik, vagy akár nem akadályozza meg teljesen a rendszer funkcionalitását (teljes leállás, akár adatvesztés).

A be nem határolt hibák veszélye nem csak a tartóssági teszteknél létezik, de ez az a tesztelés, amelyiknél a legnagyobb súllyal kell figyelembe venni az ilyen jelenségeket. A funkcionális, terhelési és sokk teszteknél fellépő hibák oka általában könnyebben behatárolható, és akár javítható a hiba vagy, becsülhető a hiba működésre való kihatása. A tartóssági teszteknél sokkal gyakrabban fordul elő, hogy a hiba jelenség nem drasztikus, nem egy adott funkcióra és ennek egy adott kódrészletre specifikus és emiatt nehezen behatárolható a hiba helye.

A tartóssági tesztek azok, amelyek a legtovább tartanak, hiszen ha egy rendszernek képesnek kell lennie folyamatosan üzemelni egy hónapon keresztül, akkor a tartóssági teszt sem lehet ennél rövidebb. Ez azért fontos kérdés, mert ez a kritérium nem feltétlenül az a követelmény, amelyet a megrendelő a szállítóval szemben megfogalmaz. A megrendelői követelmények megfogalmazása során gyakran olyan kitételek szerepelnek, mint „a rendszernek képesnek kell lennie folyamatosan üzemelnie”, amiből elvileg végtelen hosszú tartóssági teszt következne. Valójában a tartóssági teszt hosszát az üzleti és üzemeltetési követelmények határozzák meg, amelyek nem feltétlenül jelennek meg direktben a szállító felé követelményként. Ezért a megrendelői oldalon a tartóssági teszt hosszát szokták sokszor követelményként feltüntetni.

Felhasználói elfogadási teszt

A felhasználói elfogadási teszt a hivatalos átadási, átvételi teszt. Erre a tesztre akkor kerül sor, amikor a szállító a többi tesztet már lefuttatta, és úgy ítéli meg, hogy a rendszer alkalmas az átadásra, nincsen benne olyan hiba, amelyik megakadályozza a teljesítést.

A felhasználói elfogadási teszt (User Acceptance Test, vagy UAT) elfogadója a megrendelő, és nem a felhasználó. Sok esetben ez a két személy ugyanaz, de nagyobb rendszereknél nem a felhasználó az aki a rendszer gazdasági előnyeiért felel, ő csak kezeli, és ezért az elfogadás felelőssége gazdasági értelemben a szállítás igazolása sem az ő feladata. Mégis ez a terminológia terjedt el, mert ugyan nem a felhasználó a felelős, de mégis az a személy aki ezeken a teszteken, mint a megrendelő a tesztek végrehajtására delegált képviselője részt vesz.

Sokszor az UAT-ot csak mint funkcionális tesztet tekintik,és valóban a leggyakrabban az UAT tényleges végrehajtása során csak a funkcionális tesztet hajtják lépésről lépésre végig. Ennek az oka, hogy a terheléses tesztek ismételt végrehajtása nagyon költséges lenne, és nem is járna műszaki előnyökkel. A terheléses teszteket általában a megrendelő képviselőjének, vagy képviselőinek jelenlétében és felügyeletével hajtják végre, és ezek elfogadott jegyzőkönyve az UAT része.

Az UAT funkcionális teszt végrehajtása során a megrendelő és a szállító a teszteket együtt hajtják végre olyan módon, hogy a teszt végrehajtás ellenőrzéséért és a teszteredmények kiértékeléséért a megrendelő a felelős. Az UAT minden esetben formális jegyzőkönyvvel rögzített és dokumentált.

Üzembehelyezési teszt

Az üzembehelyezési teszt az éles rendszeren történik és célja annak ellenőrzése, hogy a rendszer az éles környezetben is megfelelően működik, nem történtek installációs, konfigurációs hibák.

Ezt a tesztet sokszor nem tekintik tesztnek, hanem az üzembehelyezés részének. Mégis érdemes a tesztek közé sorolni és úgy kezelni, mint a korábbi teszteket, mert ugyanolyan precízen és hasonló elvek mentén kell végrehajtani, és ellenőrizni, mint a funkcionális teszteket.

Az üzembehelyezést követően a rendszer elkezd működni, és éles inputokkal működik. Üzletileg kritikus rendszereknél az üzemelés során is folyamatosan figyelni kell, hogy a rendszer működik-e, és ez nem csak az üzletileg kritikus rendszereknél hanem minden rendszernél különösen fontos az éles indulást követően.

Arról meggyőződni, hogy a rendszer helyesen működik csak úgy lehet, ha definiáljuk a helyes működés kritériumait, és azt, hogy ezeket milyen módon fogjuk mérni, a mérési eredményeket kiértékelni.

Az üzembehelyezési teszthez ugyanazokat az SLA-nak megfelelő PKI-kat kell mérni, mint amiket az üzemelés során, de ezeket ki lehet egészíteni további indikátorokkal, amelyek mérése nem üzemeltetési cél a folyamatos üzem során, de a beüzemelés során fontos információt adhat a rendszer állapotairól.

Az üzembehelyezési teszt tervezése és végrehajtása során, mivel ekkor már éles rendszer üzemel, különösen gondosan kell ügyelni arra, hogy ne legyenek olyan teszt lépések, amelyek a rendszer környezetét, azokat a rendszereket, amelyeket üzemszerűen használnak a felhasználók, feleslegesen terhelik, esetleg működésüket gátolják.

Teszt tervek formái

A teszt tervek elkészítése a rendszer követelmény specifikációja alapján történik. Ennek megjelenési formája az iparági gyakorlatban általában CRC kártyákat, követelmény diagrammokat vagy más UML leírást jelentenek.

A tesztesetek kidolgozása során minden egyes teszt eset definiálja, hogy mely követelményt milyen mértékben fed le a teszt futtatása. Ennek nyilvántartása UML szerkesztő eszközben történhet, amely biztosítja, hogy tervezés során bármikor lekérdezhető a követelmények tesztek által történő lefedettsége, valamint minden teszthez lekérdezhető, hogy mely követelményeket tesztel, és fordítva minden követelményhez meghatározható, hogy mely tesztek azok, amelyek biztosítják a követelmény teljesülését.

Ezzel a követelmények változása során is folyamatosan nyilvántartható, hogy mely tesztek azok, amelyeket módosítani kell, mely tesztek váltak esetleg feleslegessé, és milyen új teszteket kell tervezni a követelmények változott halmazának lefedettségéhez.

Sokszor a teszt tervek elkészítéséhez szövegszerkesztőt, Wiki rendszert használnak. Ez utóbbinak az lehet az előnye, hogy vannak olyan Wiki alapú rendszerek, amelyek a formális tesztleírásokat automatikusan végre is tudják hajtani, így a tesztek automatizálása a teszt definíciókból indul ki minimalizálva az emberi hiba lehetőségét.