5

我用 PHPUnit 扩展写了一个测试用例Selenium2TestCase。它确实工作得很好,但我不知道make如何在各种浏览器上自动运行这个测试。

有一种方法setBrowser(),它只在setUp()方法中起作用。我想过这样的事情:

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

但我不工作。尝试运行默认浏览器(可能我对 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

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

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

4

4 回答 4

4

像这样的东西

    class WebTestCase extends \application\components\test\ExWebTestCase
    {
      // default params
      public $parameters = array(
          'host'                          => 'localhost',
          'port'                          => 4444,
          'seleniumServerRequestsTimeout' => 30000,
          'timeout'                       => 30000,
      );

      // list of browsers with per-browserconfig
      public static $browsers = array(
          array(
              'browserName' => 'firefox',
          ),
          array(
              'browserName' => 'chrome',
          ),
          array(
              'browserName' => 'safari',
          ),
          array(
              'browserName' => 'internet explorer',
              'host' => 'some IP of VirtualBox with IE'
          )
      );
  }
于 2012-12-18T16:25:42.860 回答
2

对此的修复实际上取决于您的数据文件的外观。如果您可以发布,我们可以为您提供更多帮助。

目前我假设,因为 phpunit 本质上是一个一次性的单元测试框架,您不会尝试同时运行多个浏览器,而只是想保留更改浏览器的选项,因为您认为合适.

你是对的,你应该在 setUp 中使用 setBrowser。当 PHPUnit 执行时,总是先运行 setUp,最后运行 tearDown()。这里的一个好的做法是制作自己的自定义单元测试用例类,您可以在其中自定义这些方法。

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

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

class newTest extends customUnitTest {
   $this->browser = "safari";
   public function testBlah {
      blah blah...
   }
}

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);
   }
}

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

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

$this->open("www.google.com");

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

于 2012-10-25T16:28:06.303 回答
2

要在多个浏览器中运行,请检查此链接:

http://phpunit.de/manual/current/en/selenium.html 示例 17.4(phpunit 3.7) 如果您在 localhost 中运行测试用例,请使用 'host' =>'localhost'。不需要 setBrowser() 函数。

于 2013-06-21T08:29:01.323 回答
1

应该使用 $browsers 属性来定义多个浏览器,如上所述。

于 2013-10-09T15:06:26.947 回答