在Sauce.io phpunit selenium测试中动态设置$ browsers静态属性

时间:2012-12-20 12:32:17

标签: selenium phpunit saucelabs

我正在使用SauceLabs设置一些浏览器测试。我已经能够通过本地和Sauce运行测试,因此我现在尝试将其与我的Jenkins安装集成,以自动触发构建和浏览器测试。

大部分都是有效的,但我有一个小问题。因此我可以在本地运行我的测试并通过Sauce,我想在phpUnit setup()函数中设置$ browsers静态属性,而不是硬编码。这似乎不可能。

我正在使用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传递浏览器详细信息,以便测试用例更灵活?我觉得我在这里错过了一些简单的东西?

3 个答案:

答案 0 :(得分:5)

在花了不少时间挖掘源代码后,我找到了“多种浏览器”方案的解决方案。关于多个浏览器和给定答案的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数组中指定的所有浏览器设置测试套件,因此您需要在抽象测试类中重写此方法,确保在fromTestCaseClass()之前调用browserSetup()称为:

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

现在,如果您使用要测试的浏览器定义环境变量BROWSER,则可以启动测试套件,并使用您为BROWSER环境中定义的单个浏览器指定的设置正确覆盖$ browsers数组。变量。确保jenkins在Build-> Execute shell部分中正确设置了这个环境变量,你就可以了。

答案 1 :(得分:1)

好的,所以我解决了这个问题。如果其他人有同样的问题,我就是这样解决的。

在Jenkins运行的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);

AFAIK似乎没有任何相关的文档,我只是通过查看代码来完成它。乐趣。

答案 2 :(得分:0)

请注意,在事实停止并行测试之后设置浏览器。此外,如果您有三个不同的浏览器(在$ browsers静态数组中)并将浏览器设置为chrome,那么现在将有三台机器运行chrome。