24. září 2011

Zkušenosti ze zavádění testování

Bude to již skoro dva roky, kdy jsem začal zavádět testování ve firmě (viz článek Největší problémy při zavádění testování). Teď jsem se dostal do stavu, že si potřebuji vše zpětně zhodnotit a posunout to ve firmě zase o kousek dále.

Co se povedlo:

  • základní principy a přínosy testování zná v týmu snad každý, každý až na nějaké výjimky již má zkušenosti s napsáním vlastních testů. V tomto ohledu se to rozjíždělo pomaleji než jsem na začátku čekal, trvalo chvíli než se dostavil efekt sněhové koule. Nejdříve jsem psal testy jen já, pak se začali postupně přidávat po jednom další a další až nyní je nás většina. Ovšem samozřejmostí je to pořád jen pro pár lidí. Také pomohlo několik případů, kdy nebylo jiné možnosti než napsaní aut. testů, protože ruční vytváření testovacích dat bylo strašně moc komplikované a zdlouhavé.
  • technické řešení resp. podpora pro psaní testů byla již od samého počátku hotová, v průběhu těch dvou let jsem toho zase tolik nemusel přidávat. Naše řešení je postavené nad vlastním frameworkem pro vytváření testovacích dat (viz článek Vytváření testovacích dat), doplněné o některé zajímavé vychytávky pro snadnější psaní testů - Testování webových služeb nebo Plošné vypnutí povinného @Autowired.
  • téma testování se začíná ve firmě prosazovat, nejen ve vývoji, ale zejména v konzultantské části firmy. V tomto ohledu také nastává posun z manažerského pohledu - ze začátku bylo testování, dle mého názoru, podporováno hlavně kvůli tomu, že o tom hodně lidí mluvilo, a že jsem byl schopen říci jak s testováním začít, jak to celé uchopit. Nyní je to spíše o snaze celé testování více zefektivnit, případně začít více měřit. Je tedy např. snaha o lepší spolupráci mezi konzultanty (zadavateli úkolů) a vývojáři tak, aby již zadání obsahovalo podpůrné informace pro co nejefektivnější psaní unit testů, které by ve výsledku měli ulevit právě konzultantům.
  • testy jsou součástí automatického buildu
Co se nepovedlo:
  • stále jsou zarytí jedinci, kteří testování "odolávají". Neustálá argumentace a úsilí mě celkem vyčerpává, ale je to vlastně má jediná zbraň, takže musím vydržet
  • bylo ode mě na začátku celkem naivní si myslet, že když někdo "prasí" produkční kód, tak testy na tom budou lépe. Spíše naopak. Testy jsou prostě považovány za něco "méně kvalitního", co nepotřebuje komentáře, vše se může psát bez nějaké struktury pod sebe. Tento bod nesouvisí nejen s testy, ale je to spíše úkol pro celý tým - používat a dodržovat konvence pro psaní zdrojového kódu.
  • unit testy fungují víceméně jako nástroj vývojáře, aby si svůj kód alespoň párkrát spustil a ověřil, že to plus mínus funguje. Z mého pohledu je potřeba zlepšit předávané informace od konzultantů, aby již v zadání úkolů byly uvedeny informace na co je vhodné se během testování zaměřit tak, aby to v konečném důsledku pomohlo nejen vývojářům, ale i konzultantům, kteří to vše musí převzít a sami ověřit, že je implementace správná.
  • chybí nám měřitelná zpětná vazba, neumíme říci, že díky pokrytí určité části testy se zlepšila chybovost o tolik a tolik. Neumíme říci, zda vynaložený čas na psaní testů je v konečném důsledku opravdu přínosem nebo není. Já jako vývojář vím o hodně výhodách a bez testů si to už nedovedu představit, ale má podobný názor i vedení? Obávám se, že zatím ne.
  • od začátku jsme chtěli, aby se testy co nejvíce efektivně, tj. psát testy jen k tomu, kde to má přidanou hodnotu. Vymysleli jsme to tak, že každý kdo bude chtít psát nějaké testy, tak přijde za mnou a zkusí mě přesvědčit, že daný test má smysl. Na první pohled dobrý nápad, ale ve výsledku špatné - potřebovali jsme motivovat vývojáře ke psaní testů a ne jim házet klacky pod nohy. Od tohoto jsme postupně opustili, bohužel zase mám někdy pocit, že některé testy mi nepřijdou moc efektivní. Ale asi je lepší mít více testů než méně.
Co dále v nejbližší době?
  • v rámci code review se více zaměřím právě na testy
  • chtěl bych zlepšit dokumentaci testů resp. JavaDoc testů. Jsem toho názoru, že každý by měl umět před implementací metody popsat, co daná metoda bude dělat. Pokud toho není schopen, pak vlastně přesně neví, co daná metoda má dělat. To samé platí o testech - každý si musí před každým testem říci, co chce testovat, jaké budou vstupy a jaké očekávané výstupy. Zde bych to chtěl nějak standardizovat, ale ještě nevím jak - nějaká jednotná JavaDoc šablona nebo nějak úplně jinak? Budu rád za nápady, jak se to řeší jinde.
  • musím zrychlit běh testů na build serveru. Je pravda, že build server je přetížený, ale i tak je hodně, pokud nám celý build včetně všech testů běží skoro hodinu. Zpětná vazba musí být rychlejší. (pozn: máme cca 700 tabulek, k tomu odpovídající Hibernate entity, které se musí vždy všechny inicializovat. Dokončení modularizace aplikace s možností vypnutí/zapnutí modulů bude až tak příští rok). Zde by možná mohl pomoci systém agentů, který znám z TeamCity. Nebo vhodně definovat testovací profily a pouštět to na více strojích vždy pouze s daným profilem.


3 komentáře:

Augi řekl(a)...

Paralelizace testů pomocí Build Agentů v TeamCity je řešení, ale jen bacha, že v té verzi zadarmo jsou jen 3 agenti - další se pak musí dokupovat. Ale i třikrát rychlejší běh testů je IMHO dobrej posun.

Novoj řekl(a)...

700 tabulek je teda síla - kolik máte testů? Používáte Rollback on tear down pattern nebo nějaká inicializace předchází každému testu?

My máme systém hodně modularizovaný, ale když vezmu za příklad jednu knihovnu s cca 350testy nad dvěma DB (jedna je dokonce fyzicky v jiné lokaci), nepřesáhne čas běhu 10 minut.

Ten Rollback on teardown nám ve zrychlení hodně pomohl.

Jinak ve stejné pozici jsem byl před 4 lety taky. Naštěstí se to už zlomilo a všichni jsme už na stejné vlně - tj. testy všichni píšeme z vlastního přesvědčení, že nám nejenom pomáhají ve výsledné kvalitě kódu, ale i jako prostředek, jak psát kód rychleji (tj. mimo kolečka neustálého hot-redeploy/restart Tomcatu).

Ti kolegové, kterým nebylo testování po chuti už naštěstí mezi námi nejsou. Chce to jen vydržet a neustále motivovat.

Klíčové je, aby každý z těch lidí prožil AHA moment, až se dočkají toho, že jim testy odhalí chyby, které by jinak skončily v produkci a nad kterými by strávili stresové chvilky při hotfixech.

Dost taky pomáhá, aby developeři sami dostávali chybová hlášení od zákazníka a museli s ním komunikovat. Docela dost to lidi zocelí a donutí přemýšlet.

Petr Jůza řekl(a)...

Ahoj Honzo,
tabulek máme opravdu hodně, ale dost jich je pro uložení nastavení a parametrů. Víme, že musíme modularizovat a postupně k tomu směřujeme. Pak nebude nutné pro každý test inicializovat všechny tabulky, ale jen ty pro vybrané moduly.

Celkem nyní máme asi 450 testů, zejména v modulech, které nás historicky nejvíce trápí nebo když vytváříme něco nového.

Testujeme přímo nad jednou společnou cílovou DB, která je určena pouze pro testy. Každý test si připraví svoje potřebná data, pak proběhne akce a kontrola a nakonec rollback, do DB se nikdy nic nesmí uložit.