Запуск тестів

Найпомітнішою частиною 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, виклик не має жодного ефекту.

coverage.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'а.