Изпълнение на тестове
Най-видимата част на 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
Приоритетът за избор на механизъм за събиране е следният:
- PCOV
- PHPDBG
- 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, а не на Тестера.