Zagon testov

Najbolj vidna komponenta Nette Testerja je zaganjalnik testov iz ukazne vrstice. Je izjemno hiter in robusten, saj samodejno zažene vse teste kot ločene procese in to vzporedno v več nitih. Prav tako se zna zagnati sam v t.i. načinu watch.

Zaganjalnik testov kličemo iz ukazne vrstice. Kot parameter navedemo imenik s testi. Za trenutni imenik je dovolj vnesti piko:

vendor/bin/tester .

Zaganjalnik testov preišče navedeni imenik in vse podimenike ter poišče teste, kar so datoteke *.phpt in *Test.php. Hkrati bere in vrednoti njihove opombe, da ve, katere in kako jih zagnati.

Nato zažene teste. Med izvajanjem testov sproti izpisuje rezultate na terminal kot znake:

  • . – test je uspešen
  • s – test je bil preskočen (skipped)
  • F – test je neuspešen (failed)

Izpis lahko izgleda na primer takole:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

Note: No php.ini is used.
PHP 8.3.2 (cli) | php -n | 8 threads

........s..........................

OK (35 tests, 1 skipped, 1.7 seconds)

Pri ponovnem zagonu najprej izvaja teste, ki so pri prejšnjem zagonu bili neuspešni, tako da takoj izveste, ali ste napako uspeli odpraviti.

Če noben test ni neuspešen, je izhodna koda Testerja nič. Sicer je izhodna koda neničelna.

Tester zažene procese PHP brez php.ini. Podrobneje v delu Lasten php.ini.

Parametri ukazne vrstice

Pregled vseh možnosti ukazne vrstice dobimo z zagonom Testerja brez parametrov ali s parametrom -h:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

Usage:
    tester [options] [<test file> | <directory>]...

Options:
    -p <path>                    Specify PHP interpreter to run (default: php).
    -c <path>                    Look for php.ini file (or look in directory) <path>.
    -C                           Use system-wide php.ini.
    -d <key=value>...            Define INI entry 'key' with value 'value'.
    -s                           Show information about skipped tests.
    --stop-on-fail               Stop execution upon the first failure.
    -j <num>                     Run <num> jobs in parallel (default: 8).
    -o <console|console-lines|tap|junit|log|none>  (e.g. -o junit:output.xml)
                                 Specify one or more output formats with optional file name.
    -w | --watch <path>          Watch directory.
    -i | --info                  Show tests environment info and exit.
    --setup <path>               Script for runner setup.
    --temp <path>                Path to temporary directory. Default by sys_get_temp_dir().
    --colors [1|0]               Enable or disable colors.
    --coverage <path>            Generate code coverage report to file.
    --coverage-src <path>        Path to source code.
    -h | --help                  This help.

-p <path>

Določa izvedljivo datoteko PHP, ki se bo uporabljala za zagon testov. Standardno je to php.

tester -p /home/user/php-7.2.0-beta/php-cgi tests

-c <path>

Določa, kateri php.ini se bo uporabljal pri zagonu testov. Privzeto se noben php.ini ne uporabi. Več v delu Lasten php.ini.

-C

Uporabi se sistemski php.ini. V sistemu UNIX tudi vse ustrezne datoteke INI /etc/php/{sapi}/conf.d/*.ini. Več v delu Lasten php.ini.

-d <key=value>

Nastavi vrednost konfiguracijske direktive PHP za teste. Parameter se lahko uporabi večkrat.

tester -d max_execution_time=20

-s

Prikaže informacije o preskočenih testih.

--stop-on-fail

Tester ustavi testiranje ob prvem neuspešnem testu.

-j <num>

Določa, koliko vzporednih procesov s testi se zažene. Privzeta vrednost je 8. Če želimo, da vsi testi potekajo zaporedno, uporabimo vrednost 1.

-o <console|console-lines|tap|junit|log|none>

Nastavi izhodni format. Privzeti format je za konzolo. Lahko navedete ime datoteke, v katero se izpis zapiše (npr. -o junit:output.xml). Možnost -o lahko ponovite večkrat in tako generirate več formatov hkrati.

  • console: enak privzetemu formatu, vendar se v tem primeru ne prikaže logotip ASCII
  • console-lines: podobno kot console, vendar je rezultat vsakega testa naveden v ločeni vrstici z dodatnimi informacijami
  • tap: TAP format primeren za strojno obdelavo
  • junit: format JUnit XML, prav tako primeren za strojno obdelavo
  • log: Dnevniki poteka testiranja. Vsi neuspešni, preskočeni in tudi uspešni testi
  • none: nič se ne izpiše

-w | --watch <path>

Po končanem testiranju Tester ne konča, ampak ostane zagnan in spremlja datoteke PHP v navedenem imeniku. Ob spremembi ponovno zažene teste. Parameter lahko uporabite večkrat, če želite spremljati več imenikov.

Uporabno pri refaktoriranju knjižnice ali razhroščevanju testov.

tester --watch src tests

-i | --info

Prikaže informacije o okolju izvajanja testov. Na primer:

tester -p /usr/bin/php7.1 -c tests/php.ini --info

PHP binary:
/usr/bin/php7.1

PHP version:
7.1.7-1+0~20170711133844.5+jessie~1.gbp5284f4 (cli)

Code coverage engines:
(not available)

Loaded php.ini files:
/var/www/dev/demo/tests/php.ini

PHP temporary directory:
/tmp

Loaded extensions:
Core, ctype, date, dom, ereg, fileinfo, filter, hash, ...

--setup <path>

Tester ob zagonu naloži navedeni skript PHP. V njem je na voljo spremenljivka Tester\Runner\Runner $runner. Predpostavimo datoteko tests/runner-setup.php z vsebino:

$runner->outputHandlers[] = new MyOutputHandler;

Tester zaženemo:

tester --setup tests/runner-setup.php tests

--temp <path>

Nastavi pot do imenika za začasne datoteke Testerja. Privzeto vrednost vrne sys_get_temp_dir(). Če privzeta vrednost ni veljavna, boste opozorjeni.

Če niste prepričani, kateri imenik se uporablja, zaženite Tester s parametrom --info.

--colors 1|0

Privzeto Tester zazna barvni terminal in obarva svoj izpis. Ta možnost preglasi samodejno zaznavanje. Globalno lahko barvanje nastavite s sistemsko okoljsko spremenljivko NETTE_TESTER_COLORS.

--coverage <path>

Tester ustvari poročilo s pregledom, koliko izvorne kode pokrivajo testi. Ta možnost zahteva nameščeno razširitev PHP Xdebug ali PCOV ali PHP 7 s PHPDBG SAPI, ki je hitrejši. Končnica ciljne datoteke določa njen format. Bodisi HTML ali Clover XML.

tester tests --coverage coverage.html  # HTML poročilo
tester tests --coverage coverage.xml   # Clover XML poročilo

Prioriteta izbire mehanizma je naslednja:

  1. PCOV
  2. PHPDBG
  3. Xdebug

Pri uporabi PHPDBG lahko pri obsežnih testih naletite na neuspeh testa zaradi izčrpanja pomnilnika. Zbiranje informacij o pokritosti kode je pomnilniško zahtevno. V tem primeru vam pomaga klic Tester\CodeCoverage\Collector::flush() znotraj testa. Zapiše zbrane podatke na disk in sprosti pomnilnik. Če zbiranje podatkov ne poteka ali se uporablja Xdebug, klic nima učinka.

Primer poročila HTML s pokritostjo kode.

--coverage-src <path>

Uporabite hkrati z možnostjo --coverage. <path> je pot do izvorne kode, za katero se ustvari poročilo. Lahko se uporabi večkrat.

Lasten php.ini

Tester zažene procese PHP s parametrom -n, kar pomeni, da se ne naloži noben php.ini. V sistemu UNIX niti tisti iz /etc/php/conf.d/*.ini. To zagotavlja enako okolje za izvajanje testov, vendar tudi izključi vse razširitve PHP, ki jih običajno naloži sistemski PHP.

Če želite ohraniti nalaganje sistemskih datotek php.ini, uporabite parameter -C.

Če za teste potrebujete kakšne razširitve ali posebne nastavitve INI, priporočamo ustvarjanje lastne datoteke php.ini, ki bo distribuirana s testi. Tester nato zaženite s parametrom -c, na primer tester -c tests/php.ini tests, kjer lahko datoteka INI izgleda takole:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Zagon Testerja v sistemu UNIX s sistemskim php.ini, na primer tester -c /etc/php/cli/php.ini, ne naloži drugih INI iz /etc/php/conf.d/*.ini. To je lastnost PHP, ne Testerja.