Динамическая установка статического свойства $browsers в тестах Sauce.io phpunit selenium

Я настраиваю тестирование браузера с помощью SauceLabs. Мне удалось запустить тесты локально и через Sauce, поэтому теперь я пытаюсь интегрировать его с моей установкой Jenkins, чтобы автоматически запускать сборки и тесты браузера.

Большая часть всего этого работает, но у меня есть одна небольшая проблема. Чтобы я мог запускать свои тесты локально и через Sauce, я хочу установить статическое свойство $browsers во время функции phpUnit setup(), а не жестко кодировать его. Это не кажется возможным.

Я использую привязку Sausage, мой TestCase очень похож на эту демонстрацию: https://github.com/jlipps/sausage/blob/master/WebDriverDemo.php

Я попытался в setUp() обновить массив $browsers, но, похоже, это никогда не вступало в силу. например.

public function setUp()
{   
    self::$browsers = array(
        'browserName' => getenv('SELENIUM_BROWSER'),
        'desiredCapabilities' => array(
            'version' => getenv('SELENIUM_VERSION'),
            'platform' => getenv('SELENIUM_PLATFORM'),
         )
     );
}

Есть ли способ передать данные браузера от Jenkins, чтобы тестовые примеры были более гибкими? Я чувствую, что мне не хватает чего-то простого здесь?


person Andre Lackmann    schedule 20.12.2012    source источник
comment
У Jenkins есть плагины параметров, которые принимают параметры при запуске задания. Что-то вроде этого: wiki.jenkins-ci.org/display/JENKINS/Parameterized +Build помочь вам?   -  person niharika_neo    schedule 20.12.2012
comment
У меня нет проблем с получением параметров в тестовом примере phpunit. Как только они появляются, кажется, что их уже слишком поздно использовать.   -  person Andre Lackmann    schedule 21.12.2012


Ответы (3)


Потратив немало времени на копание в исходниках, я нашел решение для сценария «несколько браузеров». утверждения Chapmatic относительно нескольких браузеров и данный ответ были действительно правильными: он не работает для параллельного тестирования и запускает один и тот же браузер несколько раз, если у вас есть несколько браузеров, определенных в вашем массиве $browsers. Решение по-прежнему использует переменные среды, но вы все равно должны использовать свой массив $browsers.

Итак, сначала убедитесь, что вы определили свой массив $browsers в своем абстрактном тестовом классе. Затем, скажем, вы определяете env var BROWSER и назначаете ему браузер, который хотите протестировать. Вы можете настроить следующую статическую функцию в своем абстрактном тестовом классе, который расширяет Sauce\Sausage\WebDriverTestCase:

    public static function browserSetup()
    {   
        switch (getenv('BROWSER')) {
            case 'firefox':
                self::$browsers = array(
                    array(
                        'browserName' => 'firefox',
                        'desiredCapabilities' => array(
                            'platform' => 'self::WIN_VERSION',
                            'version' => self::FIREFOX_VERSION,
                        )   
                    )   
                );  
                break;

            case 'safari':
                //safari desiredCapabilities
               break;

            case 'explorer':
                //ie desiredCapabilities
               break;

           case 'chrome':
             //chrome desiredCapabilities

           default: //This will just use the default $browsers array you defined
         return;
    }

Теперь, когда функция browserSetup() определена, вы должны убедиться, что она вызывается перед настройкой набора тестов, чтобы тесты были настроены для запуска только в том браузере, который вы указали в переменной среды BROWSER. Давайте посмотрим на PHPUnit_Extensions_Selenium2TestCase, который расходуется Sauce\Sausage\WebDriverTestCase; PHPUnit_Extensions_Selenium2TestCase определяет следующий метод:

public static function suite($className)
{   
    return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
} 

Этот метод вызывается для настройки набора тестов со всеми браузерами, которые вы указали в своем массиве $browsers, поэтому вам необходимо переопределить этот метод в своем абстрактном тестовом классе, обязательно вызывая browserSetup() до вызова fromTestCaseClass():

public static function suite($className)
{   
    self::browserSetup();
    return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className);
} 

Теперь, если вы определите переменную среды BROWSER с браузером, который хотите протестировать, вы можете запустить свой набор тестов, и ваш массив $browsers будет правильно переопределен настройками, указанными для одного браузера, определенного в вашей переменной среды BROWSER. Убедитесь, что jenkins правильно устанавливает эту переменную среды в разделе Build-> Execute shell, и все готово.

person Clandestine    schedule 30.07.2013
comment
Это решение выглядит несколько многообещающе. Почему бы не включить такие группы браузеров, как «локальный», «соус», - person line-o; 27.08.2013
comment
Это также работает при использовании PHPUnit_Extensions_SeleniumTestCase в качестве базового класса. - person Kryten; 31.07.2014

Итак, я разобрался с этим. Если у кого-то еще есть такая же проблема, вот как я ее решил.

В сценарий ANT, который запускает Дженкинс, который, в свою очередь, запускает PHPUnit, я включил файл config.xml. Это устанавливает переменную конфигурации (среды) с именем sauce на true

<phpunit> 
    <php>
        <env name="sauce" value="true" />
    </php>
</phpunit>

Теперь хитрость заключается в том, чтобы фактически не использовать статический массив $browsers, а вместо этого использовать метод setupSpecificBrowser. Итак, теперь в моей функции setUp() моих тестов я просто включаю переменную env соуса, и если она существует, то я знаю, что мы работаем из Jenkins, и поэтому я использую предоставленные ею переменные.

    if( getenv('sauce') == true) {
        $browser =  array(
                'browserName' => getenv('SELENIUM_BROWSER'),
                'desiredCapabilities' => array(
                        'version' => getenv('SELENIUM_VERSION'),
                        'platform' => getenv('SELENIUM_PLATFORM'),
                )
        );
    } else {
        $browser =  array(
                'browserName' => 'firefox',
                'local' => true,
                'sessionStrategy' => 'isolated'
        );
    }
    $this->setupSpecificBrowser($browser);

Насколько мне известно, для этого нет никакой документации, я просто работал с ней, глядя на код. Веселье.

person Andre Lackmann    schedule 22.12.2012
comment
Автоматическое именование тестов, похоже, не работает. Все тесты были названы безымянной работой - person line-o; 09.04.2013
comment
Используя мой метод, вам нужно будет настроить отдельную задачу Jenkins для каждого браузера, который вы хотите протестировать, поскольку они передаются через плагин SauceOnDemand в Ant. Тем не менее, пользовательский интерфейс позволяет вам выбирать несколько браузеров. Я не уверен, как бы вы получили доступ к этим значениям, если бы сделали это (извините, у меня нет времени проверять прямо сейчас) - person Andre Lackmann; 10.04.2013
comment
См. ответ, приведенный ниже, для решения с несколькими браузерами. - person Kryten; 31.07.2014

Также отметим, что установка браузеров постфактум останавливает параллельное тестирование. Более того, если у вас есть три разных браузера для начала (в статическом массиве $browsers) и вы установили браузер на chrome, то теперь у вас будет три машины, на которых работает chrome.

person chapmatic    schedule 18.06.2013