Rularea testelor

Partea cea mai vizibilă a Nette Tester este rulatorul de teste din linia de comandă. Este neobișnuit de rapid și robust, deoarece rulează automat toate testele ca procese separate și în paralel în mai multe fire de execuție. De asemenea, se poate rula singur în așa-numitul mod watch.

Rulatorul de teste îl apelăm din linia de comandă. Ca parametru specificăm directorul cu testele. Pentru directorul curent este suficient să specificăm un punct:

vendor/bin/tester .

Rulatorul de teste caută în directorul specificat și în toate subdirectoarele și găsește testele, care sunt fișiere *.phpt și *Test.php. În același timp, citește și evaluează adnotările lor, pentru a ști care dintre ele și cum să le ruleze.

Apoi rulează testele. În timpul executării testelor, afișează continuu rezultatele pe terminal sub formă de caractere:

  • . – testul a trecut
  • s – testul a fost omis (skipped)
  • F – testul a eșuat (failed)

Ieșirea poate arăta, de exemplu, astfel:

 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  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)

La rularea repetată, execută mai întâi testele care au eșuat la rularea anterioară, astfel încât aflați imediat dacă ați reușit să reparați eroarea.

Dacă niciun test nu eșuează, codul de retur al Testerului este zero. Altfel, codul de retur este nenul.

Tester rulează procesele PHP fără php.ini. Mai detaliat în secțiunea php.ini personalizat.

Parametrii liniei de comandă

Prezentarea generală a tuturor opțiunilor liniei de comandă o obținem rulând Tester fără parametri sau cu parametrul -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>

Specifică binarul PHP care va fi folosit pentru rularea testelor. Implicit este php.

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

-c <path>

Specifică ce php.ini va fi folosit la rularea testelor. Implicit, nu se folosește niciun php.ini. Mai multe în secțiunea php.ini personalizat.

-C

Se va folosi php.ini de sistem. Pe UNIX, de asemenea, toate fișierele INI relevante /etc/php/{sapi}/conf.d/*.ini. Mai multe în secțiunea php.ini personalizat.

-d <key=value>

Setează valoarea directivei de configurare PHP pentru teste. Parametrul poate fi folosit de mai multe ori.

tester -d max_execution_time=20

-s

Se vor afișa informații despre testele omise.

--stop-on-fail

Tester va opri testarea la primul test eșuat.

-j <num>

Specifică câte procese paralele cu teste se vor rula. Valoarea implicită este 8. Dacă dorim ca toate testele să ruleze în serie, folosim valoarea 1.

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

Setează formatul de ieșire. Implicit este formatul pentru consolă. Puteți specifica numele fișierului în care se va scrie ieșirea (de ex. -o junit:output.xml). Opțiunea -o poate fi repetată de mai multe ori pentru a genera mai multe formate simultan.

  • console: identic cu formatul implicit, dar în acest caz nu se afișează logo-ul ASCII
  • console-lines: similar cu console, dar rezultatul fiecărui test este specificat pe o linie separată cu informații suplimentare
  • tap: format TAP potrivit pentru prelucrare automată
  • junit: format XML JUnit, de asemenea potrivit pentru prelucrare automată
  • log: Ieșiri ale progresului testării. Toate testele eșuate, omise și, de asemenea, cele reușite
  • none: nu se afișează nimic

-w | --watch <path>

După finalizarea testării, Tester nu se închide, ci rămâne să ruleze și urmărește fișierele PHP din directorul specificat. La modificare, rulează din nou testele. Parametrul poate fi folosit de mai multe ori, dacă dorim să urmărim mai multe directoare.

Este util la refactorizarea unei biblioteci sau la depanarea testelor.

tester --watch src tests

-i | --info

Afișează informații despre mediul de rulare pentru teste. De exemplu:

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 la pornire încarcă scriptul PHP specificat. În acesta este disponibilă variabila Tester\Runner\Runner $runner. Presupunem fișierul tests/runner-setup.php cu conținutul:

$runner->outputHandlers[] = new MyOutputHandler;

Rulăm Tester:

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

--temp <path>

Setează calea către directorul pentru fișierele temporare ale Testerului. Valoarea implicită este returnată de sys_get_temp_dir(). Dacă valoarea implicită nu este validă, veți fi avertizat.

Dacă nu suntem siguri ce director se folosește, rulăm Tester cu parametrul --info.

--colors 1|0

Implicit, Tester detectează terminalul color și își colorează ieșirea. Această opțiune suprascrie autodetecția. Global, putem seta colorarea prin variabila de mediu de sistem NETTE_TESTER_COLORS.

--coverage <path>

Tester va genera un raport cu o prezentare generală a cât de mult cod sursă acoperă testele. Această opțiune necesită extensia PHP instalată Xdebug, sau PCOV, sau PHP 7 cu PHPDBG SAPI, care este mai rapid. Extensia fișierului țintă determină formatul său. Fie HTML, fie Clover XML.

tester tests --coverage coverage.html  # raport HTML
tester tests --coverage coverage.xml   # raport Clover XML

Prioritatea alegerii mecanismului este următoarea:

  1. PCOV
  2. PHPDBG
  3. Xdebug

La utilizarea PHPDBG, la testele extinse putem întâmpina eșecul testului din cauza epuizării memoriei. Colectarea informațiilor despre codul acoperit este consumatoare de memorie. În acest caz ne ajută apelul Tester\CodeCoverage\Collector::flush() în interiorul testului. Scrie datele colectate pe disc și eliberează memoria. Dacă colectarea datelor nu are loc sau se folosește Xdebug, apelul nu are niciun efect.

Exemplu de raport HTML cu acoperirea codului.

--coverage-src <path>

Se folosește împreună cu opțiunea --coverage. <path> este calea către codurile sursă pentru care se generează raportul. Se poate folosi în mod repetat.

php.ini personalizat

Tester rulează procesele PHP cu parametrul -n, ceea ce înseamnă că niciun php.ini nu este încărcat. Pe UNIX, nici cele din /etc/php/conf.d/*.ini. Acest lucru asigură un mediu identic pentru rularea testelor, dar elimină și toate extensiile PHP încărcate în mod normal de PHP-ul de sistem.

Dacă doriți să păstrați încărcarea fișierelor php.ini de sistem, folosiți parametrul -C.

Dacă aveți nevoie de anumite extensii sau setări INI speciale pentru teste, recomandăm crearea propriului fișier php.ini, care va fi distribuit cu testele. Tester îl rulăm apoi cu parametrul -c, de exemplu tester -c tests/php.ini tests, unde fișierul INI poate arăta astfel:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Rularea Testerului pe UNIX cu php.ini de sistem, de exemplu tester -c /etc/php/cli/php.ini, nu încarcă celelalte INI din /etc/php/conf.d/*.ini. Aceasta este o caracteristică a PHP, nu a Testerului.