Tomáš Hák
Test automation specialist
Blog
Tomáš Hák
Test automation specialist
Celá řada firem se v poslední době svezla na vlně a svůj vývoj přesunula z vodopádového modelu na agilní metodiky, nejčastěji Scrum či Kanban. Nebudeme zde hodnotit, zda-li to je dobře a co je lepší. Na toto téma existuje mnoho článků a videí, zmínil bych možná pro zajímavost záznam setkání pražských testerů, kde se uskutečnil pomyslný souboj obou přístupů a dres vodopádu tehdy cvičně oblékl i Marcel Veselka od nás z Teseny.
Tesena poskytuje služby v oblasti testingu již řadu let a za tuto dobu jsem se svými kolegy zažil na mnoha projektech různé přístupy k testování v agilním světě a rád se o ně s vámi v následujících řádcích podělím. V obecné rovině bych je mohl rozdělit do 3 částí, které si v dalších kapitolách postupně popíšeme. Jedná se o personální přístup, technologický přístup a o přístup k plánování. V tomto čánku se zaměříme také na:
Ještě než 3 body zmíněné v úvodu rozebereme detailně, rád bych se zmínil o základních principech agilního vývoje, konkrétně o Agilním manifestu.
Mezi základní principy patří tyto body:
V agilní metodice SCRUM je definován seznam jasně vymezených rolí. V krátkosti je lze popsat takto:
Uvedené role tvoří samoorganizující se tým (někde se používá termín „firma ve firmě“), který vyvíjí nějaký produkt v krátkých časových úsecích. Typicky se jedná o dvoutýdenní sprinty. Během sprintu se konají některé schůzky, kterým se v agilním světě říká ceremonie. Pravděpodobně jste se s nimi setkali. Patří sem:
Dříve probíhal vývoj jinak, než je běžné dnes. Předně release probíhal jen několikrát ročně. Všechny fáze byly načasované, tedy ze začátku se ze zadání vytvářela analýza celého řešení, včetně všech dopadů. Začala se připravovat dokumentace a současně i tým testerů si dával dohromady testovací případy, které bude nutné připravit. Teprve v okamžiku, kdy vývojáři aplikaci dokončovali, začali všichni testeři testovat a reportovat chyby. Jednotlivé role zde byly zastoupeny jako celé týmy lidí, to znamená, že například i testování provádělo vždy více lidí současně a měli nad sebou test manažera, který je řídil, rozděloval práci a komunikoval s jinými týmy.
Přechodem na agilní vývoj se vše změnilo. Čas od zadání po release hotové funkce se řádově zkrátil. Na produkci se nasazuje i několikrát týdně po malých částech a nelze čekat na týdenní regresní manuální testování. Z toho plyne i větší snaha část testů automatizovat a ideálně i zařadit v CI/CD do procesu nasazování. Důležité je, že už přestaly existovat dedikované týmy vývojářů, testerů a analytiků. Vznikly samostatné týmy (firmy ve firmě), které měly typicky 3-6 vývojářů, jednoho analytika a jednoho až dva testery. Týmy převzaly odpovědnost za své části aplikace, a ne jako dříve, za konkrétní fázi vývoje.
Upustilo se od rozsáhlých dokumentací a analýz. Produktový vlastník přišel s nápadem, co by v aplikaci chtěl naprogramovat. Analytik zjistil možné dopady do jiných aplikací, potřebná datová pole, která se posílají na backend, případně další informace nutné pro vývoj. Při groomingu už toto všechno je pak známo a je to součástí ticketu, ve kterém je zadání. Vývojáři si k úkolu přidají svoje informace, a i tester musí znát vše potřebné, aby to pak mohl co nejlépe otestovat. Samotné úkoly by měly být rozsahem velké maximálně na práci přes celý sprint. Pokud by to bylo náročnější, je nutné úkol rozdělit na menší úseky. Doporučuje se také celý task (nebo story) rozdělit na subtasky obsahující malé samostatné dílčí úkoly.
Jak již bylo řečeno, už při plánování/groomingu bylo nutné myslet na všechny fáze a součástí pracnosti daného úkoly byl vždy i testing. Tester se musel na groomingu aktivně ptát, aby zjistil možné budoucí komplikace, které by například znemožnily dokončit celou funkcionalitu během sprintu. Na projektech se nám velmi osvědčilo si do úkolu přidávat testerské subtasky, např. pro přípravu testovacích dat/uživatelů, přípravu TC, opravu automatizovaných testů a pak i samotné manuální ověření. Část z toho bylo možné připravovat už dopředu a v okamžiku předání tasku od vývojářů na testing už byla část připravená.
Při samotném plánování byl problém s určováním náročnosti úkolu, respektive toho, jak bodovat. Na některých projektech se testing hodnotil zvlášť a pak se přičítal k hodnocení od vývojářů, nebo byla obě čísla společná. Za mě ale nejlépe fungoval přístup, kdy jsem hodnotil spolu s vývojáři. Představoval jsem si ten úkol komplexně, po čase jsme si vytvořili i vzorové Story pro 1, 2, 3, 5… bodů. Takže i tester pak dokázal náročnost určit podobně jako vývojář. Pouze v případě, že jsem věděl, že testování bude obsahovat velké množství práce, tak jsme v týmu výsledné číslo zvýšili například z 5 na 8, aby to reflektovalo náročnost testování. Na některých projektech se zaváděl i paralelní sprint a backlog pro testing, ale většinou se to neujalo, protože celý proces byl pak značně nepřehledný.
V agilním světě fungují menší, samoorganizující se týmy. S tím souvisí i to, že na malé množství vývojářů se počítá většinou s jedním testerem. Neexistuje tu velký tým testerů řízený Test Managerem, který by na úkolech spolupracoval. První, co každého napadne, je určitě menší zastupitelnost. V případě dovolené nebo nemoci musí za testera někdo zaskočit. Většinou to je analytik nebo někdo z vývojářů. Je proto nutné, aby si tester udržoval kvalitní dokumentaci a např. přehled testovacích dat, který můžou ostatní členové týmu v případě jeho nepřítomnosti použít. S těmito daty a postupy pro testování aplikace je třeba celý tým pravidelně seznamovat.
Tester, pokud je takto sám v týmu, musí být tím, kdo by měl dovnitř týmu předávat základní myšlenky ohledně testingu. Je třeba i nastavit procesy během sprintu tak, aby se předešlo přetížení testera například na konci sprintu. Toho se dá docílit rozdělením větších úkolů na menší samostatné celky, kdy je tester může odbavovat postupně. Pokud je vhodné k nějaké nové funkci doplnit i automatizovaný test, lze jeho implementaci odložit na začátek následujícího sprintu, kdy bývá pro testing obecně méně práce a je tam pro toto prostor.
Pokud je dopředu známo, že tester třeba 2-3 týdny bude na dovolené, tak se vyplatí domluvit na planningu předem a do sprintu naplánovat úkoly, kde se nepředpokládá rozsáhlé testování a ověřit si, jak to zvládnou vývojáři mezi sebou. Do daného úkolu se do poznámek může připsat checklist případů, které tester doporučuje projít, aby se na nic nezapomnělo.
S předchozím souvisí i toto. Na většině agilních projektů je snaha řešit testy automatizovaně. Na to existuje velké množství nástrojů a frameworku prakticky ve všech používaných programovacích jazycích. Jako testeři bychom si tedy vybírali podle účelu a podle typu aplikací, které budeme chtít testovat. Bude tedy rozhodovat primárně to, zda v daném nástroji chceme řešit testy pouze API, nebo kombinovaně s webovou aplikací, jestli se bude jednat pouze o funkční testy, nebo bychom rádi i testovali performance apod.
Na mnoha projektech, kde jsme spolu s kolegy z Teseny byli, jsme museli při výběru nástroje přihlédnout k tomu, co používali vývojáři a také v čem programovali. Je totiž důležité počítat s tím, že automatizaci budou řešit prakticky všichni v týmu, protože pokud jediný tester v týmu onemocní nebo je na dovolené, tak je nutné, aby existovala jeho zastupitelnost. Pokud tedy v týmu jsou pouze PHP vývojáři, můžeme s úspěchem použít framework Codeception právě v tomto jazyku, případně čisté PHP s knihovnami pro Selenium. Podobně se můžeme přizpůsobit Java programátorům, stejně tak i pro Javascript a Python existuje velké množství možností.
Z vlastní zkušenosti mohu říct, že vývojáři často nemají představu o funkci automatizovaných testů, nebo jen mlhavě tuší. Pokud pro ně připravíme hodinovou ukázku, včetně rozebrání zdrojového kódu, živého spuštění testů a kontroly jejich výsledků, ve většině případů se pro to nadchnou a sami navrhují, že by s psaním testů pomáhali. Má to několik výhod. Předně se jedinému testerovi částečně uvolní ruce, protože bude vývojář schopný si základní testy na vyvíjenou funkci napsat sám. Další scénáře, předně ty negativní, pak stále zůstanou na testerovi. On by měl znát všechny možné scénáře, které můžou nastat a pokud to lze, aby bylo vše pokryto testy. Další výhoda je to, že si tester a vývojář vzájemně můžou dělat revize kódu automatizovaných testů. Tester má tak možnost zlepšit svoji kvalitu kódu, vyvarovat se běžných nešvarů a obecně psát svůj kód čitelnějším způsobem. Pokud už takto vývojáři i testeři zvládají spolupracovat, většinou sami vývojáři začnou navrhovat, jak např. webovou aplikaci upravit, aby byla snáze automatizovatelná. Může se jednat o snahu doplnit ID k elementům na stránce, doplnit Javascript, který dokáže informovat, že je stránka kompletně načtená, nebo pomůžou zpřístupnit pomocné systémy na pozadí pro automatizované testy. Testy pak můžou využívat např. číselník textů jednotlivých elementů v různých jazycích, zakládat si data/uživatele pomocí API na backendu, nebo si některé výsledky ověřovat v DB apod. Testy se pak stanou komplexnějšími a do jisté míry i stabilnějšími.
Nyní tedy uvažujeme situaci, kdy vývojáři pomáhají s psaním automatizovaných testů. Stále je ale tester ten člověk, který by měl kontrolovat jejich běh, typicky výsledek nočního spouštění a v případě chyb analyzovat, co se stalo a jestli je třeba opravit testy, nebo zadat novou chybu. Prvním problémem je místo, kde testy běží. Ve většině případů se jedná o Jenkins (či jiný CI/CD nástroj), který je samostatnou instancí čistě jen pro pouštění testů a na svých nodech má nainstalované potřebné knihovny. Tester je samozřejmě zvyklý report kontrolovat, ale pro vývojáře to může být jen dalším ze systémů, kam musí chodit a mít tam přístup. Řešením je zde zakomponovat spouštění testů na stejné místo, kde se buildí nebo nasazují aplikace na testovací prostředí. Nasazení nové verze aplikace pak na pozadí může rovnou spustit testy. Nebo z našich testů vyčlenit sadu smoke testů, které budou trvat krátký časový úsek a zařadit jejich spouštění přímo do pipeline nasazování.
Stejně jako způsob samotného spouštění testů je neméně důležitý i formát výsledku. Nástroje pro automatizaci většinou nabízí vlastní způsob reprezentace výsledku běhu, každopádně ne vždy takový formát musí vyhovovat a je třeba přemýšlet i o tom, jak výsledky co nejvíce přiblížit ostatním členům v týmu, aby měli okamžitý přehled, co se s aplikací děje a co přestalo fungovat. Nedávno jsem na toto téma publikoval článek.
Co říci závěrem? Agilní přístup ve vývoji SW neznamenal jen zrychlení samotného vývoje, ale změnilo se i celkově testování. Testují se malé změny v aplikaci, současně je třeba testovat i regresně, zda změna nezpůsobuje chybu v jiné části. Z toho důvodu se klade větší důraz na automatizaci a CI/CD. Rozdíly v týmu mezi vývojáři a testery se zmenšují. Každý má stále svou oblast působnosti a nový přístup současně umožňuje vzájemnou spolupráci, revize a výpomoc. Pro testera to znamená nutnost přizpůsobení se, protože na testing bývá v týmu většinou sám. Často se tak zaměří na výběr takových nástrojů, které budou vyhovovat i vývojářům. Se všemi výzvami jsme se na projektech v Teseně úspěšně poprali. Pokud byste rádi věděli detaily, určitě nám napište a můžeme vše probrat u kávy.