Test Coverage s Nette Testerom

Nette Tester mal štandardnú podporu pre export pokrytia testami do HTML už aj v minulosti. Až v najnovšej verzií 1.4 však dostal vďaka aktívnej komunite podporu pre export ďalších formátov. Konkrétne je po novom natívne podporovaný export do Clover XML, ktorý podporuje napríklad aj PHPUnit.

Načo je to dobré?

Za prvé, môžeme získať na GitHub peknú ikonku so zobrazeným percentuálnym pokrytím testami.

Druhou, užitočnejšou, výhodou je získanie prehľadu o pokrytí do externého softwaru, v mojom prípade do Scrutinizeru.

Ako na to?

Na príklade si ukážeme ako prepojiť trojicu služieb GitHub, Travis CI a Scrutinizer. Ako príklad použijeme primitívnu knižnicu Null, ktorá nerobí nič. Doslova nič! Odpoveďou na volanie metódy bude proste za každých okolností NULL.

Ak by sme použili platenú verziu Scrutinizeru nebolo by použitie Travisu nutné. Predpokladám aplikovanie návodu pre open-source projekty s free pricingom použitých služieb.

Vytvorenie projektu GitHub

GithHub použijeme klasicky iba na hostovanie zdrojákov. Vytvoríme repozitár Null so super knižnicou :).

class Null
{
    public static function get($var)
    {
        return NULL;
    }
}

Keďže nám ide o pokrytie testami, pridáme aj nejaký ten testík.

Assert::same(NULL, Null::get(NULL));
Assert::same(NULL, Null::get(""));
Assert::same(NULL, Null::get(1));
Assert::same(NULL, Null::get(new StdClass));

Závislosti nastavíme cez composer. Predpokladám, že toto je už štandard, ktorý netreba rozoberať.

Zatiaľ nebudeme pushovať samotné zdrrojáky, vystačíme si s vytvoreným repozitárom. Dôvodom je, že najprv si nakonfigurujeme služby a následne pri uploade repozitáru nám zbehne už aj automatizované testovanie a generovanie súmáru pokrytia testami.

Nastavenie Scrutinizeru Scrutinizer

Scrutinizer je možné nastaviť prostredníctvom súboru .scrutinizer.yml.

Štandardne od neho chceme analýzu PHP súborov:

checks:
    php:
        code_rating: true
        duplication: true

Aktuálne navyše chceme aby Scrutinizer čakal na prijatie Clover XML od Travisu:

tools:
    external_code_coverage:
       timeout: 600

Vytvoríme nový repozitár v Scrutinizeri, resp. prepojíme ho s GitHub-om a autorizujeme.

Nastavenie Travisu Travis

Oproti bežnej konfigurácií pridáme do .travis.yml premennú FLAGS. Keďže chceme generovať súbor iba raz, vyberieme si niektorú verziu PHP a vygenerujeme coverage.xml iba v nej.

before_script:
    - if [[ "$TRAVIS_PHP_VERSION" = "5.6" ]]; then FLAGS="-d extension=xdebug.so --coverage coverage.xml --coverage-src src"; fi;

Samotné testovanie spustíme s premennou FLAGS, ktorá bude nastavená iba pre PHP 5.6.

script:
    - vendor/bin/tester -p php tests -s $FLAGS

Posledným potrebným nastavením je samotné odoslanie vygenerovaného coverage.xml do Scrutinizeru. Pravdaže ho budeme odosielať iba vtedy keď bude vygenerovaný - iba pri PHP 5.6.

after_script:
    - |
        if [ $TRAVIS_PHP_VERSION = '5.6' ]; then
            wget https://scrutinizer-ci.com/ocular.phar
            php ocular.phar code-coverage:upload --format=php-clover coverage.xml
        fi

Zároveň aktivujeme v Travis CI náš nový prázdny repozitár Null.

Finish

Na koniec pushneme zdrojáky na GitHub a pozrieme sa či všetko funguje:)

Travis CI

Podla očakávania dostávame z Travisu úspešný build:

Jedinou chybyčkou krásy je, že som použil nešťastný názov knižnice - rezervované slovo a preto testy na PHP 7 padajú.

Scrutinizer

Scrutinizer nám poskytne sadu stavových ikon:



Záver

Ako vidno, nie je to nič zložité, tak smelo do toho. Určite to nie je jediný správny postup, ale k takémut riešeniu som sa dopracoval ja. Nejaké nápady na vylepšenie? Prípadne prepojenie s inými službami?

Zdroje

www.adayinthelifeof.nl/2013/11/20/external-code-coverage-with-travis-scrutinizer