Nette\Tester: Pár otázek k testování modelu
- Myiyk
- Člen | 321
Ahoj,
udělal jsem si test jedné metody modelu (zdroják).
Není to zrovna co bych chtěl, ale nevím jak to udělat správně.
Zajímalo by mě:
- Jak udělat zdroj dat pro testování? (u mě proměnná $insertData)
- Jak nahradit tu hromadu Assert::same(), přece to musí jít porovnat jednodušeji.
- Kde bych si měl předpřipravit databázi? (vytvořit databázi a nahrát strukturu)
- Pořadí testů musí být určeno, případně některé testy nesmí běžet souběžně (ty co pracujou se stejnýma tabulkami). Jak to udělám?
- Jak spouštět testy z prohlížeče nebo při změně kódu?
- Někde se psalo o nějakém nástroji, který zjistí, jak mám kód pokrytý testy, resp. zjistí co testy pokryté není. Existuje takový nástroj?
Víte-li alespoň jednu odpověď, tak se s ní prosím podělte.
Děkuji
Nette i Tester je v aktuální @dev verzi.
Editoval Myiyk (2. 9. 2013 18:58)
- frosty22
- Člen | 373
2. Já bych v tom neviděl problém, zvláště u Tebe to není hromada, ale jen pár :) Jinak pokud bys porovával nějakou strukturu – objekt, pole ⇒ můžeš napsat stejný objekt a poté použít Assert::equal(…)
3., 4. Tohle už jsou podle mě spíše integrační testy, osobně při unit testech databázi nepoužívám a snažím se jí vyhnout jak čert kříži :) S tím je vždycky problém.
Například tedy pokud mám nějaký model, který vytváří categorii a je závislý na Connection, pak bych testoval v té metodě přes nějaký mock (používám mockistu https://bitbucket.org/…esl/mockista) a u něj bych si nastavil že očekávám volání metody table s parametrem category, poté metody insert s tím konkrétním polem.
Tímto podle mého testuješ pak pouze tento jeden model a nikoliv jeho závislosti. Ale věřím, že mnozí na toto mají jiný názor, ono více méně programování bylo, je, a bude subjektivní :)
5. Nevidím důvod proč tomu tak dělat .. každé kvalitní IDE určitě zvládá nastavit spouštění testů – já používám phpStorm (ale jistě to umí i NetBeans) a zde lze jednoduše nastavit spouštění testů jedním tlačítkem (či zkratkou) a zároveň i třeba před deploymentem či před commitem
6. Ano CodeCoverage – https://github.com/…e-report.php
Využívá to XDebug, a nejsem si jist, jak přesně to funguje, ale řekl bych
že to bere z XDebugu volané metody VS metody které volané nebyly nad
testovaném objektem a zobrazí pak ono schéma.
- llook
- Člen | 407
- Inicializace dat je normální součástí testu, to máš správně.
- Sedm assertů není moc. Někteří fanatici zastávají zásadu 1 assert na 1 test. Toho se dá docílit tím, že jeden test testuje vždy jen jednu „věc“. Mohlo by to vypadat nějak takto. Je to lepší, než opačný extrém (dlouhé test metody testující spoustu věcí najednou), ale mě to přijde už moc.
- setUp()
- https://forum.nette.org/…ace-databaze
- Asi by šlo nějak použít Grunt Watch nebo něco podobného. Není to špatný nápad, ale nevím o nikom, kdo by to v PHP dělal, takže by sis to celé musel sám vyrobit. Jednodušší je prostě to spouštět v konzoli nebo v konzoli IDE, jak radí frosty22.
- Analýza pokrytí kódu (code coverage analysis). Nette Tester to nějak umí, nevím přesně jak (nepoužívám Nette Tester). Výsledek může vypadat třeba nějak takto: http://developer.joomla.org/cms-coverage/
- Filip Procházka
- Moderator | 4668
Nette\Tester obsahuje naivní implementaci --watch
, viz https://github.com/…r/tester.php#L48