Статья описывает настройку окружения для функциональных тестов на PHP.
Например, такой типичный тест может:
- Открыть URL http://example.org/mypage в браузере
- Проверить, что на странице 20 картинок
- Нажать на вторую ссылку в навигации
- Проверить, что на новой странице также 20 картинок
- Закрыть браузер
А также произвести сложные выборки из DOM, вставить в поля формы текст и перейти по истории назад и вперёд.
Вот как это может выглядеть, на примере тестирования модуля для альплагеря Туюк-Су, который я разрабатывал:
Установка PHPUnit
PHPUnit — наиболее популярный фреймворк для юнит-тестирования в PHP.
Установить в проект PHPUnit
:
1 2 | composer require --dev phpunit/phpunit ^|version| # ^6.5 в моём случае ./vendor/bin/phpunit --version |
(официальная документация по установке)
Установка Selenium
Selenium Server — это инструмент, который позволяет писать автоматизированные тесты UI веб-приложений или сайтов. Запущенный тест выглядит как браузер, который сам нажимает кнопки, ходит по ссылкам и сверяет, что отображается на странице с тем, что должно отображаться по заданному сценарию.
- Скачать с официального сайта последнюю версию
selenium-server-standalone-<version>.jar
- Положить .jar-файл в
/usr/local/bin
(или куда удобно, я храню в /opt/ с полным названием, включая версию, и делаю ссылку в /usr/local/bin с коротким именем) - Перед тестами запускать сервер командой
java -jar /usr/local/bin/selenium-server-standalone[-<version>].jar
.
Опция--port
позволяет указать порт, на котором сервер будет слушать соединения (по-умолчанию 4444). Опция полезна для решения конфликтов с веб-драйверами, которые могут по-умолчанию слушать тот же 444-й порт.
Для того, чтобы Selenium мог запускать различные браузеры, нужно установить отдельные адаптеры для каждого.
geckodriver — это адаптер для взаимодействия Selenium и браузеров на основе движка Gecko, на котором работает фаерфокс.
- Скачать с официального репозитория последнюю версию для нужной платформы.
- Положить
geckodriver
в любой из каталоговPATH
(Например,/usr/local/bin
), чтобы исполняемый файл был доступен для сервера селениума.
ChromeDriver — адаптер для браузеров на основе Chromium, а значит, и хрома.
- Скачать с официального сайта последнюю версию
- Добавить
chromedriver
вPATH
Настройка и запуск
Установить PHPUnit в директорию с проектом:
1 2 | composer require --dev phpunit/phpunit composer require --dev phpunit/phpunit-selenium |
Настроить конфиг PHPUnit phpunit.xml (тесты будут храниться в Test/Selenium/)
1 2 3 4 5 6 7 8 9 10 11 12 13 | <phpunit backupGlobals="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" > <testsuites> <testsuite name="public_ui"> <directory suffix="Test.php">./Test/Selenium/</directory> </testsuite> </testsuites> </phpunit> |
Перед тестами запустить сервер Selenium:
1 | java -jar /usr/local/bin/selenium-server.jar -port 4445 |
Стандартный тест должен наследовать класс PHPUnit_Extensions_Selenium2TestCase
и реализовывать метод setUp()
, в котором настраивается соединение с Selenium.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class MyTest extends \PHPUnit_Extensions_Selenium2TestCase { /** * Выполняется перед запуском всех тестов в этом файле */ protected function setUp() { $this->setHost('localhost'); // Хост Selenium server $this->setPort(4445); // Порт Selenium $this->setBrowser('chrome'); // или // $this->setBrowser('fitefox'); $this->setBrowserUrl(self::BASE_URL); } /** * Выполняется после завершения всех тестов * Закрыть браузер, уничтожить сессию */ protected function tearDown() { $this->stop(); } // Остальные методы } |
Тесты запускаются командой:
1 2 3 | phpunit # При желании, конфиг можно убрать в другую директорию, чтобы не загрязнять корень проекта # phpunit -c Test/Selenium/phpunit.xml |
Можно добавить команду в composer.json, чтобы не печатать каждый раз аргументы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | { "scripts": { "ac:run-selenium-server": [ "./scripts/run-selenium.sh &" ], "test:selenium": [ "./vendor/bin/phpunit -c Test/Selenium/phpunit-selenium.xml --stop-on-failure" ] }, "scripts-descriptions": { "test:selenium": "Run E2E tests with Selenium", "ac:run-selenium-server": "Run Selenium server (must be called before Selenium E2E tests)", } } |
Примеры кода, туториалы
- Полезный и объёмный файл со множеством примеров тестов Selenium на PHP
- Пошаговая установка и настройка Selenium+PHPUnit, примеры некоторых типовых тестов
- PHPUnit и Selenium, официальная документация, примеры кода
- PHPUnit для начинающих
- Поддержка PHPUnit в PhpStorm