我之前使用ruby / rspec编写了一些硒测试,发现它非常强大。现在,我正在使用Selenium和PHPUnit,并且有一些我缺少的东西,可能只是因为缺乏经验。在Ruby / RSpec中,我习惯于为每个测试用例定义一个“全局”设置,除此之外,我打开浏览器窗口并登录我的站点。
我觉得PHPUnit在这里有点缺乏,1)你只有setUp()
和tearDown()
,它们在每次单独测试之前和之后运行,并且2)它似乎是实际的浏览器会话在setUp()
和测试之间设置,并在tearDown()
之前关闭。
这使得测试本身更加混乱,因为您明确必须在开始时打开页面,并在结束时执行清理。在每一次测试中。对于每个测试关闭并重新打开浏览器似乎也是不必要的开销,而不是仅仅返回到登录页面。
有没有其他方法可以实现我正在寻找的东西?
答案 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()方法。
希望这有帮助。