Выполнение тестов

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

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

vendor/bin/tester .

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

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

  • . – тест пройден
  • 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>

Задает путь к директории для временных файлов тестера. Значение по умолчанию возвращает 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 и распределить его между тестами. Затем запускаем Тестер с параметром -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, а не Тестера.