Сравнение Mink драйверов к Behat для проведения JS тестов

Сравнение Mink драйверов к Behat для проведения JS тестов

В 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, так как он позволяет произвести тесты в конкретном браузере.