setUp(),tearDown()中的浏览器会话,每个测试用例设置没有?

时间:2011-03-31 08:14:30

标签: selenium phpunit

我之前使用ruby / rspec编写了一些硒测试,发现它非常强大。现在,我正在使用Selenium和PHPUnit,并且有一些我缺少的东西,可能只是因为缺乏经验。在Ruby / RSpec中,我习惯于为每个测试用例定义一个“全局”设置,除此之外,我打开浏览器窗口并登录我的站点。

我觉得PHPUnit在这里有点缺乏,1)你只有setUp()tearDown(),它们在每次单独测试之前和之后运行,并且2)它似乎是实际的浏览器会话在setUp()和测试之间设置,并在tearDown()之前关闭。

这使得测试本身更加混乱,因为您明确必须在开始时打开页面,并在结束时执行清理。在每一次测试中。对于每个测试关闭并重新打开浏览器似乎也是不必要的开销,而不是仅仅返回到登录页面。

有没有其他方法可以实现我正在寻找的东西?

2 个答案:

答案 0 :(得分:8)

我过去所做的是创建一个受保护的方法,为会话返回一个对象,如下所示:

protected function initBrowserSession() {
    if (!$this->browserSession) {
        $this->setBrowser('*firefox');
        $this->setBrowserUrl('http://www.example.com/');
        //Initialize Session
        $this->open('http://www.example.com/login.php');
        // Do whatever other setup you need here
    }
    $this->browserSession = true;
}

public function testSomePage() {
    $this->initBrowserSession();
    //Perform your test here
}

您无法真正使用setupBefore/AfterClass函数,因为它们是静态的(因此您无权访问该实例)。

现在,说到这一点,我会质疑你这样做的动机。通过在测试之间重新使用会话的测试,您可能会在测试之间产生副作用。通过为每个测试重新打开一个新会话,您可以将效果分离到测试的效果。谁关心重新打开浏览器的性能(至少在合理程度上)?这样做实际上增加了测试的有效性,因为它是孤立的。再说一遍,测试一个延长的会话可能有一些东西要说。但如果是这种情况,我会将其作为单独的测试用例/类进行单独的功能测试......

答案 1 :(得分:0)

虽然我同意@ircmaxell认为最好在测试之间重置会话,但我可以看到测试从花费几分钟到花费数小时才重启浏览器的情况。

因此,我做了一些挖掘,发现你可以覆盖基类中的start()方法。在我的设置中,我有以下内容:

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class SeleniumTestCase extends PHPUnit_Extensions_SeleniumTestCase
{
    public function setUp() {
        parent::setUp();
        // Set browser, URL, etc.
        $this->setBrowser('firefox');
        $this->setBrowserUrl('http://www.example.com');
    }

    public function start() {
        parent::start();
        // Perform any setup steps that depend on
        // the browser session being started, like logging in/out
    }
}

这会自动影响任何扩展SeleniumTestCase的类,因此您不必担心每次测试都会设置环境。

我没有测试过,但似乎还有一个在tearDown()之前调用的stop()方法。

希望这有帮助。