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

Самая заметная часть Nette Tester – запускатель тестов из командной строки. Он чрезвычайно быстрый и надёжный, потому что автоматически запускает все тесты как отдельные процессы параллельно в нескольких потоках. Он также умеет работать в режиме наблюдения.

Запускатель тестов вызывается из командной строки. Параметром передайте каталог с тестами. Для текущего каталога достаточно ввести точку:

vendor/bin/tester .

Запускатель тестов обходит указанный каталог и все его подкаталоги и ищет тесты, то есть файлы, оканчивающиеся на *.phpt или *Test.php. Он также читает и вычисляет их аннотации, чтобы определить, какие тесты и как запускать.

Каждый файл теста выполняется в собственном изолированном процессе PHP, и запускатель выполняет несколько таких процессов сразу, так что единицей параллелизма является файл. Код внутри одного файла поэтому выполняется последовательно. TestCase живёт в одном файле, поэтому по умолчанию его методы выполняются один за другим в одном процессе; пометьте его аннотацией @testCase, чтобы запускатель вместо этого выполнял каждый тестовый метод как отдельный параллельный процесс.

Затем он выполняет тесты. Во время выполнения он выводит в терминал символы, обозначающие ход работы:

  • . – тест прошёл
  • s – тест был пропущен
  • F – тест провалился

Вывод может выглядеть так:

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

PHP 8.5.2 (cli) | php | 8 threads

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

OK (35 tests, 1 skipped, 1.7 seconds)

При повторном запуске он сначала выполняет тесты, которые провалились при предыдущем запуске, так что вы сразу узнаёте, исправили ли вы ошибку.

Код выхода Tester равен нулю, если ни один тест не провалился. Иначе он ненулевой.

Параметры командной строки

Обзор параметров командной строки можно получить, запустив Tester без параметров или с параметром -h:

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

Usage:
    tester [options] [<test file> | <directory>]...

Options:
    -p <path>                    Specify PHP interpreter to run (default: php).
    -c <path>                    Use custom php.ini, ignore system configuration.
    -C                           With -c, include system configuration as well.
    -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.

-C

При использовании вместе с -c подключает и системную конфигурацию (не игнорирует её). Смотрите раздел Собственный 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>

Задаёт формат вывода. По умолчанию используется формат console. Можно указать имя файла, в который будет записан вывод (например, -o junit:output.xml). Параметр -o можно повторить несколько раз, чтобы породить несколько форматов сразу.

  • console: то же, что формат по умолчанию, но ASCII-логотип в этом случае не выводится
  • console-lines: похож на console, но результат каждого теста выводится на отдельной строке с дополнительными сведениями
  • tap: формат TAP, пригодный для машинной обработки
  • junit: формат JUnit XML, тоже пригодный для машинной обработки
  • 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 либо SAPI PHPDBG, который работает быстрее. Расширение целевого файла определяет его формат: 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() внутри вашего теста. Он записывает собранные данные на диск и освобождает память. Вызов действует только с движком PHPDBG; с PCOV, Xdebug или когда сбор данных не выполняется, он ничего не делает.

Посмотрите `пример HTML-отчёта с покрытием кода.

--coverage-src <path>

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

Собственный php.ini

Для своих тестов вы можете использовать собственный файл php.ini. Если вам нужны определённые расширения или особые настройки 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

При использовании -c Tester игнорирует системную конфигурацию (запускает PHP с флагом -n). Если вы хотите подключить и системную конфигурацию, добавьте параметр -C: tester -c tests/php.ini -C tests. Даже при сочетании -c и -C другие INI-файлы из /etc/php/conf.d/*.ini в UNIX не загружаются. Это поведение PHP, а не особенность Tester.

До версии 2.6 Tester без -c запускал PHP с флагом -n, то есть без php.ini; параметр -C это подавлял. Начиная с версии 2.6 системный php.ini загружается по умолчанию. Поведение при использовании -c осталось прежним.