Анализ динамических значений в конфигурациях файлов Behat/Mink Yml через Mink Extension.php(Selenium2) для Saucelabs

Мне было интересно, есть ли возможный способ анализа динамических значений, в частности name, с помощью тестов *.feature Behat/Mink, поскольку он запускает файл конфигурации Yml с возможностями Selenium2.

Файл behat.yml использует файл расширения Behat/Mink/Extension с параметрами Selenium 2 Capabilities в файле.

    default:
      context:
        class:  'FeatureContext'
      extensions:
        Behat\MinkExtension\Extension:
         base_url: 
         javascript_session:  'selenium2'
         goutte:
         selenium2:
            browser: firefox
            wd_host: <sauce username>:<accesscode>@ondemand.saucelabs.com/wd/hub
            capabilities: {  "platform": "Windows 7" , "version": "21" , "name":"Test" }

Внутри Extension.php file: https://github.com/Behat/MinkExtension/blob/2.0/src/Behat/MinkExtension/Extension.php

            arrayNode('selenium2')->
                children()->
                    scalarNode('browser')->
                        defaultValue(isset($config['selenium2']['browser']) ? $config['selenium2']['browser'] : '%behat.mink.browser_name%')->
                    end()->
                    arrayNode('capabilities')->
                        normalizeKeys(false)->
                        children()->
                            scalarNode('browserName')->
                                defaultValue(isset($config['selenium2']['capabilities']['browserName']) ? $config['selenium2']['capabilities']['browserName'] : 'firefox')->
                            end()->
                            scalarNode('version')->
                                defaultValue(isset($config['selenium2']['capabilities']['version']) ? $config['selenium2']['capabilities']['version'] : "9")->
                            end()->
                            scalarNode('platform')->
                                defaultValue(isset($config['selenium2']['capabilities']['platform']) ? $config['selenium2']['capabilities']['platform'] : 'ANY')->
                            end()->
                            scalarNode('browserVersion')->
                                defaultValue(isset($config['selenium2']['capabilities']['browserVersion']) ? $config['selenium2']['capabilities']['browserVersion'] : "9")->
                            end()->
                            scalarNode('browser')->
                                defaultValue(isset($config['selenium2']['capabilities']['browser']) ? $config['selenium2']['capabilities']['browser'] : 'firefox')->
                            end()->
                            scalarNode('ignoreZoomSetting')->
                                defaultValue(isset($config['selenium2']['capabilities']['ignoreZoomSetting']) ? $config['selenium2']['capabilities']['ignoreZoomSetting'] : 'false')->
                            end()->
                            scalarNode('name')->
                                defaultValue(isset($config['selenium2']['capabilities']['name']) ? $config['selenium2']['capabilities']['name'] : 'Behat Test')->
                            end()->
                            scalarNode('deviceOrientation')->
                                defaultValue(isset($config['selenium2']['capabilities']['deviceOrientation']) ? $config['selenium2']['capabilities']['deviceOrientation'] : 'portrait')->
                            end()->
                            scalarNode('deviceType')->
                                defaultValue(isset($config['selenium2']['capabilities']['deviceType']) ? $config['selenium2']['capabilities']['deviceType'] : 'tablet')->
                            end()->
                            scalarNode('selenium-version')->
                                defaultValue(isset($config['selenium2']['capabilities']['selenium-version']) ? $config['selenium2']['capabilities']['selenium-version'] : '2.31.0')->
                            end()->
                            scalarNode('max-duration')->
                                defaultValue(isset($config['selenium2']['capabilities']['max-duration']) ? $config['selenium2']['capabilities']['max-duration'] : '300')->
                            end()->
                            booleanNode('javascriptEnabled')->end()->
                            booleanNode('databaseEnabled')->end()->
                            booleanNode('locationContextEnabled')->end()->
                            booleanNode('applicationCacheEnabled')->end()->
                            booleanNode('browserConnectionEnabled')->end()->
                            booleanNode('webStorageEnabled')->end()->
                            booleanNode('rotatable')->end()->
                            booleanNode('acceptSslCerts')->end()->
                            booleanNode('nativeEvents')->end()->
                            booleanNode('passed')->end()->
                            booleanNode('record-video')->end()->
                            booleanNode('record-screenshots')->end()->
                            booleanNode('capture-html')->end()->
                            booleanNode('disable-popup-handler')->end()->
                            arrayNode('proxy')->
                                children()->
                                    scalarNode('proxyType')->end()->
                                    scalarNode('proxyAuthconfigUrl')->end()->
                                    scalarNode('ftpProxy')->end()->
                                    scalarNode('httpProxy')->end()->
                                    scalarNode('sslProxy')->end()->
                                end()->
                                validate()->
                                    ifTrue(function ($v) {
                                        return empty($v);
                                    })->
                                    thenUnset()->
                                end()->
                            end()->
                            arrayNode('firefox')->
                                children()->
                                    scalarNode('profile')->
                                        validate()->
                                        ifTrue(function ($v) {
                                            return !file_exists($v);
                                        })->
                                            thenInvalid('Cannot find profile zip file %s')->
                                        end()->
                                    end()->
                                    scalarNode('binary')->end()->
                                end()->
                            end()->
                            arrayNode('chrome')->
                                children()->
                                    arrayNode('switches')->
                                        prototype('scalar')->end()->
                                    end()->
                                    scalarNode('binary')->end()->
                                    arrayNode('extensions')->
                                        prototype('scalar')->end()->
                                    end()->
                                end()->
                            end()->
                        end()->
                    end()->
                    scalarNode('wd_host')->
                        defaultValue(isset($config['selenium2']['wd_host']) ? $config['selenium2']['wd_host'] : 'http://localhost:4444/wd/hub')->
                    end()->
                end()->
            end()->
            arrayNode('saucelabs')->
                children()->
                    scalarNode('username')->
                        defaultValue(getenv('SAUCE_USERNAME'))->
                    end()->
                    scalarNode('access_key')->
                        defaultValue(getenv('SAUCE_ACCESS_KEY'))->
                    end()->
                    booleanNode('connect')->
                        defaultValue(isset($config['saucelabs']['connect']) ? 'true' === $config['saucelabs']['connect'] : false)->
                    end()->
                    scalarNode('browser')->
                        defaultValue(isset($config['saucelabs']['browser']) ? $config['saucelabs']['browser'] : 'firefox')->
                    end()->
                    arrayNode('capabilities')->
                        children()->
                            scalarNode('name')->
                                defaultValue(isset($config['saucelabs']['name']) ? $config['saucelabs']['name'] : 'Behat feature suite')->
                            end()->
                            scalarNode('platform')->
                                defaultValue(isset($config['saucelabs']['platform']) ? $config['saucelabs']['platform'] : 'Linux')->
                            end()->
                            scalarNode('version')->
                                defaultValue(isset($config['saucelabs']['version']) ? $config['saucelabs']['version'] : '21')->
                            end()->
                            scalarNode('deviceType')->
                                defaultValue(isset($config['saucelabs']['deviceType']) ? $config['saucelabs']['deviceType'] : null)->
                            end()->
                            scalarNode('deviceOrientation')->
                                defaultValue(isset($config['saucelabs']['deviceOrientation']) ? $config['saucelabs']['deviceOrientation'] : null)->

Под Extension.php в каталоге MinkExtension он загружает файл selenium2.xml с набором массивов для анализа информации в этом файле на behat.yml.

Я заметил, что если в файле yml нет никаких параметров из возможностей Selenium2, указанных в файле yml, Extension.php назначит значение по умолчанию на основе имени массива:

scalarNode('name')-> defaultValue(isset($config['selenium2']['capabilities']['name']) ? $config['selenium2']['capabilities']['name'] : 'Behat Test')->

С учетом сказанного мне было интересно, есть ли какой-либо возможный способ использовать имя тестов Behat/Mink Feature <test>.feature в моем локальном каталоге для анализа заголовка в name во время выполнения тестов.


person Ben Fong    schedule 26.09.2013    source источник


Ответы (1)


Поздний ответ, но, может быть, лучше, чем ничего...

Как насчет использования тегов в тестах .feature? Вы можете посоветовать behat выполнять только те тесты с данным тегом:

поведенческая документация — теги

Если вы хотите выполнять свои тесты динамически, вы можете проанализировать свой тег, например, через ant-файл:

<target name="test-behat">
    <exec dir="${basedir}" executable="bin/behat" failonerror="false">
        <arg line="--config ${basedir}/behat.yml --tags '${env.SELENIUM_TAG}'"/>
    </exec>
</target>

Это означает в behat-cli:

bin/behat --tags '@your_tag'

Запустите свой ant-скрипт вручную:

ant -file <path to your ant-script> -D'SELENIUM_TAG'='@whatever_you_want'

Для полной автоматизации вы можете запустить свой ant-скрипт (и ваши тесты поведения), например. через jenkins (или любой другой CI, который может обрабатывать apache ant). Вы также можете передать любые параметры, необходимые для вашего behat.yml, composer.json (если вы используете composer) и так далее.

Если вы действительно хотите выполнить только одну функцию .feature, вы можете пойти тем же путем.

<target name="test-behat">
    <exec dir="${basedir}" executable="bin/behat" failonerror="false">
        <arg line="--config ${basedir}/behat.yml '${env.FEATURE_FILE}'"/>
    </exec>
</target>

Это означает в behat-cli:

bin/behat your.feature

Начните с

ant -file <path to your ant-script> -D'FEATURE_FILE'='your.feature'

Соответствующие строки из behat --help:

behat [--many config params we don't need right here] [features]

Arguments:
features          Feature(s) to run. Could be:
                  - a dir (features/)
                  - a feature (*.feature)
                  - a scenario at specific line (*.feature:10).
                  - all scenarios at or after a specific line (*.feature:10-*).
                  - all scenarios at a line within a specific range (*.feature:10-20)
person daniel_of_service    schedule 03.11.2014