Nette Documentation Preview

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

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

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

/--pre .[terminal]
vendor/bin/tester .
\--

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

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

- <code style="color: #CCC; background-color: #000">.</code> - тестът е преминал
- <code style="color: #CCC; background-color: #000">s</code> - тестът е пропуснат
- <code style="color: #FFF; background-color: #900">F</code> - тестът е неуспешен

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

/--pre .[terminal]
 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5.2

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

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

<span style="color: #FFF; background-color: #090">OK (35 tests, 1 skipped, 1.7 seconds)</span>
\--

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

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

.[warning]
Тестерът стартира PHP процеси без `php.ini`. Повече подробности в раздела [Собствен php.ini |#Own php.ini].


Опции на командния ред .[#toc-command-line-options]
===================================================

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

/--pre .[terminal]
 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  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> .[filter]
-------------------
Указва двоичния файл на PHP, който ще се използва за изпълнение на тестовете. По подразбиране това е `php`.

/--pre .[terminal]
tester -p /home/user/php-7.2.0-beta/php-cgi tests
\--


-c <path> .[filter]
-------------------
Указва кой `php.ini` ще се използва при изпълнение на тестовете. По подразбиране не се използва php.ini. Вижте [Собствен php.ini |#Own php.ini] за повече информация.


-C .[filter]
------------
Използва се общосистемният `php.ini`. Така че на платформата UNIX се използват и всички файлове `/etc/php/{sapi}/conf.d/*.ini`. Вижте раздела [Собствен php.ini |#Own php.ini].


-d <key=value> .[filter]
------------------------
Задава стойността на конфигурационната директива на PHP за тестове. Параметърът може да се използва многократно.

/--pre .[terminal]
tester -d max_execution_time=20
\--


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


--stop-on-fail .[filter]
------------------------
Тестерът спира тестването при първия неуспешен тест.


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


-o <console|console-lines|tap|junit|log|none> .[filter]
-------------------------------------------------------
Изходен формат. По подразбиране е конзолният формат. Можете да посочите името на файла, в който ще бъде записан изходният файл (напр. `-o junit:output.xml`). Опцията `-o` може да се повтори многократно, за да се генерират няколко формата наведнъж.

- `console`: същият като по подразбиране, но в този случай не се отпечатва ASCII логото
- `console-lines`: подобно на конзолата, но резултатът от всеки тест се изписва на отделен ред с повече информация
- `tap`: [TAP формат, |https://en.wikipedia.org/wiki/Test_Anything_Protocol] подходящ за машинна обработка
- `junit`: JUnit XML формат, подходящ и за машинна обработка
- `log`: Извежда информация за хода на тестването. Всички неуспешни, пропуснати, а също и успешни тестове
- `none`: не се отпечатва нищо


''-w | --watch <path>'' .[filter]
---------------------------------
Тестерът не приключва след приключване на тестовете, а продължава да работи и да наблюдава PHP файловете в дадената директория. При промяна той изпълнява тестовете отново. Параметърът може да се използва многократно, ако искаме да наблюдаваме няколко директории.

Удобно е при рефакториране на библиотека или при отстраняване на грешки в тестовете.

/--pre .[terminal]
tester --watch src tests
\--


''-i | --info'' .[filter]
-------------------------
Показва информация за средата, в която се изпълнява тестът. Например:

/--pre .[terminal]
tester -p /usr/bin/php7.1 -c tests/php.ini --info

<span style="color: #0F0">PHP binary:</span>
/usr/bin/php7.1

<span style="color: #0F0">PHP version:</span>
7.1.7-1+0~20170711133844.5+jessie~1.gbp5284f4 (cli)

<span style="color: #0F0">Code coverage engines:</span>
(not available)

<span style="color: #0F0">Loaded php.ini files:</span>
/var/www/dev/demo/tests/php.ini

<span style="color: #0F0">PHP temporary directory:</span>
/tmp

<span style="color: #0F0">Loaded extensions:</span>
Core, ctype, date, dom, ereg, fileinfo, filter, hash, ...
\--


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

```php
$runner->outputHandlers[] = new MyOutputHandler;
```

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

/--pre .[terminal]
tester --setup tests/runner-setup.php tests
\--


--temp <path> .[filter]
-----------------------
Задава път до директория за временни файлове на Tester. Стойността по подразбиране се връща от `sys_get_temp_dir()`. Когато стойността по подразбиране не е валидна, ще бъдете уведомени.

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


--colors 1|0 .[filter]
----------------------
Тестерът разпознава цветен терминал по подразбиране и оцветява своя изход. Тази опция е над автоматичното откриване. Можем да зададем оцветяването глобално чрез системната променлива на средата `NETTE_TESTER_COLORS`.


--coverage <path> .[filter]
---------------------------
Тестерът ще генерира отчет с преглед на това колко е покрит изходният код от тестовете. Тази опция изисква включено PHP разширение [Xdebug |https://xdebug.org/] или [PCOV |https://github.com/krakjoe/pcov], или PHP 7 с PHPDBG SAPI, което е по-бързо. Разширението на целевия файл определя формата на съдържанието. HTML или Clover XML.

/--pre .[terminal]
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 отчет":https://files.nette.org/tester/coverage.html с покритие на кода.


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


Собствен php.ini .[#toc-own-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 може да изглежда по следния начин:

```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, а не на Тестера.

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

Най-видимата част на 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, а не на Тестера.