3 March 2015

A jó manuális teszt nem automatizálható

2014. június 5-én, a budapesti Teszt & Tea rendezvényen elhangzott előadásom automatizálást érintő  részlete.

Az egyik üzenetem a négy hónappal ezelőtt előadó egyik kollégának szól, aki azt mondta, „milyen jó lenne, ha minden tesztelés automatizált lenne”. Nos, nem lenne jó és azt is elmondom, hogy miért.

Amikor egy ember hajt végre egy tesztet, képességeinek és érzékszerveinek teljes skáláját viszi harcba. Improvizálhat közben, tetszés szerint változtathat például az előre eltervezett lépéssorrenden, vagy a végrehajtás sebességén valamilyen érdekes, de előre nem látható információ hatására. Észrevehet nem várt, vagy előzetesen elképzelhetetlennek hitt dolgokat. Az emberi kiszámíthatatlanság önmagában is egy teszt variáló tényező. Ezek a variációk újabb és újabb problémákat fedhetnek fel. 

Az automatizálás során egyszerűen arra kérjük a számítógépet, hogy az általunk explicit módon specifikált utasításokat a megadott sorrendben hajtsa végre. A gép természetesen minden egyes alkalommal fáradhatatlanul teszi a dolgát, de ugyanazzal a sebességgel, (jellemzően) ugyanabban a lépéssorrendben, ugyanazokat a szimulált egérmozdulatokat használva stb. És nem rendelkezik a humán tesztelő készségeivel, hallgatólagos tudásával (tacit knowledge) ill. az érzékelésének előnyeivel. Az eredmények automatikus kiértékelésének szintén megkerülhetetlen korlátai vannak. A felkészült emberi agy jobb bármilyen elképzelhető automatánál.


Ember
Számítógép
fáradtság, szétszórtság

+
zavar
?
+
érzékelés
+

intuíció
+

kíváncsiság
+

gyanú
+

nyomozás
+

megismételhetőség

+
eltérés tervezett úttól
+

kiszámíthatóság

+
kritikus gondolkodás
+


Az automatizált tesztelés (vagy az ennek nevezett folyamat) tehát mindössze halvány leképzése egy intellektuálisan szerteágazó tevékenyégnek. Ezért nonszensz úgy beszélni az automatizált tesztekről, mintha azok gépesített emberi tesztek lennének. Ne hasonlítsátok a manuális teszteket az automatizáltakhoz! Inkább úgy tekintsetek ez utóbbiakra, hogy segítenek kiterjeszteni a képességeiteket: olyan tesztek végezhetők el számítógépek segítségével, amelyek az ember által nem.

Természetesen szükség van az automatizálás nyújtotta előnyökre, de az automatizált tesztelés sohasem fogja átvenni a manuális tesztelés helyét. Legalábbis addig nem, amíg nem sikerül emulálni az emberi agyműködést és ettől még nagyon messze van a tudomány. Mikor lesz képes például eldönteni egy mesterséges intelligencia, hogy tetszik-e majd megcélzott felhasználói felhasználói bázisnak a program megjelenése, vagy bonyolult, nehézkes -e egy felhasználói interfész használata? Nagyon sokan próbálták már helyettesíteni a manuális tesztelést az automatikussal, eddig mind kudarcot vallottak. Ez egy rossz cél. Maga az automatizálás nem is lehet cél. Az automatizálás az, ami kell, hogy segítsen a tesztelésbeli céljaink elérésében. Még rengeteg lehetőség van az automatizálásban, nagyon sokat fog fejlődni az elkövetkező években.

Érdemes lehet eszünkbe vésni a fentiekkel kapcsolatban az automatizálás Bach-féle három szabályát:

  1. A jó manuális teszt nem automatizálható.
  2. Amennyiben sikerül automatizálni egy manuális tesztet, az nem volt jó manuális teszt.
  3. Ha van egy nagyszerű automatizált teszted, ez biztosan nem egyenértékű azzal a manuális teszttel, amelyikről azt gondolod, hogy automatizáltad.

Források, ajánlott olvasnivaló

[1] C Kaner, J Bach, B Petticord: Lessons Learned in Software Testing
     Chapter 5: Automating Testing
[2] Can Automation Aid Manual Testing? An Interview with Jonathan Kohl
[3] J Bach: Manual Test Cannot Be Automated
[4] Cem Kaner on Automated Testing - 'We are just scratching the surface'

5 January 2015

Teszt dokumentáció

2014. június 5-én, a budapesti Teszt & Tea rendezvényen elhangzott előadásom dokumentációval, dokumentációs szabványokkal foglalkozó részének bővített változata.




A legtöbb mérnök a teszt dokumentáció készítése alatt unalmas, szükségtelennek tűnő irodai munkát ért, amely megszakítja az egyébként produktív, érdekes, intellektuális tesztelői tevékenységet. Nem véletlenül. A szövegek jelentős része jellemzően "másol-beilleszt" módon keletkezik, nem informatív, nem segíti elő a hatékonyabb tesztelést. Az emberek érzik, hogy a készülő dokumentumokat senki sem fogja olvasni, létrehozásuk csak a munkájukat szabályozó folyamatok kielégítése miatt történik.

Miért támasztanak értelmetlen dokumentációs elvárásokat a munkafolyamat leírások?

Véleményem szerint részben a teszt dokumentációs "szabványok" (pl. IEEE 829, ISO 9000-3, CMM) erőltetett követése, részben a dokumentációt körülölelő alaptalan hiedelmek miatt. (A két tényező sajnos egymást is erősíti.)

Tipikus mítoszok például:
  • professzionális tesztelés nem létezik nagy mennyiségű, jellemzően prózai formában írott dokumentáció nélkül (ld. teszt terv, teszt eset leírások stb.)
  • ezeknek a dokumentumoknak a fejlesztés minél korábbi szakaszában meg kell születnie és formális felülvizsgálaton átesnie
  • egy adott környezetben, projektben működő dokumentációs gyakorlat jól működik majd egy másik környezetben is
  • a szabványok dokumentációs ajánlásainak követése megfelelő lépés bárhol és bármikor
  • egy tapasztalatlan tesztmérnök fejlődését az segíti elő (akkor tanul gyorsan), ha terjedelmes dokumentációt kap a kezébe
  • a részletesen dokumentált teszt esetek garantálják a megismételhetőséget, könnyen végrehajthatók tapasztalan tesztelők által is és védenek a munkaerő-vándorlással szemben (a dokumentáció helyben marad).

A dokumentáció szerves része a formalizált teszt folyamatoknak. A dokumentációs szabványok valamiféle keretrendszert, struktúrát és egy definícióhalmazt próbálnak nyújtani, teszik mindezt az ajánlott dokumentumok leírásával, az egyes dokumentumok közötti kapcsolatok ismertetésével ill. a munkafolyamatokban betöltött szerepük meghatározásával.
A szabványok nem kötelező erejűek. Születésüket a tesztelői közösség a '90-es években kezdetben izgatottan fogadta. A gyakorlatban viszont az alkalmazásuk komoly problémákhoz vezetett - olyan problémákhoz, amelyeket nem lehetett a szabványok inkompetenciából adódó helytelen használatának a számlájára írni.

A tapasztalatokra építve a szakterület több nagyágyúja is megkérdőjelezte a szabványok szükségességet. Az IEEE 829-ről Cem Kaner 2003-ban úgy nyilatkozott, valószínűleg több kárt okozott, mint hasznot ("has probably done more harm than good" [1]), James Bach egyértelműen ártalmasnak ("harmful document") nevezte. Liberalizációs szándékkal mindketten tagjai voltak ekkor a IEEE 829 frissítését célzó munkacsoportnak, sikertelenül. (A viták később sem szűntek meg, a most születő IEEE 29119 szabványt is komoly ellenérzések övezik a tesztelői közösségen belül.)


Tekintsük át a dokumentációs szabványok jellemző problémáit!

Arra a beágyazott feltételezésre épülnek, hogy a fejlesztés szigorúan fázisos életciklusban zajlik (ld. V- ill. vízesés modellek). Ennek megfelelően a teszteket a fejlesztés korai fázisban, részletesen dokumentáltan létre kell hozni, majd ezek a későbbiekben nem változnak.

A tesztelés egyik alapvető problémája az, hogy végtelen számú lehetséges tesztet hajthatnánk végre, de csak egy nagyon kis részhalmaz végrehajtására van lehetőség. A teszt tervezés többek között arról szól, mi kerüljön ebbe a részhalmazba. Nyilván minél jobban ismerjük ill. értjük a készülő terméket, annál okosabban tudunk válogatni a tesztek között. A projekt korai szakaszában pedig értelemszerűen kevesebb információval rendelkezünk.
A jó tesztelő folyamatosan tanul. Ahogy a projekt előrehalad egyre mélyebben lát bele a rendszerbe, fokozatosan fejlődnek azok az érzékei, képességei, amelyek fontosak az adott projektben. Újabb és újabb részleteket tud meg például a leendő a felhasználókról, az applikációról, ennek különböző felhasználási módjairól, az esetleges kockázatokról, a tesztek kivitelezésével kapcsolatos problémákról. Ahogy a tudása nő, más szemmel látja majd a korán megtervezett tesztjeit, vagy azokat a teszteket, amelyeket éppen érdemes lenne végrehajtani. Magának a programnak az érettsége is változni fog az idő előrehaladtával: más jellegű tesztekre van szükség a fejlesztés korai szakaszában, mint később, amikor már elért valamilyen érettségi fokot a program.
(Az IEEE 29199 már próbálja figyelembe venni az agilis fejlesztés eltérő igényeit.)

Nagy mennyiségű információ formális, prózai szöveges rögzítését igénylik, tekintet nélkül az ehhez kapcsolódó munkamennyiségre ill. költségekre.

A szabványok teljesen figyelmen kívül hagyják azt a tényt, a rendelkezésünkre álló idő korlátos (a munka pedig mint fentebb jeleztem, végtelen), azaz mérlegelni kell a dokumentálás ill. azon tevékenységek között, amelyet egy tesztelőnek érdemes vagy kell elvégeznie. (A dokumentációra fordított idő másra már nem fordítható.) Nem írnak az ajánlott struktúrában megszülető dokumentumok jellemzően óriási költségéről sem (létrehozás, karbantartás).

Elterelik a figyelmet a tényleges célokról.

Túlságosan csábító a különböző típusú, terjedelmes, komplex dokumentumok elkészítésére koncentrálni a tervezés során, ahelyett hogy minél jobb elképzeléseket próbálnánk létrehozni azzal kapcsolatban, hogyan is teszteljük az adott rendszert. (ld. goal displacement)

Univerzális, kulcsrakész megoldást próbálnak nyújtani.

A szabványok teljesen figyelmen kívül hagyják a projektek környezeti jellemzőit, illetve azokat az összefüggéseket, hogy ezek a jellemzők hogyan befolyásolják a projekt tényleges dokumentációs igényeit. Nem nyújtanak semmilyen iránymutatást az igények feltérképezésével, analízisével kapcsolatban. Felelőtlenség egy javaslatlistát kőbe vésni és „ipari szabvány”-nak nevezni, amikor a tényleges dokumentációs igények projektről projektre, cégről cégre, területről területre változnak.

A hangsúly jellemzően a dokumentumok terjedelmén és a formalizmuson van.

Ez ágyaz meg annak a hitnek, hogy professzionális tesztelés nem létezik nagy mennyiségű dokumentáció nélkül. A több, terjedelmesebb dokumentum alaposabb tesztelést sugall. (Egy külső szemlélőt -pl. menedzsert, auditort- meggyőzhet a teszt terv terjedeleme arról, hogy a tervezéssel tényleg eltöltött annyi időt a tesztelő, mint amennyit állít, viszont nem szolgáltat információt arról, hogy a megfelelő módon töltötte -e el ezt az időt.)

Azt vizionálják, hogy a tesztelés jól körülhatárolható, absztrakt egységekből áll (teszt esetek) és minden egyes teszt esetre külön dokumentációt kell készíteni. 

Ez végtelenül ostoba dolog, sajnos a teszt eset menedzsment eszközök többségét már ez alapján a feltételezés alapján készítették. Ha van 50 teszt esetünk, amelyek mindegyike tartalmaz egy bizonyos dolgot, és ezt a dolgot mi megváltoztatjuk, akkor minden egyes teszt esetet meg kell változtatnunk. Ha az egyes teszt esetek dokumentációja teljesen független egymástól, akkor változtathatjuk meg az összes dokumentumot. Mondanak -e a valamit a modularizáció, komponens, metódus szavak a programozásban?

Egyes tesztelési paradigmák, módszerek ismeretlenek a szabvány készítői előtt.

Bizonyos eszközök képesek nagy mennyiségű tesztet végrehajtani és kiértékelni, például bemenő adatok millióinak, vagy tetszőlegesen hosszú eseménysorozatnak a véletlenszerű létrehozásával. Ezeknek a teszteknek a dokumentálása egyszerűen nem illik bele a szabványok által vázolt világképbe. A dokumentáció ilyenkor elmarad, vagy vagy más módon történik. Szélsőséges esetben akár tesztek létrehozása is elmaradhat a kapcsolódó dokumentációs nehézségek miatt.

A szabványok által javasolt sablonok használata kétélű fegyver.

A sablonok segíthetik a kevésbé gyakorlottakat az információ struktúrálásában és prezentációjában, de súlyos tévedés azt hinni, hogy kiküszöbölik majd a kompetencia hiányából fakadó problémákat, vagy helyettesítik a teszteléshez (vagy teszt dokumentáció írásához) szükséges készségeket. Elősegíthetik egységes dokumentációs kép kialakítását a külvilág számára, de komolyan korlátozhatják az emberi gondolkodást.
Paradox módon a sablonok akkor segíthetnek nekünk, amikor igazából nincs rájuk szükség. Értenünk kell, milyen információt hordoznak az egyes fejezetek, miért szerepel ott ez az információ, mikor hagyhatók ezek adott esetben el. Amennyiben mindezekkel tisztában van a tesztelő, nincs szüksége a sablonra. Aki önállóan is képes hatékony teszt dokumentáció írására, annak a sablon felgyorsíthatja a munkáját. Ha viszont valaki nem képes sablon nélkül dolgozni, akkor számára nem sablon kell, hanem egy tanár, mert ez annak a jele, hogy önállóan még nem tudja végezni az adott feladatot.


Hogyan döntsük el, hogy érdemes -e a szabványok által megfogalmazott ajánlásokat figyelembe venni?
Milyen projektek esetén érdemes ill. nem érdemes ezeket követni?

A megoldás a már említett dokumentációs követelmények analízise. Azaz annak eldöntése, hogy milyen dokumentumokra, pontosabban (mivel maga a dokumentum csak információhordozó, közvetítő közeg) milyen információ rögzítésére és milyen célból van szükségünk - még mielőtt azzal foglalkozunk, hogy hogyan hozzuk létre ezeket.

Gause és Weinberg Exploring Requirements c. könyve remek bevezető a követelmények analízisébe ill. ezek felderítéséhez környezetfüggetlen kérdések megfogalmazására és használatára. A dokumentációval kapcsolatos, tipikus kérdések lehetnek például:
  • Milyen információs céljai vannaka teszt csoportunknak?
  • Eszköz vagy termék a teszt dokumentáció? 
  • Kik a célközönség, a leendő olvasók?
  • Milyen tudást feltételezünk róluk?
  • Milyen információt szeretnénk közölni velük?
  • Milyen hosszú ideig  lesz szükség a dokumentumra? 
  • Meddig lesz érvényes a dokumentált információ, mennyire valószínű, hogy változni fog?
  • Hogyan osszuk fel időben a dokumentált munkamennyiséget (tudván azt, hogy pl. egy hónap múlva többet tudunk, mint most)?
  • A teszt stratégiánk a felfedezésre épül inkább, vagy előregyártott tesztek végrehajtására?
  • stb.
Mindezek mellett tartsd még szem előtt a következő irányelveket:
  • A terjedelem nem jelent minőséget, vagy alaposságot.
  • A próza helyett használhatsz tömörebb, alternatív módszereket, pl. vizuális formátumok (mindmap), ellenőrző listák (checklist). 
  • Kerüld el a túlságosan korai, vagy túlságosan formális dokumentáció okozta csapdákat! A terveid menet közben változnak majd. Törekedj retrospektivitásra! Kevésbé érdemes azt nagy részletességgel rögzíteni, hogy "mit akarok majd hetekkel később csinálni?", mint azt, hogy "mit csináltam ma? mit láttam, tapasztaltam? mi és hogyan hasznosítható mindezekből?"
Illetve tedd fel a legfontosabb kérdést: Mi az a létező legolcsóbb dokumentáció, ami még elegendő?

Források, ajánlott olvasnivaló

[1] C Kaner, J Bach, B Petticord: Lessons Learned in Software Testing
     Chapter 6: Documenting Testing
[2] C Kaner: Requirements for test documentation
[3] J Bach: Fighting Bad Test Documentation
[4] J Christie: When Documentation is a Waste of Time
[5] M Bolton: Worthwhile Documentation
[6] F Charles: Unburdening Testing. Finding the balance point for test documentation
     EuroSTAR Conference presentation (2012)
[7] A Hodder: Using Mind Mapping Software as Visual Test Management Tool