[[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]]
===== Kézi tesztelés =====
Teszteléshez_sablon
* [[https://szit.hu/download/oktatas/teszt_sablon.xlsx]]
===== 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/