2012-12-20 92 views
5

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

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

我使用的是香肠结合,我的测试用例看起来非常相似,这个演示:https://github.com/jlipps/sausage/blob/master/WebDriverDemo.php

我的设置()来更新$浏览器阵列都试过了,但它似乎永远不会生效。例如。

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

有没有办法从Jenkins传递浏览器的详细信息,以便测试用例更灵活?我觉得我在这里错过了一些简单的东西?

+0

詹金斯有参数插件,当你触发一个作业时它会带参数。会是这样的:https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Build帮助你? –

+0

我没有问题得到params进入phpunit测试用例。一旦他们在那里,使用它们似乎太“迟”了。 –

回答

1

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

在Jenkins运行的ANT脚本中,依次运行PHPUnit,我包含了一个config.xml文件。这台名为sauce一个配置(环境)变量true

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

现在唯一的办法就是不实际使用$浏览器的静态数组,而是使用setupSpecificBrowser方法。所以,现在在我的测试的setUp()函数中,我只打开了酱env变量,如果它存在,那么我知道我们正在运行詹金斯,所以我使用它提供的变量。

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这似乎没有任何文档,我只是从查看代码开始工作。乐趣。

+0

您是否设法添加多个浏览器? –

+0

自动命名测试似乎打破了这种方式。所有测试都被命名为“未命名作业” –

+0

使用我的方法,您必须为每个想要测试的浏览器设置一个单独的Jenkins任务 - 因为这些任务是通过Ant中的SauceOnDemand插件传递的。也就是说,UI确实可以让你选择多个浏览器。我不知道如果你这样做,你将如何访问这些值(apols我现在没有时间测试) –

0

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

5

在花了不少时间挖掘源代码后,我找到了“多浏览器”场景的解决方案。 chapmatic有关多个浏览器和给定答案的断言确实是正确的:如果您在$ browsers数组中定义了多个浏览器,它不适用于并行测试,并且会多次运行相同的浏览器。该解决方案仍然使用环境变量,但您仍然必须使用您的$ browsers数组。

因此,首先确保你在抽象测试类中定义了你的$ browsers数组。然后,假设您定义了env var BROWSER并为其分配了您要测试的浏览器。你可以设置你的抽象测试类下面的静态函数扩展汁\香肠\ 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环境变量中指定的浏览器上运行。我们来看一下由Sauce \ Sausage \ WebDriverTestCase开发的PHPUnit_Extensions_Selenium2TestCase; PHPUnit_Extensions_Selenium2TestCase定义了以下方法:

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

调用此方法来设置测试套件与所有你在$浏览器阵列中指定的浏览器,所以你需要在你的抽象测试类重写此方法,确保调用fromTestCaseClass前browserSetup()()被调用:现在

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

,如果定义环境变量浏览器,你要测试的浏览器,你可以脱掉你的测试套件和$浏览器的阵列会正确覆盖您为BROWSER环境中定义的单个浏览器指定的设置nment变量。确保jenkins在Build-> Execute shell部分中正确设置了这个环境变量,并且你很好。

+0

该解决方案看起来有点有前途。为什么不切换浏览器组 - 如'local','sauce', –

+0

当使用'PHPUnit_Extensions_SeleniumTestCase'作为您的基类时,这也适用。 – Kryten