PHPUnit扩展Selenium 2(webdriver)和多个浏览器

Mar*_*cki 5 phpunit selenium-rc selenium-webdriver

我用PHPUnit扩展编写了一个测试用例Selenium2TestCase.它确实很好用,但我无法弄清楚make如何在各种浏览器上自动运行此测试.

有一种方法setBrowser()只适用于setUp()方法.我想过这样的事情:

/**
 * @dataProvider browsers
 */
public function loginTest($browser) {
    $this->setBrowser($browser);
    // tests...
}
Run Code Online (Sandbox Code Playgroud)

但我不行.尝试运行默认浏览器(可能我的Safari有点乱,上次使用firefox)

RuntimeException: Safari could not be found in the path!
Please add the directory containing ''Safari'' to your PATH environment
variable, or explicitly specify a path to Safari like this:
*safari /blah/blah/Safari
Run Code Online (Sandbox Code Playgroud)

PS.SeleniumTestCase(不是基于webdriver)提供了一个xml配置,我们可以在其中指定浏览器.Selenium2TestCase不支持它.

欢迎任何建议.谢谢.马尔钦

Sup*_*Guy 2

解决这个问题实际上取决于您的数据文件的样子。如果您可以发布,我们可以为您提供更多帮助。

目前,我假设由于 phpunit 本质上是一个一次性的单元测试框架,因此您不会尝试同时运行多个浏览器,而只是想保留根据需要更改浏览器的选项。

你是对的,你应该在setUp中使用setBrowser。执行时,PHPUnit 将始终首先运行 setUp,最后运行 TeaDown()。这里的一个好习惯是创建您自己的自定义单元测试用例类,您可以在其中自定义这些方法。

class customUnitTest extends PHPUnit_Extensions_Selenium2TestCase {
   public $browser = "firefox";
   public function setUp() {
      $this->setBrowser("*".$browser);
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,当您编写测试时,扩展您的个人测试类并相应地设置浏览器

class newTest extends customUnitTest {
   $this->browser = "safari";
   public function testBlah {
      blah blah...
   }
}
Run Code Online (Sandbox Code Playgroud)

setUp 将在执行时运行,并且它将拉入浏览器变量。默认情况下,您将使用 Firefox,但如果某些测试在其他浏览器上进行更合适的测试,您可以选择该选项。

如果您希望能够同时更改所有测试中的所有浏览器,您应该考虑根据环境变量分配浏览器值。

class customUnitTest extends PHPUnit_Extensions_Selenium2TestCase {
   try {
      public $browser = getenv("SELENIUM_BROWSER");
   } catch (Exception $e) {
      public $browser = "firefox";
   }
   public function setUp() {
      $this->setBrowser("*".$browser);
   }
}
Run Code Online (Sandbox Code Playgroud)

通过此设置,我们可以通过更改环境变量 SELENIUM_BROWSER 来更改未对浏览器进行硬编码的每个测试的浏览器。这样我们就可以在具有不同默认浏览器的不同服务器上运行相同的代码,而无需重新编写任何内容。

请注意,多重继承不是一个好习惯。如果您没有正确确定方法/变量的范围,它可能会导致脆弱的代码甚至安全威胁。然而在这种情况下它很有用,因为我们可以根据需要定义 PHPUnit 框架方法,并且我们在测试中获得了所有基本的 selenium 方法。因此,要运行默认的 selenium 方法,我们只需编写

$this->open("www.google.com");
Run Code Online (Sandbox Code Playgroud)

这是一种与将 selenium 分配给对象的一般方法有很大不同的方法,因为您编写的测试是 selenium 对象,但它似乎更适合 php,特别是对于这个用例。