
Testování php kódu
Pěkný večer. Dělám projekt do jednoho předmětu, který se zabývá testováním. Dostali jsme soubor, kde je třída s jednou metodou a stručný popis, co má metoda dělat. Do tohoto kódu zasahovat nemáme, máme dopsat dvojníky některých dalších tříd, které jsou tam použity (a jejich zdrojáky nebyly dodány) a poté napsat pár testů pomocí PHPUnit. Je to jakoby simulace toho, že programátor dodá testerovi neúplný kód. Zeptal bych se jen na pár obecnějších věcí. Testování pomocí nějakého frameworku a podle nějaké teorie jsem dosud nedělal a chtěl bych se to naučit.
První věc - dopsat ty dvojníky. To myslím chápu, z kontextu kódu vypozorovat, k čemu ty třídy asi slouží a jaké návratové hodnoty se očekávají. Jen nevím co přesně dělá tento kód v php:
$this->assertEquals(SmtpObject::$body, "body");
Konkrétně tato část: SmtpObject::$body
SmtpObject tam není definován, tak ten mám asi dopsat jako dvojníka. A $body je jeho atribut? Tady jsem zmatený, jak mohu přistoupit k atributu třídy, od které nemám instanci?
Teda pojem dvojník ve spojení s unit testy vidím poprvé, co to má konkrétně být?
Já sám pořádně nevím. Byl prostě dodán neúplný kód funkce, která slouží k odesílání emailů z eshopu. Volají se tam metody ze tříd, které neexistují. Ty máme vytvořit, ale jen pro účely testování, jejich skutečnou funkčnost neřešit.
Např. kód:
Třída Db neexistuje, ani žádné podrobnější info. Takže jsem vytvořil tuto třídu a metodu DbQuery(). Vůbec nevím o co tam jde, ale z kódu je vidět, že vrací nějaké pole, kde je prvek proforma, takže moje funkce nějaké takové pole vrátí, aby bylo možné splnit ten if. Snad to chápu dobře a o tohle jde.
Asi jde o tohle:
http://www.zdrojak.cz/clanky/testovani-v-php-odsti nujeme-zavislosti/
Zeby static class?
Asi jo díky. Takže to je atribut, který má pevně nastavenou hodnotu a je jedno, jestli pracuji s instancí, nebo bez ní, má pořád stejnou hodnotu? Našel jsem, že v instanci takový statický atribut není přístupný.
language.oop5.static.php
Pak mi trochu uniká smysl toho testu assertEquals. Když má nějaký atribut pořád stejnou hodnotu, je nějaký důvod ho testovat?
Co ti brání vytvořit si instanci toho mocku?
No asi nic, jen se snažím porozumět tomu, co tam už je napsané.
Ta testovaná třída nejspíš nastavuje property body toho SmtpObjectu. A tím assertem ověříš, že to nastavení opravdu proběhlo.
Jo, to už dává smysl. Ale musím to teda přepsat, aby to pracovalo s konkrétní instancí třídy SmtpObject.
Někde v testovací třídě bude
A v phpunit testu bude
Ne, právě že bys neměl pracovat s konkrétní třídou, ale s jejím mockem.
Mock bude ta třída SmtpObject ne? Tu neznám, a musím nějakou vytvořit, aby to fungovalo.
No předpokládám, že SmtpObject už je nějaká reálná třída na posílání mailů, takže potřebuješ nějakou jinou třídu implementující stejné rozhraní.
Ano přesně tak.
A mock si nemůžu pojmenovat taky SmtpObject? Ať nemusím v testovacím souboru nic měnit.
To záleží na tom, co myslíš tím pojmenovat. Stejně pojmenovanou třídu bych tam určitě nedával.