如何在不使用每个函数打开浏览器的情况下运行PHPUnit Selenium测试用例?

时间:2011-09-08 14:42:47

标签: selenium phpunit

目前,我有一个扩展PHPUnit_Extensions_SeleniumTestCase的PHPUnit测试用例。每个启动的函数都需要$ this-> setBrowserUrl(),默认情况下每个函数调用都会启动一个新的Firefox浏览器窗口。

我希望有一个测试用例,用于启动特定功能的浏览器,但不启动其他功能的浏览器,以节省打开和关闭浏览器所需的资源和时间。我有可能拥有这样的文件吗?

2 个答案:

答案 0 :(得分:1)

您最好的选择可能是创建两个独立的测试套件,一个使用Selenium命令,另一个不使用任何Selenium功能。

class BrowserTests extends PHPUnit_Extensions_SeleniumTestCase
{
    protected function setUp()
    {
        $this->setBrowser('*firefox /usr/lib/firefox/firefox-bin');
        ...    
    }

    public function testOne()
    {
          ...
    }
    ...
}

class NonBrowsterTests extends PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
        ...
    }

    public function testOne
    {
       ...
    }
    ...
}

答案 1 :(得分:0)

使用PHPUnit注释找出一个自定义解决方案(并写了一篇关于它的博客文章!)

http://blog.behance.net/dev/custom-phpunit-annotations

编辑:在这里添加一些代码,以使我的答案更完整:)

简而言之,请使用自定义注释。在setUp()中,解析doc块以获取注释,并标记具有不同质量的测试。这将允许您标记某些测试以使用浏览器运行,并且某些测试无需运行。

protected function setUp() {

  $class      = get_class( $this );
  $method     = $this->getName();
  $reflection = new ReflectionMethod( $class, $method );
  $doc_block  = $reflection->getDocComment();

  // Use regex to parse the doc_block for a specific annotation
  $browser = self::parseDocBlock( $doc_block, '@browser' );

  if ( !self::isBrowser( $browser )
    return false;

  // Start Selenium with the specified browser

} // setup

private static function parseDocBlock( $doc_block, $tag ) {

 $matches = array();

  if ( empty( $doc_block ) )
    return $matches;

  $regex = "/{$tag} (.*)(\\r\\n|\\r|\\n)/U";
  preg_match_all( $regex, $doc_block, $matches );

  if ( empty( $matches[1] ) )
    return array();

  // Removed extra index
  $matches = $matches[1];

  // Trim the results, array item by array item
  foreach ( $matches as $ix => $match )
    $matches[ $ix ] = trim( $match );

  return $matches;

} // parseDocBlock