Testování nejen v PHPUnitu

Na videu z březnové Poslední soboty představuje Dan Milde v rámci své přednášky možnosti testování PHP aplikací s pomocí jednotkových, integračních i Selenium testů. Zmiňuje důvody pro testování a ukazuje konkrétní praktické postupy.

Pro demonstraci používá jednoduchou aplikaci. Ta je vedle samotného testování zajímavá ještě v jednom ohledu. Jedná se totiž o konkrétní implementaci obecné architektury, kterou nedávno popisoval Vašek Purchart ve svém článku Architektura aplikace nad Doctrine 2. Veškerá aplikační logika je přenesena z presenterů do fasády, do budoucna tak například umožňuje snadno přidat více různých rozhraní, jako je konzole nebo mobilní aplikace.

Ukázková aplikace využívá čisté dependency injection, což mimo jiné usnadňuje právě testovatelnost. Ve své přednášce k tomu Dan poznamenává: „V Nette jsou jen tři místa, kde byste měli používat kontejner jako service locator. Je to bootstrap, presenter loader respektive presenter factory a testy. Nikde jinde byste napřímo s kontejnerem pracovat neměli.“

Pokud vás téma návrhu a testovatelnosti webových aplikací zaujalo, navštivte naše školení Pokročilý vývoj a testování aplikací.

Zveřejněno 3.4.2012 v rubrice Programování a vývoj se štítky , , , .
milde

Daniel Milde

Dan pracuje jako senior vývojář ve společnosti Medio Interactive, kde se věnuje především backend procesům a deploymentu. Má dlouholeté zkušenosti s vývojem rozsáhlých aplikací, optimalizací a testováním.

Google+ profil milde@medio.cz

Komentáře k článku

[1] David Grudl | 3. 4. 2012 v 16.07

Ad „V Nette jsou jen tři místa, kde byste měli používat kontejner jako service locator“

Myslím, že je jen jedno místo, a to je composition root. Presenter loader stejně jako DI kontejner do něj patří. Výjimkou potvrzující pravidlo je třeba ContainerPanel vizualizující kontejner pro potřeby debugování http://jdem.cz/ubwj7.

Používání service locatoru v třídách testů mi připadá spíš jako důsledek špatně navržené testovací třídy. Ale možná to v PHPUnitu ani lépe navrhnout nejde.

[2] Daniel Milde | 3. 4. 2012 v 18.39

Pokud bys používal kontejner jen v composition rootu (bootstrapu), musel bys sestavit úplně celý strom závislostí (vytvořit úplně všechny presentery se všemi jejich závislostmi).

V integračních testech je dobré třídu testovat se stejnou konfigurací, jako má třída v produkčním prostředí. Proto je vhodné si instanci testované třídy vytáhnout z kontejneru. Když by sis instanci třídy sestavoval ručně, mohlo by se Ti stát, že jí předáš závislost, která se v produkci vůbec nepoužívá, a neobjevíš proto třeba nějakou chybu.

[3] Vašek Purchart | 4. 4. 2012 v 14.33

Davide, kouknul jsem na video a čekal jsem, že z něj pochopím, na co konkrétně narážíš, ale přesto jsem nepochopil. Koukal jsem i do Nette samotného a nic, co by bylo podobné composition rootu, o kterém mluvíš, jsem neobjevil. Máš tím tedy na mysli prostě to, že by v aplikaci mělo existovat jen jedno místo, kde se všechno skládá dohromady?

PHPUnit právě konstruktory obecně nepodporuje (aby šlo předávat rozumně závislosti) a jeho rozšiřování jakýmkoliv směrem je obecně dost bolestné, tak ano, to je spíš z praktických důvodů.