Изпълнение на тестове

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

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

vendor/bin/tester .

Когато бъде извикан, test runner ще сканира посочената директория и всички поддиректории и ще търси тестове, които са файловете *.phpt и *Test.php. Той също така чете и оценява техните анотации, за да знае кои от тях и как да стартира.

След това ще изпълни тестовете. За всеки извършен тест, runner-ът отпечатва по един символ, за да покаже напредъка:

  • . – тестът е преминал
  • s – тестът е пропуснат
  • F – тестът е неуспешен

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

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

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

Кодът за изход на тестера е нула, ако никой не се е провалил. В противен случай е различен от нула.

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

Опции на командния ред

Получаваме преглед на опциите на командния ред, като стартираме Тестера без параметри или с опция -h:

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

Использование:
    tester [параметры] [<тестовый файл> | <каталог>]...

Параметры:
    -p <путь>                    Укажите интерпретатор PHP для запуска (по умолчанию: php).
    -c <path>                    Искать php.ini файл (или искать в директории) <path>.
    -C                           Использовать общесистемный php.ini.
    -d <ключ=значение>...        Определить INI-запись 'key' со значением 'value'.
    -s                           Показать информацию о пропущенных тестах.
    --stop-on-fail               Остановить выполнение при первом сбое.
    -j <num>                     Выполнять <num> заданий параллельно (по умолчанию: 8).
    -o <console|console-lines|tap|junit|log|none> (напр. -o junit:output.xml)
                                 Посочете един или повече изходни формати с незадължително име на файл.
    -w | --watch <путь>          Каталог просмотра.
    -i | --info                  Показать информацию об окружении тестов и выйти.
    --setup <путь>               Сценарий для настройки бегущей строки.
    --temp <path>                Път до временна директория. По подразбиране от sys_get_temp_dir().
    --colors [1|0]               Включить или отключить цвета.
    --coverage <путь>            Генерировать отчет о покрытии кода в файл.
    --coverage-src <путь>        Путь к исходному коду.
    -h | --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 се използват и всички файлове /etc/php/{sapi}/conf.d/*.ini. Вижте раздела Собствен php.ini.

-d <key=value>

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

tester -d max_execution_time=20

-s

Ще бъде показана информация за пропуснатите тестове.

--stop-on-fail

Тестерът спира тестването при първия неуспешен тест.

-j <num>

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

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

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

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

-w | --watch <path>

Тестерът не приключва след приключване на тестовете, а продължава да работи и да наблюдава 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>

Тестерът зарежда дадения PHP скрипт при стартиране. В него е налична променливата Tester\Runner\Runner $runner. Нека приемем, че файлът tests/runner-setup.php:

$runner->outputHandlers[] = new MyOutputHandler;

и стартираме Тестера:

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

--temp <path>

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

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

--colors 1|0

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

--coverage <path>

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

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

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

  1. PCOV
  2. PHPDBG
  3. Xdebug

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

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

--coverage-src <path>

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

Собствен php.ini

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

Ако искате да запазите системната конфигурация, използвайте параметъра -C.

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

[PHP]

extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll

memory_limit=512M

При стартиране на Тестера със системна опция php.ini в UNIX, например tester -c /etc/php/cgi/php.ini, не се зареждат други INI от /etc/php/conf.d/*.ini. Това е поведението на PHP, а не на Тестера.