Dnes poprvé jsem zkoušel vyvíjet metodikou TDD (Test-Driven Development) a spíš jen pro zajímavost si chci poznamenat své první pocity.
K TDD jsem měl doposud poněkud zvláštní vztah – hodně jsem o tom přečetl, o přínosech jsem celkem pevně přesvědčen, ale přesto jsem nikdy nedospěl do bodu, kdy bych TDD začal aktivně praktikovat. Většinou to bylo proto, že všechny mé projekty byly v pokročilé fázi svého životního cyklu a za tohoto stavu se mi s TDD začínat nechtělo. Teď se ale objevil nový projekt, takže jsem měl k vyzkoušení TDD ideální příležitost!
Trochu paradoxní je, že zatímco „chuť na TDD“ jsem dostal především čtením zdrojů od pokročilých .NET vývojářů, můj současný projekt staví na PHP, což historicky rozhodně není svět „best practices“ (přísnějším hodnocením obsahujícím slova „špagety“, „bastlení“ a podobně nechci urazit stále narůstající počet PHP vývojářů, kteří se o kvalitu kódu přinejmenším snaží). Nicméně i ve světě PHP pro unit testy nějaké ty frameworky existují, takže po technologické stránce problém nebyl. Já jsem si vybral SimpleTest, protože vypadal, že má vše, co budu pro začátek potřebovat.
Nastal tedy čas napsat svůj první test! Vytvářím jednoduchou REST-style webovou službu a v pravém duchu TDD jsem nesměl udělat nic, na co bych už předem neměl napsaný test, proto prvním krokem bylo vytvoření následujícího testu:
public function test_Propowners_Resource_Exists() {
$client = new Zend_Http_Client($this->BASE_URL);
$response = $client->request();
$this->assertTrue($response->isSuccessful());
}
Protože tento test byl tím úplně prvním, co jsem udělal, musel selhat ($this->BASE_URL mířilo na soubor propowners.php, který zatím neexistoval). Spuštění testu v prohlížeči přineslo očekávaný výsledek:
Přidání prázdného souboru propowners.php přineslo kýžený výsledek:
Popravdě, ještě nikdy jsem neměl takovou radost z vytvoření prázdného souboru :)
V tomto způsobu práce jsem pokračoval i nadále. Můj další test testoval, jestli prostý požadavek na propowners.php vrátí jednoduchý textový popis webové služby. Prázdný soubor samozřejmě nic takového nevrací, proto jsem dostal očekávanou červenou. echo „About this web service: …“ splnilo základní požadavek a test se zazelenal. Juchú! Další test zkoumal, jestli požadavek s nějakým HTTP GET parametrem vrací MIME type text/xml… a tak dále, a tak dále. TDD-il jsem, jen to svištělo :)
Moje první dojmy z reálného používání TDD:
- V principu je to hrozně jednoduché. Zatím se nepotýkám s integračními testy, nepotřebuju mockovat databázi a podobně, takže jde všechno hladce a bez problémů.
- 50% času mi trvalo zprovoznění a nastudování třídy Zend_Http_Client, 40% času jsem se potýkal s OOP syntaxí PHP, kterou už jsem trochu pozapomněl, a pouhých 10% času mi zabralo psaní testu jako takového. Tyto poměry se určitě změní, ale přeci jen to poukazuje na zajímavou věc: v normálním přístupu bych prostě začal mydlit propowners.php a o nějakou simulaci HTTP requestů pomocí Zend_Http_Client bych se vůbec nemusel starat, testy mě donutily rozšířit obzory a zapojit něco, co by jinak v nikde v kódu vůbec nebylo. Tady pravděpodobně leží to pravé zdržení způsobené TDD, ne fakt psaní testů sám o sobě.
- Vidět zelenou je krásný pocit. Dodává mi sebevědomí, že napsaný kód je možná i správný :)
- Zatím musím narazit na situaci, kdy změna produkčního kódu způsobí selhání některého testu a naznačí tak, že jsem něco zkazil. Hádám, že tady se nejlíp projeví hodnota existujících unit testů.
- Zatím pracuji zásadně s testovacím souborem, ten reálný jsem vůbec nemusel spustit a přesto si jsem celkem jistý, že je implementovaný správně. To považuji za pěknou výhodu.
Uvidím, jak to půjde dál, ale zatím se mi TDD zamlouvá. A ani to moc nebolelo :)
Tož přeju hodně štěstí při prvních složitějších věcech :) Skutečné TDD jsem si zkusil jen jednou a měl jsem podobnou radost, jak to všechno přibejvá. Kupodivu tam skutečně chyby nebyly, ale nejspíš jsem zabředl do přespříli specifikovaných testů… :)