1. Установка PHPUnit

Требования

PHPUnit latest требует PHP 7.1; настоятельно рекомендуется использовать последнюю версию PHP.

PHPUnit требует расширений dom и json, которые обычно включены по умолчанию.

PHPUnit также требует расширений pcre, reflection и spl. Эти стандартные расширения включены по умолчанию и не могут быть отключены без внесения изменений в систему сборки PHP и/или в исходный код C.

Для функциональности отчёта по покрытию кода тестами требуются расширения Xdebug (2.5.0 или новее) и tokenizer. Генерация XML-отчётов требует расширения xmlwriter.

PHP Archive (PHAR)

Самый простой способ получить PHPUnit — загрузить PHP Archive (PHAR), в котором есть все необходимые (а также некоторые необязательные) зависимости PHPUnit, собранные в одном-единственном файле.

Расширение phar обязательно для использования PHP Archives (PHAR).

Если расширение Suhosin включено, вам необходимо разрешить выполнение PHAR в вашем php.ini:

suhosin.executor.include.whitelist = phar

Для глобальной установки PHAR:

$  wget https://phar.phpunit.de/phpunit-|version|.phar
$  chmod +x phpunit-|version|.phar
$  sudo mv phpunit-|version|.phar /usr/local/bin/phpunit
$  phpunit --version
PHPUnit x.y.z by Sebastian Bergmann and contributors.

Вы также можете использовать загруженный PHAR-файл напрямую:

$  wget https://phar.phpunit.de/phpunit-|version|.phar
$  php phpunit-|version|.phar --version
PHPUnit x.y.z by Sebastian Bergmann and contributors.

Windows

Глобальная установка PHAR включает ту же самую процедуру, что и ручная установка Composer на Windows:

  1. Создать папку для двоичных файлов PHP; например, C:\bin

  2. Добавить ;C:bin к вашей переменной окружения PATH (справочная информация по этой теме)

  3. Загрузить https://phar.phpunit.de/phpunit-|version|.phar и сохранить файл по пути C:\bin\phpunit.phar

  4. Открыть командую строку (например, нажать WindowsR » ввести cmd » ENTER)

  5. Создать пакетный скрипт (в результате получится C:\bin\phpunit.cmd):

    C:\Users\username>  cd C:\bin
    C:\bin>  echo @php "%~dp0phpunit.phar" %* > phpunit.cmd
    C:\bin>  exit
    
  6. Открыть новую командную строку и убедиться, что вы можете выполнить PHPUnit из любого пути:

    C:\Users\username>  phpunit --version
    PHPUnit x.y.z by Sebastian Bergmann and contributors.
    

Для командных оболочек Cygwin и/или MingW32 (например, TortoiseGit) вы можете пропустить шаг 5 выше, просто сохранив файл как phpunit (без расширения .phar) и сделав его исполняемым через команду chmod 775 phpunit.

Проверка релизов PHPUnit PHAR

Все официальные релизы кода, распространяемые проектом PHPUnit, подписываются релиз-менеджером. Подписи PGP и хеши SHA1 доступны для проверки на phar.phpunit.de.

В следующем примере показано, как работает проверка релиза. Мы начинаем с загрузки phpunit.phar, а также его отделённой подписи PGP phpunit.phar.asc:

wget https://phar.phpunit.de/phpunit.phar
wget https://phar.phpunit.de/phpunit.phar.asc

Мы хотим проверить PHP Archive (phpunit.phar) PHPUnit с его отделённой подписью (phpunit.phar.asc):

gpg phpunit.phar.asc
gpg: Signature made Sat 19 Jul 2014 01:28:02 PM CEST using RSA key ID 6372C20A
gpg: Can't check signature: public key not found

У нас нет открытого ключа релиз-менеджера (6372C20A) в нашей локальной системе. Для продолжения проверки нам нужно получить открытый ключ релиз-менеджера с сервера ключей. Один из таких серверов — это pgp.uni-mainz.de. Серверы открытых ключей связаны между собой, поэтому вы можете подключиться к любому из них.

gpg --keyserver pgp.uni-mainz.de --recv-keys 0x4AA394086372C20A
gpg: requesting key 6372C20A from hkp server pgp.uni-mainz.de
gpg: key 6372C20A: public key "Sebastian Bergmann <sb@sebastian-bergmann.de>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

Теперь мы получили открытый для сущности, известной как «Sebastian Bergmann <sb@sebastian-bergmann.de>». Однако, у нас нет способа проверить, что этот ключ был создан человеком под именем Себастьян Бергман (Sebastian Bergmann). Но давайте снова попробуем проверить подпись релиза.

gpg phpunit.phar.asc
gpg: Signature made Sat 19 Jul 2014 01:28:02 PM CEST using RSA key ID 6372C20A
gpg: Good signature from "Sebastian Bergmann <sb@sebastian-bergmann.de>"
gpg:                 aka "Sebastian Bergmann <sebastian@php.net>"
gpg:                 aka "Sebastian Bergmann <sebastian@thephp.cc>"
gpg:                 aka "Sebastian Bergmann <sebastian@phpunit.de>"
gpg:                 aka "Sebastian Bergmann <sebastian.bergmann@thephp.cc>"
gpg:                 aka "[jpeg image of size 40635]"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: D840 6D0D 8294 7747 2937  7831 4AA3 9408 6372 C20A

В данный момент подпись хорошая, но мы не доверяем этому ключу. Хорошая подпись означает, что файл не был изменён. Однако ввиду характера криптографии открытого ключа вам необходимо дополнительно проверить, что ключ 6372C20A был создан настоящим Себастьяном Бергманом.

Любой злоумышленник может создать открытый ключ и загрузить его на серверы открытых серверов. Затем они могут создать вредоносный релиз, подписанный этим поддельным ключом. key. После чего, если вы попытаетесь проверить подпись этого испорченного релиза, проверка будет успешной, потому что ключ не является «реальным» ключом. Поэтому вам нужно проверить подлинность этого ключа. Однако проверка подлинности открытого ключа выходит за рамки данной документации.

Возможно, было бы целесообразно создать скрипт командной оболочки для управления установкой PHPUnit, который проверяет подпись GnuPG перед запуском набора тестов. Например:

#!/usr/bin/env bash
clean=1 # Удалить phpunit.phar после завершения выполнения тестов?
aftercmd="php phpunit.phar --bootstrap bootstrap.php src/tests"
gpg --fingerprint D8406D0D82947747293778314AA394086372C20A
if [ $? -ne 0 ]; then
    echo -e "\033[33mDownloading PGP Public Key...\033[0m"
    gpg --recv-keys D8406D0D82947747293778314AA394086372C20A
    # Sebastian Bergmann <sb@sebastian-bergmann.de>
    gpg --fingerprint D8406D0D82947747293778314AA394086372C20A
    if [ $? -ne 0 ]; then
        echo -e "\033[31mCould not download PGP public key for verification\033[0m"
        exit
    fi
fi

if [ "$clean" -eq 1 ]; then
    # Let's clean them up, if they exist
    if [ -f phpunit.phar ]; then
        rm -f phpunit.phar
    fi
    if [ -f phpunit.phar.asc ]; then
        rm -f phpunit.phar.asc
    fi
fi

# Давайте возьмём последний релиз и его подпись
if [ ! -f phpunit.phar ]; then
    wget https://phar.phpunit.de/phpunit.phar
fi
if [ ! -f phpunit.phar.asc ]; then
    wget https://phar.phpunit.de/phpunit.phar.asc
fi

# Прорить перед запуском
gpg --verify phpunit.phar.asc phpunit.phar
if [ $? -eq 0 ]; then
    echo
    echo -e "\033[33mBegin Unit Testing\033[0m"
    # Запустить тестовый набор
    `$after_cmd`
    # Очистка
    if [ "$clean" -eq 1 ]; then
        echo -e "\033[32mCleaning Up!\033[0m"
        rm -f phpunit.phar
        rm -f phpunit.phar.asc
    fi
else
    echo
    chmod -x phpunit.phar
    mv phpunit.phar /tmp/bad-phpunit.phar
    mv phpunit.phar.asc /tmp/bad-phpunit.phar.asc
    echo -e "\033[31mSignature did not match! PHPUnit has been moved to /tmp/bad-phpunit.phar\033[0m"
    exit 1
fi

Composer

Просто добавьте (для разработки) зависимость phpunit/phpunit в файл composer.json вашего проекта, если вы используете Composer для управления зависимостями в вашей проекте:

composer require --dev phpunit/phpunit ^|version|

Необязательные пакеты

Доступны следующие необязательные пакеты:

PHP_Invoker

Класс-утилита для вызова функций обратного вызова с тайм-аутом. Этот пакет необходим для обеспечения выполнения тайм-аутов тестирования в строгом режиме.

Этот пакет включён в дистрибутив PHAR PHPUnit. Его можно установить через Composer, используя следующую команду:

composer require --dev phpunit/php-invoker

DbUnit

Порт DbUnit для PHP/PHPUnit для поддержки тестирования взаимодействия с базами данных.

Этот пакет не включён в дистрибутив PHAR PHPUnit. Его можно установить через Composer, используя следующую команду:

composer require --dev phpunit/dbunit