在花了相当多的时间挖掘源代码之后,我找到了“多浏览器”场景的解决方案。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,您可以启动您的测试套件,并且您的 $browsers 数组将被您为 BROWSER 环境变量中定义的单个浏览器指定的设置正确覆盖。确保 jenkins 在 Build->Execute shell 部分中正确设置了这个环境变量,一切顺利。