[[oktatas:programozás|< Programozás]] ====== Tesztelés ====== * **Szerző:** Sallai András * Copyright (c) 2014, Sallai András * Szerkesztve: 2014, 2015, 2017 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Bevezetés ===== A szoftverek **minőségének biztosítása** érdekében azokat tesztelni szoktuk. Tesztelünk mielőtt átadjuk az ügyfelünknek használatra. Ezzel megpróbáljuk a szoftver hibáit megszüntetni. Teljesen lehetetlen, de mindent meg kell tennünk, hogy minél kevesebb hiba maradjon benne. A tesztelés során átnézzük a forráskódot, vagy elindítjuk a programot és használjuk, vagy automatizált teszteket futtatnunk. A keresett hibák halmazát nevezzük **hibamodellnek**. ===== Teszteset ===== A tesztelés során megadott megfelelő bemenő és kimenő adatok, amelyek valószínűleg még felfedetlen hibákat mutatnak meg, jó tesztesetnek nevezzük. Teszteset példa: A feladat egy háromszög területének kiszámítása. A képlet a következő: Δ terület = (alap * magasság)/2 * Lehetséges bemenőadatok: * alap: 30 * magasság: 35 * Ekkor a kimenő adat: * (30*35)/2 = 525 ===== Alapelvek ===== * A tesztelés felderíti a hibákat, de az sosem derül ki, hogy nincs több hiba. * Általában csak a magas kockázatú részeket teszteljük. * A tesztjeinket folyamatosan fejleszteni kell. * A magas kockázatú részeket teszteljük. * A megfelelő teszteset kiválasztása: a bemenő és kimenő adatokat együtt adjuk meg. * Ha egy teszteset nem ismételhető, akkor az kerülendő. * Érvényes és érvénytelen adatokra is tesztelünk. * Megfelelő tesztelőt kell választani: * Ez általában a program írójától különböző ember. ===== Tesztelési technikák ===== ==== A tesztelési technikákról ==== Alapvetően kétféle tesztelési technikát különböztetünk meg: * statikus * dinamikus {{:oktatas:programozás:teszteles_001.png|}} A tesztelés lehet statikus és dinamikus. Statikus tesztelésről beszélünk, amikor nem fordítjuk, nem futtatjuk a programot, csak a forráskódot vizsgáljuk. Dinamikus tesztelés esetén a forráskódot és futó programot is vizsgáljuk. {{:oktatas:programozás:teszteles_002.png|}} ==== Statikus tesztelés ==== === A statikus tesztelésről === A statikus tesztelés lehet szimplán a kód ellenőrzése. Készíthetünk kereszthivatkozási táblázatokat, vagy tartalmilag ellenőrizzük forráskódot. A forráskódban ellentmondásokat kereshetünk. Például felhasználatlan objektumokat vagy felhasználatlan változóértékeket kereshetünk. {{:oktatas:programozás:teszteles_003.png|}} A kódellenőrzés alkalmával összehasonlítjuk a megvalósítandó algoritmust a megírt kóddal. Leghatékonyabb módszer, ha egy avatatlan személynek elmagyarázzuk a kódunk működését sorról sorra. === Kódellenőrzés === {{:oktatas:programozás:teszteles_004_kodellenorzes.png|}} === Kereszthivatkozás tábla === {{:oktatas:programozás:teszteles_005_kereszthivatkozastabla.png|}} {{:oktatas:programozás:teszteles_006_kereszthivatkozastabla_pelda.png|}} {{:oktatas:programozás:pelda_program.png|}} === Tartalmi ellenőrzés === {{:oktatas:programozás:teszteles_007_tartalmi_ellenorzes.png|}} === Ellentmondáskeresés === Felhasználatlan változóérték: i := 1 ciklus i:= 1-től 5-ig ... ciklus vége Ha a ciklus előkészíti az i változó értékét, akkor felesleges volt 1 érték beállítása. Érték nélküli változó: ha f akkor i := 1 különben j := 1 k := i Nem változó értékadás: i := 1 * i - 0 Azonos igaz/hamis logikai formulák: i<1 és i>= 100, i < i + 1 Az i nem lehet egyszerre 1-nél kisebb és 100-nál nagyobb. Konstans értékű kifejezés: x := a^2 - b^2 - (a + b) * (a - b) Eredménye mindig 0. Másik konstans értékű kifejezés: y := cos(x) / sin(x) * tan(x) Az eredménye mindig 1. Végtelen ciklus: ciklus i := 1-től -- n-ig i := 1 ciklus vége Érték nélküli függvény, operátor: függvény absz(x): egész ha x < 0 akkor absz := -x függvény vége Mellékhatással járó függvény: a1 := f(x) + f(x) a2 := 2 * f(x) Előfordulhat, hogy a két kifejezés értéke különböző. ==== Dinamikus tesztelés ==== A dinamikus tesztelés során fordítunk és tesztelünk, és a fordítótól eltérő eszközöket is használhatunk. === A dinamikus tesztelés felosztása === A **dinamikus** tesztelés esetén futtatunk. Futtatjuk a programot, megpróbáljuk végrehajtani. Ha a forráskód rendelkezésre áll, akkor fehér-dobozos tesztről beszélünk, ha nem fekete-dobozos tesztről. * fehér-dobozos * fekete-dobozos {{:oktatas:programozás:teszteles_008_dinamikus_teszteles.png|}} === Fehér-dobozos tesztelés === A **fehér-dobozos** tesztet vagy angolosan white-box a **forráskód alapján** készítjük. Hozzáférünk a struktúrákhoz, a megvalósításhoz. Jellemzően a **fejlesztők** végzik. {{:oktatas:programozás:teszteles_009_feher-dobozos.png|}} A tesztelésnek a következő **céljai** lehetnek: * funkció * képesség (feature) * minőség * tranzakció * strukturális elem A következő **struktúrákat** teszteljük: * kódsorok * szelekciók * iterációk * metódusok * osztályok * funkciók * modulok Felmerül a lefedettség kérdése. Ez alatt értjük, hogy a a struktúrák hány százalékát tudjuk tesztelni a meglévő tesztekkel. === Fekete-dobozos tesztelés === A **fekete dobozos** teszt esetén, ahol nem férünk hozzá a forráskódhoz, a **specifikáció alapján** tesztelünk. Az ilyen teszteket jellemzően **nem a fejlesztő** csapat végzi. A fekete dobozos módszerek: * ekvivalenciaosztályok keresése * határeset-elemzés === Ekvivalencia osztályok keresése === Keressük a jó teszteseteket, ahol olyan bemenőadatokat keresünk, amelyek minél több feltételnek felelnek meg. Keresnünk kell valamilyen szempontot, amelyek alapján csoportosíthatjuk a bemenő adatokat. Az így kialakított csoportokat nevezzük osztálynak. Olyan tesztesetet keresünk, amely jellemző az adott csoportra. Egy csoportból bármely elemet kiválasztva, ha hibát kapunk, a csoport egy másik elemét kiválasztva valószínűleg hibát kell kapnunk. Ha a csoport egy elemére megfelelő eredményt kapunk, akkor a valószínűleg a többire is ezt kell kapjuk. Ha bemenő adatok egy értéktartományt alkotnak, kétféle ekvivalencia osztályunk lehet: * érvényes -- azok az adatok, amelyek megengedettek * érvénytelen -- azok az adatok, amelyek a tartomány alatt és felett állnak Ha például a lehetséges értékek 0 és 10 között vannak, beleértve a 0 és 10-es számot is, akkor a ezt így írhatjuk fel: Érvényes ekvivalencia osztály: 0<= n <= 10 Érvénytelen ekvivalencia osztály: n<0 és n>10 Lehetséges, hogy akkor beszélhetünk érvényes ekvivalencia osztályról, ha bemenő adatok száma megadott számú. Például 6 adat érvénytelen. Ha 6-nál több adat, vagy kevesebb, alkotja az érvénytelen ekvivalenciaosztályt. Lehetséges, érvényes bemenő adatokra valamilyen jellemző. Például 2 hatványai. Ekkor érvényes ekvivalencia osztály: * 2, 4, 8, 16, 32, 64, stb. Érvénytelen: * a több szám === Határeset-elemzés === Az ekvivalencia osztály határon lévő elemeit vizsgáljuk. Ez tekinthető az ekvivalencia osztály kiegészítésének. Ha az érvényes tartomány, nem szigorúan véve 0 és 10 közé esik, akkor a vizsgálandó érvényes adatok: * 0, 10 Érvénytelen vizsgálandó adatok: * -1 és 11 Adott darabszám esetén, ha pontosan 6 adat a bemenet, akkor érvényes adatként vizsgálunk 6 darab adatot, érvénytelenként 5 és 7 darab adatot. {{:oktatas:programozás:teszteles_010_fekete-dobozos.png|}} === Összefoglalva === {{:oktatas:programozás:teszteles.png|}} ===== Tesztelési tevékenység ===== A tesztelési folyamatot a tervezéstől a végeredményig a következőkben foglalhatjuk össze: * tesztterv készítés * végrehajtás * kilépési feltételek vizsgálata * eredmények értékelése * jelentést készítünk Kilépési feltételek: Megnevezzük azokat a feltételeket, amikor befejezhetjük a tesztelést. {{:oktatas:programozás:tesztelesi_tevekenyseg.png|}} {{:oktatas:programozás:dinamikus_teszt_tervezes_001.png|}} {{:oktatas:programozás:dinamikus_teszt_tervezes_002_celok.png|}} {{:oktatas:programozás:dinamikus_teszt_tervezes_003_esetek.png|}} {{:oktatas:programozás:dinamikus_teszt_tervezes_004_folyamat.png|}} ===== Verifikáció és validáció ===== ^ Verifikáció ^ Validáció ^ | Jól terveztem meg? \\ A tervezésre és a \\ kivitelezésre vonatkozik. | Ami elkészült az jó? \\ Az ügyfélnek megfelel a termék? | ===== Tesztek osztályozása ===== * Funkcionális tesztelés - bizonyos funkciók működnek-e * Példák.: keresés, süti tárolásra kerül (böngészőben) * UI teszt * Példák: olvasható fontok, megfelelő színek, igazítások, kép láthatósága * Biztonsági teszt * Példák: inaktivitás után automatikus kilépés működik? * Adatbázisteszt * Példák: * hibák a lekérdezések során * válaszidő? * minden adat megjelenik a UI-on? * Cross Browser kompatibilitás * Safari, Firefox, Edge, Google Chrome, Vivaldi, Opera, stb. * Teljesítményteszt * Az alkalmazás válaszideje * Eszközök: JMeter, Loadrunner stb. * Használhatósági teszt * menük, képek, űrlapok szövegdobozok, linkek * Közösségi tesztelés (crowd vagy crowdsourced testing) * Valós felhasználók tesztelik az alkalmazást ==== A tesztelés szintjei ==== * egységtesztelés * integrációs tesztelés * rendszer tesztelés * elfogadási teszt ===== Függelék ===== ==== Feketedobozos teszt egyik formájára példa ==== === A program === Adott egy egyszerű program, amelyben szavakat tárolunk egy listában. A listához felvehetők újabb elemek, a meglévő szerkeszthetők, törölhetők. {{:oktatas:programozás:listaszerkesztoprogram.jpg|}} Legfelül látjuk a szavak listáját, alul egy szerkesztőmező. A szerkesztőmező alapértelmezésként üres. Ha szerkesztőmezőbe egy újabb szót írok, a "Hozzáadás" gombra kattintva az új elem a listába kerül. A "Szerkesztésre" gombra kattintva a program a listában kijelölt elemet a szerkesztőmezőbe másolja. === Illegális karakter === A szerkesztőmezőben illegális karakter a magyar ábécétől eltérő karakter. Ha beírok például egy "+" karaktert, a program a következő módon reagál... === Üres elem felvitele === A szerkesztő mező üres, és kattintok a "Hozzáadás" gombra, hibás ha listában egy üres elem jelenik meg. A programban a hiba javítva van, ilyenkor egy üzenet ablakot is feldob, amelyben tájékoztat, hogy üres adatot próbáltunk meg bevinni. ==== Ekvivalencia partíconálás ==== Equivalence partitioning, amelyet Equivalence Class Partitioning néven is említünk vagy csak röviden ECP. Egy szoftvertesztelési technika, ahol a bemenő adatokat ekvivalencia osztályokba soroljuk, vagyis csoportosítjuk. Az egy ekvivalencia osztályba sorolt hibák előfordulása, ugyanazt a hibást eredményt adják. Két típusú ekvivalencia osztályt kell keresnünk. Az egyik amikor érvényesek a bemeneti adatok, a másik amikor érvénytelenek. ==== Teljesítményteszt ==== {{:oktatas:programozás:teljesitmenyteszt.png|}} ==== A tesztek szintekre osztása ==== * komponensteszt * integrációs teszt * rendszerteszt * átvételi teszt ==== Futási idő tesztelése ==== :: Szerző: @ScottStafford :: Forrás: http://stackoverflow.com/questions/673523/how-to-measure-execution-time-of-command-in-windows-command-line (2015) :: Kicsit átírta: Sallai András :: Használat: c:\>timecmd [parancs] @echo off @setlocal set start=%time% :: runs your command cmd /c %* set end=%time% set options="tokens=1-4 delims=:." for /f %options% %%a in ("%start%") do set start_h=%%a&set /a start_m=100%%b %% 100&set /a start_s=100%%c %% 100&set /a start_ms=100%%d %% 100 for /f %options% %%a in ("%end%") do set end_h=%%a&set /a end_m=100%%b %% 100&set /a end_s=100%%c %% 100&set /a end_ms=100%%d %% 100 set /a hours=%end_h%-%start_h% set /a mins=%end_m%-%start_m% set /a secs=%end_s%-%start_s% set /a ms=%end_ms%-%start_ms% if %hours% lss 0 set /a hours = 24%hours% if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins% if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs% if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms% if 1%ms% lss 100 set ms=0%ms% :: mission accomplished set /a totalsecs = %hours%*3600 + %mins%*60 + %secs% echo Felhasznalt: %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total) Egyéb program: * [[http://www.pc-tools.net/|ptime]] ===== Linkek és források ===== ==== Linkek ==== * http://sourceforge.net/projects/lxr/ * http://www.tesztelesagyakorlatban.hu/ (2018) * http://www.tesztelesagyakorlatban.hu/keres_cikk.php?mit=40 * http://www.tesztelesagyakorlatban.hu/keres_cikk.php?mit=6 * http://grinder.sourceforge.net/ * http://www.opensourcetesting.org/ * http://www.pc-tools.net/win32/ptime/ (Futási idő mérése ptime paranccsal) ==== Forrás ==== * http://progalap.elte.hu/downloads/seged/eTananyag/ (2014) * http://www.tankonyvtar.hu/hu/tartalom/tamop425/0046_szoftverteszteles/ (2014) * https://tananyagbank.nive.hu/ (Lénárt György Programozás - Szoftverek tesztelése, dokumentálása) (2014) ==== Snyk ==== * https://en.wikipedia.org/wiki/Snyk * https://www.npmjs.com/package/snyk * https://snyk.io/