Bevezető
Miért van erre szükség a tesztelés világában? A teszttervezés nem más, mint a tesztelési projektnek a megtervezése, vagyis tesztelés során e „sorvezető” mentén haladunk lépésről-lépésre. Bár a teszttervezés alapvetően a tesztmenedzser feladata, bizonyos esetekben előfordulhat, hogy nekünk kell elkészíteni, ezért fontos a teszttervezési technikák gyakorlati ismerete.
Teszttervezési szempontból nem mindegy, hogy milyen funkciójú programot/weboldalt tesztelünk, így az sem mindegy, hogy milyen technikával állunk a teszteléshez, és ezek a technikák hogyan néznek ki a gyakorlatban.
Ezek a cikkek kezdő és gyakorlott tesztelőknek egyaránt szólnak, hiszen még ISTQB vizsgát letett gyakorlott tesztelők esetében is előfordulhat, hogy megfeledkeznek bizonyos technikákról [link1][link2]. Cikksorozatunk ezen könnyen használható technikákat hivatott bemutatni, hogy segítsen feleleveníteni/rálátást adni arra, hogy melyik típusú teszteléshez melyik teszttervezési technikát ajánlott alkalmazni – mindezt átfogóan szemléltetve, a teljesség igénye nélkül. [További vonatkozó cikk]
Határérték-elemzés és ekvivalencia osztályozás
A határérték-elemzés és az ekvivalencia osztályozás a specifikációalapú teszttervezési technika részét képezik, mely vizsgálatának tárgyául a rendszer specifikációját, vagyis a benne szereplő elvárt viselkedést hivatott tesztelni. Ezt a módszert akkor használjuk, amikor nincs lehetőség teljes, azaz kimerítő teszt elvégzésére, viszont le tudjuk fedni az összes tesztelési esetet: ehhez szükségünk lesz egy jól definiált bemeneti értékre, és egy működés szerinti elvárt kimeneti értékre.
A tesztelési technikák ismertetése során többször fogunk hivatkozni az alábbi S1 és S2 „specifikációra”:
- S1: Készítsünk programot, amely beolvas egy egész számot, és kiírja, hogy az negatív, pozitív, vagy nulla-e. (bemeneti érték)
- S2: Készítsünk programot, amely beolvas három egész számot, amelyek egy háromszög oldalhosszait reprezentálják. A feladat annak megállapítása, hogy a bemeneti adatok általános, egyenlőszárú vagy egyenlő oldalú háromszöget alkotnak-e. (kimeneti érték)
A tesztelési folyamat nehézségére utal, hogy ennek a nagyon egyszerű specifikációnak megfelelő programnak a korrekt ellenőrzésére is számos teszt esetet kell definiálnunk.
Ekvivalencia-osztályozás
Ekvivalencia-osztálynak nevezzük a bemeneti értékek azon halmazát, amelyre ugyanúgy kell viselkednie a programnak. Ez azt jelenti, hogy egy ekvivalencia-osztályhoz elég egy tesztesetet megtervezni és lefuttatni (így lecsökken a szükségesen tesztelendő esetek száma), mert az osztályhoz tartozó lehetséges tesztesetek ugyanazt a hibát fedhetik fel. Ha pedig nem fed fel hibát, akkor az adott osztályhoz tartozó más tesztesetek sem fogják felfedni.
Az ekvivalencia-osztályozás kulcsa az osztályozási feltételek megválasztásában rejlik, melyhez először alaposan meg kell vizsgálni a lehetséges bemeneti értékek tartományát. Az ekvivalencia osztályok át is fedhetik egymást. Ennek felismerése tovább csökkentheti a szükséges tesztesetek számát, hiszen a közös részhalmazból választott teszteset az átfedett osztályok mindegyikére érvényes.
Amennyiben a program valamely értéktartományban várja a bemeneti adatokat, akkor három osztályt érdemes létrehozni:
- (1) érvényes bemenetek
- (2) tartomány alatti értékek
- (3) tartomány feletti értékek
A tesztkészletet figyelembe véve megkülönböztetünk gyenge és erős tesztkészletet, illetve gyenge és erős robosztus tesztkészletet. (Robosztusság: annak fokmérője, hogy egy rendszer mennyire képes az elvárt működésre érvénytelen bemenetek vagy szűkös környezeti erőforrások mellett)
A gyenge tesztkészletű ekvivalencia-osztály tesztelés esetén minden ekvivalencia-osztályból kiveszünk egy-egy elemet, és ezekből állítjuk össze a tesztesetet. Érvényes bemenetek esetén így néz ki:
Erős tesztkészletű ekvivalencia-osztály tesztelés esetén az együttes hibamegjelenés feltevéséből indul ki, ezért az ekvivalencia-osztályok kombinációjának mindegyikéből szükségünk van tesztesetekre, így több tesztelésre van szükség. A tesztesetek száma ebben az esetben megegyezik az ekvivalencia-osztályok számának szorzatával. Érvényes inputok esetén így néz ki:
A gyenge robosztus ekvivalenciaosztály-tesztelés során az érvényes bemenetekre válasszunk adatokat a gyenge ekvivalencia-osztályozáshoz hasonlóan; érvénytelen bemenetek esetén választunk egy értéket valamely érvénytelen tartományból, a többit pedig ami a tesztesetben szerepel, érvényes osztályokból kell választani.
Az erős robosztus ekvivalenciaosztály-tesztelés hasonló az előbb vázolt gyenge erős robosztus ekvivalenciaosztály-teszteléshez, csak több érvényes és érvénytelen bemenetet használunk hozzá.
Ha visszatérünk a fent említett S1 specifikációhoz, akkor matematikai értelmezése szerint jelen esetben nem lehetnének érvénytelen bemenetek, hiszen minden egész szám besorolható a specifikáció szerinti kategóriák valamelyikébe. Egy számítógépes program azonban nem képes az egész számok teljes halmazát leképezni, így meg kell vizsgálni azt az esetet, hogy ha az input olyan egész számot tartalmaz, ami az ábrázolási tartományok kívülre esik.
Az S2 specifikációra ekvivalencia-osztályok lesznek például:
- három olyan pozitív szám, ami általános háromszöget alkot (érvényes ekvivalencia-osztály)
- Az egyik szám negatív (nem érvényes ekvivalencia-osztály)
Tehát az ekvivalencia-osztályozásnál a legfontosabb lépés a határok pontos megállapítása (hiszen rosszul megállapított határokkal az osztályok is pontatlan eredményekhez vezetnek), éppen ezért ezt a technikát karöltve szokták alkalmazni a határérték-elemzéssel.
Az ekvivalencia-osztályozás tesztlefedettégét az alábbi művelettel tudjuk elvégezni:
Határérték-elemzés
A határérték-elemzés nem más, mint a bemeneti értékek felosztása közötti szélsőértékek, vagy az értékhatárok közötti tesztelésnek a folyamata. Az ekvivalencia-osztályozás után végezzük el a határérték-elemzést, mert lényegében az ekvivalencia-osztályozás gyenge pontjaira hivatott tapintani – hiszen a vizsgált határokon és a határokhoz közeli értékeikben általában nagyobb eséllyel akadhatunk hibára, mint például a tartományok közepén.
A szélsőértékeket (mint kezdet- és végérték, alsó- és felsőérték, minimum- és maximumérték, csak tartományon belüli, vagy csak tartományon kívüli értékeket) határértékeknek, a tesztelést pedig határérték-elemzésnek nevezzük.
A határérték-elemzés alapgondolata az, hogy az alábbi bemeneti változó értékekkel dolgozik:
- Minimális érték
- Valamivel meghaladja a minimumértéket
- Névérték
- Valamivel a maximumérték alatt
- Maximális érték
A fent említett S2 specifikáció esetén ilyen határértékek például:
- két szám összege egyenlő a harmadikkal
- mindhárom szám 0
Figyelni kell a kimeneti ekvivalencia-osztályok határértékeit is. Ehhez persze sokszor „visszafelé” kell gondolkodni, tehát meg kell határozni azon input értékek halmazát, amelyek határértékként kezelhető kimeneteket produkálnak.
Van olyan elv, mely szerint a > és < típusú szabályoknál elegendőnek tekinti 2 eset alkalmazását, hiszen például < esetén a határ, és a felső szomszédja definíció szerint ugyanazt az eredményt kellene, hogy produkálja. Mi használjuk nyugodtan mindig mind a két szomszédot minden esetben, sokkal jobb lefedettséget ad, és gyakrabban tár fel hibákat, mint amennyi plusz időbe kerül az alkalmazásuk. Sajnos a sokszor a specifikáció pongyola, mint például: „A kedvezmény 25000 dollár alatt 7%, afölött pedig 8,5%.” Folyószövegként olvasva fel sem tűnik, viszont teszteset tervezés közben már szemet kell, hogy szúrjon, hogy ez a megfogalmazás nyitva hagyja a kérdést, hogy kereken 25000 dollárnál mennyi az elvárt kedvezmény, például:
A kimeneti és bemeneti értékek meghatározásánál ügyelnünk kell a minimális növekmény léptékére. Egész számoknál a lépték 1, viszont lebegőpontos számoknál nekünk kell meghatároznunk egy tűrést, amin belül az értékek már különbözőnek tekinthetők. Általában elegendő, hogy tizedesekben gondolkodunk, nem mindig érdemes precízen figyelembe venni az aktuális fizikai számábrázolást az adott futtatási környezetben. Hogy érthetőbb legyen, pl. ha a határunk 15, és lebegőpontos a tartomány, akkor a 14.9; 15; 15.1 jó tesztesetek lehetnek. Érdemes külön kezelni a 15 és a 15.0 eseteket, amik nekünk logikailag ugyan egyenértékűek, de konvertálástól függően a tesztelt rendszerben számíthatnak két külön értéknek. Ne feledkezzünk meg arról, hogy ahány határérték van, annyiszor szükséges a lebegőpontos számok tesztelése is!
A határérték-elemzés tesztlefedettégét az alábbi művelettel tudjuk elvégezni:
Példa
Specifikáció: hozzunk létre egy olyan programot, ami a bemeneti érték megadása után következő naptári napot határozza meg kimeneti értékként.
Specifikáción belüli halmazok definíciója:
- Gergely-naptár alapján történő számolás
- az év és a nap jelölése csak számformátumú lehet
- a hónap csak szöveges formátumú legyen (ezen belül csak a kisbetű és magyar karakterkészlet engedélyezett)
Feladat: határozzuk meg a specifikáció alapján a bemenet és kimenet ekvivalencia-osztályait és határértékeit.
A tesztelés elkezdése előtt bizonyosodjunk meg, hogy a specifikáció minden elemét értelmezzük – jelen esetben azt, hogy a Gergely-naptár alapján történő számolás milyen egyéb feltételeket tartalmaz, amik hatással lehetnek a jelen program tesztelésére.
Gergely-naptár: Itáliában az új naptár 1582. október 4-én csütörtökön lépett életbe oly módon, hogy az azt követő nap október 15. lett (az új naptár bevezetésének ideje országonként eltérő volt; Magyarországon ez a dátum nem volt feljegyezve, ezért az itáliai dátumot vesszük alapul).
Ekvivalencia-osztályok meghatározása
Az ekvivalencia-osztályok meghatározásában meghatározzuk magát a bemenetet, valamint az érvényes és érvénytelen feltételeket, mely példánk szerint így néz ki:
Az ekvivalencia-osztályok meghatározása után – a teljesség igénye nélkül, szemléltetésképp – az alábbi táblázatban láthatók a főbb tesztelendő esetek. Kimenetnek nevezzük a bemeneti érték után kapott eredményt, mely érvényes és hibás lehet. A megjegyzés oszlop csak jelen feladat jobb szemléltetését képezi.
Határérték-elemzési pontok meghatározása során meghatározzuk magát az érvényes bemenetet, valamint a tesztelendő feltételeket, melyek egyaránt tartalmazzák az érvényes és hibás bemeneteket is. A táblázatban a zárójellel jelzett értékek egyaránt részét képezik az ekvivalencia-osztályozásnak és a határérték-elemzésnek.
Felhasznált források:
- https://www.guru99.com/equivalence-partitioning-boundary-value-analysis.html
- https://regi.tankonyvtar.hu/hu/tartalom/tamop425/0046_szoftverteszteles/ch04s03.html
- https://inf.mit.bme.hu/sites/default/files/materials/category/kateg%C3%B3ria/oktat%C3%A1s/msc-t%C3%A1rgyak/szoftverellen%C5%91rz%C3%A9si-technik%C3%A1k/11/SZET-2011-EA07a_specifikacio_alapu_teszteles.pdf
- https://gyires.inf.unideb.hu/KMITT/c12/ch04s03.html#d0e1855
- https://gyires.inf.unideb.hu/teszt/Szoftverteszteles_a_gyakorlatban.pdfhttps://dcs.uni-pannon.hu/files/docs/users/csertangyorgy/smandt/07_Specifikacio_alapu_teszteles.pdf