Стартиране на тестове

Най-видимата част на Nette Tester е стартерът на тестове от командния ред. Той е изключително бърз и стабилен, тъй като автоматично стартира всички тестове като самостоятелни процеси и то паралелно в няколко нишки. Също така може да се стартира сам в т.нар. watch режим.

Стартерът на тестове се извиква от командния ред. Като параметър посочваме директорията с тестовете. За текущата директория е достатъчно да зададем точка:

vendor/bin/tester .

Стартерът на тестове претърсва зададената директория и всички поддиректории и търси тестове, които са файлове *.phpt и *Test.php. Същевременно чете и оценява техните анотации, за да знае кои от тях и как да стартира.

След това стартира тестовете. По време на изпълнение на тестовете изписва непрекъснато резултатите на терминала като знаци:

  • . – тестът премина
  • s – тестът беше пропуснат (skipped)
  • F – тестът се провали (failed)

Изходът може да изглежда например така:

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

При повторно стартиране първо изпълнява тестовете, които при предишното изпълнение са се провалили, така че веднага разбирате дали сте успели да поправите грешката.

Ако никой тест не се провали, кодът на връщане на Tester е нула. В противен случай кодът на връщане е ненулев.

Tester стартира PHP процеси без php.ini. По-подробно в частта Собствен php.ini.

Параметри на командния ред

Преглед на всички опции на командния ред получаваме, като стартираме Tester без параметри или с параметър -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>

Указва PHP бинарния файл, който ще се използва за стартиране на тестовете. По подразбиране е php.

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

-c <path>

Указва кой php.ini ще се използва при стартиране на тестовете. По подразбиране не се използва никакъв php.ini. Повече в частта Собствен php.ini.

-C

Използва се системният php.ini. На UNIX също всички съответни INI файлове /etc/php/{sapi}/conf.d/*.ini. Повече в частта Собствен php.ini.

-d <key=value>

Задава стойността на PHP конфигурационна директива за тестовете. Параметърът може да бъде използван многократно.

tester -d max_execution_time=20

-s

Показва се информация за пропуснатите тестове.

--stop-on-fail

Tester спира тестването при първия провален тест.

-j <num>

Указва колко паралелни процеса с тестове да се стартират. Стойността по подразбиране е 8. Ако искаме всички тестове да се изпълнят последователно, използваме стойност 1.

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

Задава формата на изхода. По подразбиране е формат за конзола. Можете да посочите име на файл, в който да се запише изходът (напр. -o junit:output.xml). Опцията -o може да се повтори многократно и така да се генерират няколко формата едновременно.

  • console: идентично с формата по подразбиране, но в този случай не се показва ASCII логото
  • console-lines: подобно на console, но резултатът от всеки тест е посочен на отделен ред с допълнителна информация
  • tap: TAP формат подходящ за машинна обработка
  • junit: XML формат JUnit, също подходящ за машинна обработка
  • log: Изходи от процеса на тестване. Всички неуспешни, пропуснати, както и успешни тестове
  • none: нищо не се изписва

-w | --watch <path>

След завършване на тестването Tester не спира, а остава да работи и следи PHP файловете в указаната директория. При промяна стартира тестовете отново. Параметърът може да бъде използван многократно, ако искаме да следим няколко директории.

Полезно е при рефакторинг на библиотека или дебъгване на тестовете.

tester --watch src tests

-i | --info

Показва информация за средата на изпълнение за тестовете. Например:

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 при стартиране зарежда зададения PHP скрипт. В него е налична променливата Tester\Runner\Runner $runner. Да предположим файл tests/runner-setup.php със съдържание:

$runner->outputHandlers[] = new MyOutputHandler;

Стартираме Tester:

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

--temp <path>

Задава пътя до директорията за временни файлове на Tester. Стойността по подразбиране се връща от sys_get_temp_dir(). Ако стойността по подразбиране не е валидна, ще бъдете предупредени.

Ако не сме сигурни коя директория се използва, стартираме Tester с параметър --info.

--colors 1|0

По подразбиране Tester открива цветен терминал и оцветява своя изход. Тази опция презаписва автодетекцията. Глобално можем да настроим оцветяването със системната променлива на средата NETTE_TESTER_COLORS.

--coverage <path>

Tester генерира отчет с преглед колко от изходния код покриват тестовете. Тази опция изисква инсталирано PHP разширение Xdebug, или PCOV, или PHP 7 с PHPDBG SAPI, което е по-бързо. Разширението на целевия файл определя неговия формат. Или HTML, или Clover XML.

tester tests --coverage coverage.html  # HTML отчет
tester tests --coverage coverage.xml   # Clover XML отчет

Приоритетът при избор на механизъм е следният:

  1. PCOV
  2. PHPDBG
  3. Xdebug

При използване на PHPDBG можем при обемни тестове да срещнем провал на теста поради изчерпване на паметта. Събирането на информация за покритоя код е паметоемко. В този случай ни помага извикването на Tester\CodeCoverage\Collector::flush() вътре в теста. Записва събраните данни на диска и освобождава паметта. Ако събирането на данни не протича или се използва Xdebug, извикването няма никакъв ефект.

Пример за HTML отчет с покритие на кода.

--coverage-src <path>

Използваме едновременно с опцията --coverage. <path> е пътят до изходните кодове, за които се генерира отчетът. Може да се използва многократно.

Собствен php.ini

Tester стартира PHP процеси с параметър -n, което означава, че не се зарежда никакъв php.ini. На UNIX дори и тези от /etc/php/conf.d/*.ini. Това осигурява еднаква среда за изпълнение на тестовете, но също така изключва всички PHP разширения, обикновено заредени от системния PHP.

Ако искате да запазите зареждането на системните php.ini файлове, използвайте параметър -C.

Ако се нуждаете от някакви разширения или специални INI настройки за тестовете, препоръчваме създаването на собствен php.ini файл, който ще бъде разпространяван с тестовете. Tester след това стартираме с параметър -c, например tester -c tests/php.ini tests, където INI файлът може да изглежда така:

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

Стартирането на Tester в UNIX със системен php.ini, например tester -c /etc/php/cli/php.ini, не зарежда останалите INI от /etc/php/conf.d/*.ini. Това е свойство на PHP, не на Tester.