Ověření zda 100% kódu je pokryto testy rubrika: Programování: PHP

8 rmaslo
položil/-a 15.6.2015

Testy si píšu sám bez pomoci frameworků, takže nemám 100% přehled o tom co vše již existuje.
Proto se ptám zde,

Existuje pro PHP nějaký nástroj, který zjistí zda se v průběhu testů prošly všechny části zdrojového kódu?

Osobně si myslím, že by něco takového neměl být zas takový problém naprogramovat.
Idea: Vzít tokenizer, každý středník zdrojáku nahradit očíslovanou funkcí "TudyJsemProšel" tj. něčím jako "; Tested(123) ;" a po skončení testů vyhodnotit která čísla chybí.
Vidím tam pár specialitek typu: Jednopříkazový statement neuzavřený do složených závorek, ternální operátor a větvení dělané pomocí && či ||. Ale celkově si myslím, že by to naprogramovat mělo jít.
Předpokládám, že nejsem první koho něco takového napadlo, ale najít to fakt nikde nemohu.

odkaz
5 vaclav.sir
odpověděl/-a 16.6.2015

Všechny nástroje pro code coverage v PHP jsou pokud vím postavené na XDebugu. Co se týče zmíněných specialitek, tak ternární operátor ti označí celý jako provedený, i když se provede pouze jedna větev, stejně tak větvení typu $condition && action(); je pro něj jeden statement.

Jak se používá code coverage v PHPUnit je popsané tady:

Pokud ty reporty mají mít nějakou vypovídající hodnotu, tak stojí za zvážení používání anotace @covers, aby ti zezelenal pouze ten kód, který daný test skutečně testuje a ne kód, který se volá mimoděk při testování něčeho jiného.

PhpStorm umí PHPUnit testy spouštět s coverage, kterou pak zobrazí v editoru vedle kódu, to se taky občas hodí: https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/23

Nette Tester je na tom o něco hůř, ale základní podporu má taky - umí vygenerovat HTML report, nebo XML: http://tester.nette.org/#toc-coverage-path

Dobré je také vědět, že do reportu jsou zahrnuty pouze soubory, které se během toho průchodu provedou, o ostatních XDebug pochopitelně neví. Takže jestli cílíš na nějaké procento pokrytí (můžeme se tu pohádat, jestli to není blbost ;-) ), tak bys měl nějak naincludovat všechny soubory v projektu, jinak budeš mít dost zkreslená čísla.

Komentáře

  • arron : PhpUnit se dá nastavit tak, že do reportu zahrne všechn soubory, které se mu řeknou, že je má zahrnout. Ty které se neprojdou se pak označí jako nepokryté. Což je super, protože i když máš jenom jeden unit test, který testuje jednu nějakou funkci v jedné třídě, tak vidíš, kolik Ti to ho ještě zbývá pokrýt. Zároveň se dají celé složky i blacklistovat, takže se v coverage nezobrazují třeba testovací knihovny nebo testy samotné. 16.6.2015
  • rmaslo : Dík všem za odpovědi. První co mi pomohlo a co jsem potřeboval vědět bylo to, že procesu se říká coverage. Pak už se dá googlit. Asi všechny postupy používají XDebug, celkem logicky, nemuseji přitom parsovat PHP kód atd... Chápu proč autoři zvolili zrovna toto řešení. Z principu XDebugu je dané jak se to chová u ternálních operátorů atd... 17.6.2015

Pro zobrazení všech 3 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.