Nette\Tester: Pár otázek k testování modelu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Myiyk
Člen | 321
+
0
-

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ě:

  1. Jak udělat zdroj dat pro testování? (u mě proměnná $insertData)
  2. Jak nahradit tu hromadu Assert::same(), přece to musí jít porovnat jednodušeji.
  3. Kde bych si měl předpřipravit databázi? (vytvořit databázi a nahrát strukturu)
  4. 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?
  5. Jak spouštět testy z prohlížeče nebo při změně kódu?
  6. 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)

Myiyk
Člen | 321
+
0
-
  1. Zdroj dat funguje stejně jako u phpUnit, pomocí @dataProvider

Ostatní stále netuším

frosty22
Člen | 373
+
0
-

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
+
0
-
  1. Inicializace dat je normální součástí testu, to máš správně.
  2. 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.
  3. setUp()
  4. https://forum.nette.org/…ace-databaze
  5. 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.
  6. 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
+
0
-

Nette\Tester obsahuje naivní implementaci --watch, viz https://github.com/…r/tester.php#L48

Myiyk
Člen | 321
+
0
-

Akorát nechápu ten zámek (bod 4.)

Tester\Helpers::lock('db', dirname(TEMP_DIR));

Druhý parametr chápu tak, že se do té složky uloží nějaký soubor, aby se testovací vlákna domluvily na pořadí.

Ale jak funguje ten první parametr?

Editoval Myiyk (5. 9. 2013 13:54)

enumag
Člen | 2118
+
0
-

@Myiyk: Tester nepoužívám, ale tipnul bych si že je to identifikátor toho zámku. Databáze nemusí být to jediné na co potřebuješ zamykání.

Editoval enumag (5. 9. 2013 14:00)

Jan Tvrdík
Nette guru | 2595
+
0
-

@Myiyk: Nejlépe to pochopíš pohledem na implementaci.