Dozvuky pražského setkání: Je psaní testů příliš drahé?
Minulý týden se v pražském Světozoru uskutečnilo druhé setkání příznivců Ruby on Rails. Průběh setkání pěkně popsal Jirka Kubíček. Právě jemu a Karmimu patří velký dík za bezvadně zvládnutou organizaci. Já jsem se na ní jen vezl a promluvil krátce na mé oblíbené téma - testování v Ruby on Rails. Dostupné jsou slajdy z přednášky a ukážeme i nějaké fotky, to ale až o něco později, vyvolání filmu přece jen chvíli trvá;). Později také doplním podrobnější články o představených testovacích nástrojích a postupech. Dnes velmi neodborně na takové "ekonomické" téma.
Diskuze po prezentaci se dotkla zajímavého tématu, totiž jestli se testovat opravdu vyplácí. David Majda správně upozornil, že důsledné psaní testů znamená, že v podstatě píšete všechen kód dvakrát nebo i víckrát. Podotkl, že to tedy znamená minimálně dvojnásobné náklady a že bychom si proto měli spočítat, kolik nás potenciální chyba v naší aplikaci stojí a na základě toho rozmyslet, jestli testovat nebo ne. (Doplnil své oblíbené "většina dat na webu je víceméně bezcenná").
S onou poznámkou o bezcennosti asi nemá smysl dlouho polemizovat, snad jen podotknu, že s rozvojem internetu jako aplikační platformy se přes web přistupuje k velmi cenným datům a jejich poškození může stát opravdu hodně.
Spíš jsem ale přemítal o té úvaze "kvalitní testy -> min. 2x tolik kódu -> min. 2x větší náklady", která mi ve Světozoru přišla jako platná. Včera jsem (opět) přepisoval část kódu, který napsal někdo jiný, abych ho mohl znovupoužít na implementaci chtěného (víceméně jsem něco zjednodušoval a částečně přesouval z controlleru do modelů).
Původní kód byl dobře pokryt testy, a tak jsem nejen velmi rychle zjistil, jestli jsem svým refactoringem něco rozbil (hádejte, samozřejmě že ano), ale i více pochopil, jak má vše fungovat, protože detailně (programátorsky) to samozřejmě nikde specifikované nebylo. Snažil jsem se představit, jak bych něco podobného provedl bez testů a ta myšlenka mě celkem vystrašila. Trvalo by mi daleko déle zjistit, co chtěl autor svou Ruby básní říci a myslím, že (z nedostatku trpělivosti) bych stejně vyprodukoval něco, co by v nějakých krajních případech rozbilo předešlou funkcionalitu.
Tedy ano, kódu jsem napsal daleko více, než kdybychom netestovali, ale čas strávený jeho vytvářením byl kratší, než kdybychom žádné testy neměli. O větší radosti z takové práce ani nemluvě. Myslím tedy, že od určité velikosti projektu a počtu tvůrců je psát testy ekonomicky výhodnější.
Na druhou stranu uznávám, že malý nekritický projekt jednoho programátora testy příliš nevyžaduje. (Každý malý projekt by ale měl mít velké ambice;).
Spatlal jsem takový graf, který myšlenku shrnuje:

Na začátku projektu se psaní testů může zdát zbytečné (případně jako na setkání zmíněná onanie) a je to pochopitelné, protože jejich efekt se ještě neprojevuje. Později ale od začátku důsledně psané testy čas šetří a pomáhají udržet kód čistý a s malým množstvím chyb.
about 1 hour later:
about 1 hour later:
V zásadě s tebou souhlasím, že ta úvaha typu "2x víc kódu -> 2x dražší vývoj" je poněkud zjednodušená. Trochu jsem si to uvědomil už během diskuze ve Světozoru, ale nechtěl jsem to tam už nějak víc rozpitvávat. Šlo mi hlavně o to, upozornit na nutnost nad věcmi přemýšlet, a ne je bezhlavě používat "protože je to teď in".
S velikostí projektu a počtem lidí máš 100% pravdu, sám jsem to viděl na našem matfyzáckém softwarovém projektu (6 lidí). Tam se testy moc vyplatily. Podobně když je kód trochu složitý a "nelineární" (v tom smyslu, že malá změna někde způsobí nečekaný problém úplně jinde) - to je zas případ mé diplomky, kteoru mám testy poměrně dobře pokrytou, a myslím že se mi to vyplácí.
Jo a jsem rád, že ses dotknul tématu "radosti z práce". To je totiž faktor dost podstatný, málo zmiňovaný a také dost obtížně měřitelný.