This is an old revision of the document!
Table of Contents
Techniky návrhu testovacích scénářů, jednotkové testy, automatické funkční testy, testovací strategie, testovací data
- Organizace testování, typy testů, V-model a W-model.
- Určení vstupních dat do testů: Mezní podmínky, třídy ekvivalence.
- Určení vstupních dat do testů: Párové testování, kombinatorické testování.
- Vytváření testovacích scénářů: Procesní testy - model problému, jak vypadá testovací scénář, kritérium pokrytí Test Depth Level, vytváření testů.
- Vytváření testovacích scénářů: Testy konzistence dat - model problému, jak vypadá testovací scénář, vytváření testů.
- Způsoby vytváření testovacích dat.
- Jednotkové testy: princip testu, vlastnosti, které má mít jednotkový test, odlišnosti proti integračním testům.
- Automatizované testy založené na simulaci akcí uživatele v uživatelském rozhraní systému: princip testu, příklad technologie, rozdíl oproti jednotkovým testům.
- Testovací strategie: princip metody Business Driven Test Management, její základní části a jejich souvislosti.
Organizace testování
Organizace testování, typy testů, V-model a W-model.
Proč testovat software - člověk zanese chybu, která způsobí selhání systému ⇒ Defekty je potřeba najít, než se systém začne používat. Terminologie - obecně nejednotná - v předmětu dle ISTQB foundation level sylabu a TMAP Next , tak aby nepřekrývala ISTQB standard
Verifikace - Proces vyhodnocování, jestli produkt konkrétní vývojové fáze odpovídá požadavkům na tento produkt definovaným na začátku této fáze.
Validace - Vyhodnocování software v průběhu nebo na konci jeho vývoje, jestli software odpovídá zadaným požadavků.
7 základních principů testování
- Testování ukazuje přítomnost defektů - Testování může ukázat, že jsou defekty přítomny, ale nemůže dokázat, že v softwaru nejsou žádné defekty.
- Vyčerpávající testování je nemožné - Testování všeho (všech kombinací vstupů a vstupních podmínek) není realizovatelné s výjimkou triviálních případů ⇒ musí se stanovit priority
- Včasné testování - Testovací aktivity by měly v rámci životního cyklu vývoje softwaru nebo systému začít tak brzy, jak je to jen možné, a měly by být zaměřeny na definované cíle.
- Shlukování defektů - Malé množství modulů obsahuje většinu defektů zjištěných v průběhu testování před uvolněním, nebo je zodpovědné za nejvíc provozních selhání.
- Pesticidní paradox - Jsou-li stále opakovány tytéž testy, časem stejný soubor testovacích případů nenalezne žádné nové defekty ⇒ Je potřeba existující testovací případy pravidelně revidovat a upravovat a je potřeba napsat nové, odlišné testy
- Testování je závislé na kontextu - Testování je vykonáváno odlišně v různých kontextech (Bezpečnost, Acessibility,..)
- Falešná představa o neexistenci omylů - Nalezení a opravení defektů nepomůže, pokud je vytvořený systém nepoužitelný a nesplňuje potřeby a očekávaní uživatelů.
Typy Testů
Typy testů se dají kategorizovat podle několika různých pohledů:
- Podle test levels:
- Vývojářské testy
- Integrační testy
- Systémové testy
- Uživatelské akceptační testy
- Podle technického postupu testu nebo charakteristiky kvality systému:
- Unit testy kódu
- Funkční testy
- E2E (end-to-end) testy
- Zátěžové testy
- Penetrační testy
- Testy provozuschpnosti na platformě
- Crash testy a testy zotavení systému
- Podle znalosti vnitřní struktury:
- Black-box testing
- White-box testing
- Grey-box testing
- Podle toho, kdo a kde testuje:
- Alfa testy
- Beta testy
V-model
Test Basis - Definice dle ISTQB: Dokumentace, na jejíž základě jsou vytvářené testovací scénáře. Zde je to část V směřující dolů ('\')
Test Level - Skupina testovacích aktivit, které jsou organizované a řízené jako jeden blok. Má svůj samostatný cíl. Zde část V směřující vzhůru ('/')
Nevýhoda V-modelu
Bohémův zákon - Chyby jsou nejčastější ve fázích požadavků a návrhu a čím později odhalíme chybu v průběhu vývoje systému, tím je dražší
Přesně to se děje u V modelu, resp. drahé chyby způsobené špatnými požadavky odhalujeme až ke konci testování.
W-model
- Každé fázi přípravy systému odpovídá kontrolní fáze
- V praxi levnější než předělávání a opravy na poslední chvíli, ale vyžaduje počáteční investici, proto není příliš rozšířený
Určení vstupních dat do testů: Mezní podmínky, třídy ekvivalence.
- Jak vhodně nakombinovat hodnoty (data) ve vstupech pro rozhodovací bod?
⇒ Můžeme vytvořit klasifikační strom pro každý rozhodovací bod v aplikaci
- Uzly = classification ~ jednotlivé vstupy pro rozhodovací bod (příklad: políčka z webového formuláře, část podmínky v procesu rozhodování, …)
- Listy = třídy ekvivalence pro danou classification
Třídy ekvivalence (Equivalence class - EC)
„Do vstupu můžu zadat velké množství hodnot. Jak vybrat vhodnou množinu pro test?“ → Konkrétní množinu hodnot, které jsou zadat do vstupu, rozdělíme na podmnožiny - třídy ekvivalence:
- Systém se má podle specifikace (na základě které testujeme) pro všechny hodnoty z konkrétní třídy ekvivalence chovat stejným způsobem
Konkrétní hodnoty (data) pro test pak vybereme z vytvořených tříd ekvivalence. Kolik jich vybrat? Záleží, jaké chceme mít *testovací pokrytí*
Typy
- Dle typu vstupu:
- Interval - Například pro: částka, věk, číslo účtu
- Hranice intervalu = mezní podmínky (viz dále)
- Diskrétní hodnoty - Například pro: typ prohlížeče, metoda platby, položka v menu, výběr z položek v číselníku
- Nejsou mezní podmínky
- Dle validity dat:
Typ třídy ekvivalence | Co znamená pro aplikaci | Příklad: políčko pro číslo účtu |
- | - | - |
Nevalidní třída ekvivalence z technického pohledu | Data, která neodpovídají datovému typu vstupu = neplatná data, která aplikace musí ošetřit, aby nezpůsobila pád | Řetězec; Číslo, ale jako číslo účtu nevalidní formát |
Nevalidní třída ekvivalence z business pohledu | Data, která sice odpovídají datovému typu vstupu, ale z pohledu specifikace business procesu jsou nevalidní | Číslo účtu ve validním formátu, ale mimo nadefinovaný rozsah číselné řady účtů; Číslo účtu ve validním formátu ve stejné bance, ale takový účet neexistuje |
Validní třída ekvivalence | Platná data, která mají být zpracovávána podle business specifikace, vyvolávají korektní průběhy procesů v aplikaci | Číslo účtu ve validním formátu v jiné bance, ale takový účet neexistuje; Existující číslo účtu ve stejné bance; Existující číslo účtu v jiné bance |
Pravidla konzistence při určování tříd ekvivalence:
- Třída ekvivalence nesmí být prázdná (tj. určíme nějakou podmínku, která bude vymezovat data v ní, ale žádná data nebo případy jí nebudou odpovídat)
- Žádné dvě třídy ekvivalence nesmí mít neprázdný průnik
- Sjednocení všech tříd ekvivalence musí být původní
- interval (pro typ interval)
- množina (pro typ diskrétní hodnoty)
Jak určit třídy ekvivalence?
- U diskrétních hodnot: Analýza požadavků a specifikace
- U intervalu: Analýza požadavků a specifikace pomocí techniky mezních podmínek
Mezní podmínky
- ISTQB definice: Hodnota, která tvoří hranici mezi třídami ekvivalence, nebo je o malý inkrement posunutá na jednu ze stran této hranice
- Přesnost dané hodnoty
- Přesnost daná datovým typem (Příklad: SQL typ DECIMAL(10,4) se 4 desetinnými místy)
- Přesnost daná specifikací (Příklad: Částku transakce účtujeme se 2 desetinnými místy. Zaokrouhlovací rozdíly se řeší opravnými položkami.)
- Iterace kolem hranice třídy ekvivalence:
- M – mezní hodnota, tvořící hranici třídy ekvivalence
- I – nenulová nejmenší hodnota, kterou jde uložit
- Testujeme M, M + I, M - I
- Vazba mezních podmínek na typy tříd ekvivalence:
Typ třídy ekvivalence | Kde vzít mezní podmínky | Jak je najít | Příklad: věk pasažéra |
- | - | - | - |
Nevalidní třída ekvivalence z technického pohledu | Technické limity daného vstupu (někdy i specifikace) | Rozsah hodnot pro validní vstup; Datový typ v programu; Datový typ v databázi | Políčko pro věk pasažéra má rozsah platné hodnoty 0-150 |
Nevalidní třída ekvivalence z business pohledu | Požadavky; Specifikace | Informace ve specifikaci, že určité hodnoty (daný rozsah hodnot) nejsou povoleny nebo jsou ze zpracování vyloučeny | Limit věku je 150 let |
Validní třída ekvivalence | Požadavky; Specifikace | Informace ve specifikaci, že od určité hodnoty (pro daný rozsah hodnot) dochází ke konkrétní variantě zpracování | Pasažér od 2 let má vlastní sedadlo; Pasažér do 6 let musí letět s rodiči |
Určení vstupních dat do testů: Párové testování, kombinatorické testování.
Jak nyní určíme vhodné kombinace dat v jednotlivých vstupech rozhodovacího bodu, aby naše testy našly co nejvíce chyb (v limitech toho, jakou kapacitu na ty testy máme)?
Technika | Množství kombinací → testovací pokrytí | Co testujeme (jen pro orientaci - berte s rezervou!) |
- | - | - |
MCC – Multiple Condition Coverage | Kompletní množina všech kombinací | Kritický SW – letadlo, lékařské přístroje, … |
MC/DC – Multiple Condition/Decision Coverage | Všechny kombinace, které mají vliv na výsledek rozhodovacího výrazu | |
Pairwise testig (pokrytí je škálovatelné, pozice zde je pro kompletní kombinaci všech dvojic) | Výrazně menší počet kombinací, ale dle statistik stále odchytí většinu chyb | Důležité části nekritického SW: Jádro programu, výpočty, které musí být správně |
C/DC – Condition/Decision Coverage | Relativně malý počet kombinací pro testy střední / nízké intenzity | Nekritický SW – funkční testy |
CC – Condition Coverage | Relativně malý počet kombinací pro testy střední / nízké intenzity | Nekritický SW – funkční testy |
DC – Decision Coverage | Relativně malý počet kombinací pro testy střední / nízké intenzity | Nekritický SW – funkční testy |
Párové Testování (Pairwise Testing)
- Statistika: Pokud je někde v software defekt, aktivuje se nejčastěji buď
- hodnotou jednoho konkrétního vstupu
- kombinací hodnot ve dvou vstupech
- Princip: Místo testování všech možných kombinací vstupních hodnot (což by mohlo být obrovské množství) testujeme všechny dvojice (páry) vstupních hodnot.
- Proč to funguje:Statisticky většina chyb vzniká buď na základě jedné konkrétní vstupní hodnoty, nebo na základě kombinace dvou vstupů. Situace, kdy chyba vznikne až kombinací tří a více vstupů, jsou vzácné.
Příklad
- klasifikační strom pro vstupy:
- Počet kombinací = (počet EC v prvním vstupu) * (počet EC v druhém vstupu) * (počet EC v třetím vstupu) = 3 * 2 * 2 = 12
- Kompletní pokrytí všemi možnými kombinacemi – 12 variant k otestování:
- Párové testování: V každém páru vstupů jsou pokryty všechny kombinace – 6 variant k otestování:
Kombinatorické Testování
- Existují různé metody, jak vybrat z možných kombinací vhodné hodnoty pro výsledné testovací scénáře tak, aby pokrytí systému bylo co největší
- příklad testovaného výrazu:
- Condition coverage (CC)
- Výstup každé podmínky (TRUE / FALSE) je vyhodnocen alespoň jednou
- Decision coverage (DC)
- Alespoň jednou jsou vyhodnoceny všechny možné výstupy nějakého vyhodnocení ((A AND B) OR C)
- Condition / Decision coverage (C/DC)
- Spojení CC a DC
- MCC (Multiple Condition Coverage)
- Všechny možné kombinace výsledků podmínek v logickém výrazu jsou testovány alespoň jednou.
- Nejvyšší úroveň pokrytí.
- Počet kombinací: pro obecný klasifikační strom: (počet EC ve vstupu1) * (počet EC ve vstupu2) * (počet EC ve vstupu3) …
- Příklad:
- MC/DC (Modified Condition/Decision Coverage):
- Každý z výsledků všech podmínek v logickém výrazu je otestován alespoň jednou a zároveň každá z podmínek nezávisle ovlivnila výsledek logického výrazu(tím, že měníme pouze vstupní hodnoty pro tuto podmínku, zatímco vstupní hodnoty pro ostatní podmínky držíme zafixované)
- Pracuje s termínem neutrální hodnota
- Příklad: na slidech 24 - 33
Vytváření testovacích scénářů: Procesní testy
Model Problému
- Testovaná aplikace se modeluje jako orientovaný graf nebo zjednodušený UML activity diagram.
- Uzly grafu = větvící body (rozhodovací body).
- Hrany grafu = přechody (akce) mezi uzly.
- Testovací scénář je sled (sekvence) akcí, kterými aplikace prochází z počátečního do koncového stavu.
Jak vypadá testovací scénář
- Je to konkrétní průchod grafem od startu do konce.
- Obsahuje:
- sekvenci vstupních a výstupních akcí pro jednotlivé uzly,
- všechny potřebné kombinace podle požadované úrovně pokrytí.
(viz vytváření testů)
Kritérium Pokrytí Test Depth Level
Hloubka pokrytí | Popis | Kdy použít (typicky) |
- | - | - |
1 | Každá akce (hrana grafu) se vykoná jednou | Testy málo prioritních akcí, smoke testy |
2 | Pro každé větvení (uzel) projdeme všechny kombinace možných vstupních akcí do uzlu a výstupních akcí z uzlu | Střední úroveň testování |
3 | Pro každé větvení (uzel) projdeme všechny kombinace možných vstupních akcí do uzlu a 2 na sebe navazujících výstupních akcí | Vysoká intenzita testů |
N | Pro každé větvení (uzel) projdeme všechny kombinace možných vstupních akcí do uzlu a N-1 na sebe navazujících výstupních akcí |
Vytváření Testů
- Modelujeme aplikaci jako orientovaný graf.
- Identifikujeme vstupní a výstupní akce v každém rozhodovacím bodě.
- Určíme potřebnou úroveň pokrytí (TDL).
- Generujeme sekvence testů:
- Kombinujeme akce tak, aby pokryly všechny požadované cesty.
- Minimalizujeme opakování, pokud už je kombinace pokrytá.
- Při omezených zdrojích preferujeme:
- prioritní akce (z pohledu businessu nebo rizika),
- nejdůležitější průchody.
Vytváření testovacích scénářů: Testy konzistence dat
Model Problému
- Data v systému mají životní cyklus: C (create) → R (read) → U (update) → D (delete)
- Různé funkce aplikace provádějí různé operace na datových entitách.
- Konzistence znamená, že:
- Data, která uložíme, poté správně přečteme.
- Aktualizace nezpůsobí nečekanou chybu.
- Smazání (nebo archivace) odpovídá očekávání systému.
- Mezi funkcemi a datovými entitami je obecně M:N vztah (více funkcí pracuje s více entitami).
Jaké jsou možné chyby?
- Některá z operací C, R, U, D není vůbec implementovaná
- Některá z operací C, R, U, D neprobíhá správně
- Pokud se operace C, R, U, D vykonají mimo očekávaný průběh, naruší se konzistence dat
- Operace D není ve sktečnosti delete, ale jen archivace. Ale některé z funkcí tesotvaného systému pracují s archivovanou entitou stále jako s aktivní…
Jak vypadá testovací scénář
Skládá se z posloupnosti operací:
- začíná Create,
- následují různé kombinace Read a Update,
- končí Delete.
Po každé operaci C, U, D se doporučuje spustit Read, abychom ověřili aktuální stav dat.
- Jednou R pro nejdůležitější funkci, která zobrazuje datovou entitu
- základní pokrytí
- Vícekrát pro různé funkce, které zobrazují datovou entitu
- kompletní pokrytí R
Kompletní pokrytí znamená testovat různé funkce, které čtou nebo mění entitu, nejen jednu hlavní.
Vytváření testů
- Sestav CRUD matici:
- řádky = funkce aplikace,
- sloupce = datové entity,
- v buňkách = které CRUD operace daná funkce nad entitou vykonává.
- Udělej statickou kontrolu:
- Mají všechny entity všechny potřebné CRUD operace?
- Pokud ne, proč?
- Udělej dynamické testy konzistence:
- Ověř, že kombinace operací nevede k poškození dat.
- Sleduj, zda některá funkce nezpůsobí chybu, která se projeví až v jiné funkci.
- Prioritizuj testy:
- Pokud nemůžeš pokrýt všechny kombinace, testuj prioritně nejdůležitější funkce a cesty.