В Symfony 2 для работы с Behat используется php библиотека Mink. По умолчанию Behat использует goutte драйвер для все тестов. Этот драйвер работает довольно шустро, но он не поддерживает Javascript.
Goutte является так называемым headless браузером. Такого рода браузеры отсылают настоящие http запросы и парсят ответ сервера. Они очень просты в использовании и конфигурации, написать подобный браузер в виде консольного приложения довольно легко.
Недостатком большинства headless браузеров является неспособность выполнения Javascript, а уж тем более AJAX.
Для тестирования страниц с JS функционалом в основном используют так называемые “browser controllers”, которые способны запускать наши тесты в реальных браузерах. Так же существуют headless браузеры, способные выполнять Javascript.
Теперь перейдем к примерам. Работу с браузер контроллерами рассмотрим на примере Selenium2Driver, а в качестве примера драйвера для headless браузера выберем ZombieDriver, который управляет браузером Zombie.js. Этот браузер работает на node.js.
Selenium2Driver
Установка:
Скачиваем Selenium сервер отсюда: https://seleniumhq.org/download/ Запускаем его в качестве хаба:
java -jar selenium-server-standalone-2.25.0.jar -role hub
Запускаем на компьютере, где будут выполняться тесты:
java -jar selenium-server-standalone-2.25.0.jar -role node -hub https://127.0.0.1:4444/grid/register -browser browserName=firefox,version=10,maxInstances=1
Установка драйвера: https://github.com/Behat/MinkSelenium2Drive
Правка конфига в Behat.yml:
default: extensions: Behat\Symfony2Extension\Extension: mink_driver: true kernel: env: test debug: true Behat\MinkExtension\Extension: base_url: 'https://АДРЕС_САЙТА/' selenium2: wd_host: 'https://127.0.0.1:4444/wd/hub' capabilities: { "browser": "firefox", "browserVersion": "10", "browserName": "firefox", "version": "10"} default_session: 'symfony2' paths: features: features
Использование:
Чтобы запустить тест с помощью Selenium2Driver, к нему нужно добавить аннотацию:
@mink:selenium2
Недостатки:
Не поддерживает статус коды (response status code).
ZombieDriver
Установка:
Для работы этого драйвера понадобится установить node.js и модуль zombie.js Процесс установки zombie.js https://zombie.labnotes.org/#Infection
Установка драйвера: https://github.com/Behat/MinkZombieDriver
Правка конфига в Behat.yml:
default: extensions: Behat\Symfony2Extension\Extension: mink_driver: true kernel: env: test debug: true Behat\MinkExtension\Extension: base_url: 'https://АДРЕС_САЙТА/' zombie: ~ default_session: 'symfony2' paths: features: features
Использование:
Чтобы запустить тест с помощью ZombieDriver, к нему нужно добавить аннотацию:
@mink:zombie
Недостатки:
Zombie.js не запускает тесты в конкретном браузере. Он сам эмулирует работу браузера (Javascript исполняется с помощью V8 в node.js, парсинг страниц выполняется с помощью JSDOM и https://github.com/aredridel/html5). Поэтому нельзя протестировать нужную нам версию конкретного браузера.
Особенности использования вышеописанных драйверов
В фичах с AJAX запросами нужно предварительно использовать метод wait() из имеющегося в Mink класса Session В качестве примера рассмотрим фичу, в которой нам нужно кликнуть на DOM элемент, который подгружается с помощью AJAX
/** * @When /^I press something by class "([^"]*)"$/ */ public function iPressSomethingByClass($class) { $class = ".".$class; $jsCond = "$('".$class."').length > 0"; $this->getSession()->wait(5000, $jsCond); $this->getSession()->getPage()->find("css", $class)->click(); }
Иначе Mink может кликнуть на элемент, еще до того как он появится.
Выводы
Selenium2Driver и ZombieDriver прекрасно справляются с поставленной задачей по тестированию страниц, содержащих Javascript. Но из этих двух драйверов я предпочитаю Selenium2, так как он позволяет произвести тесты в конкретном браузере.