替代解决方案:
在测试中使用 static(!) 函数来创建可重用的元素。例如(我使用 selenium IDE 记录测试和 phpunit-selenium (github) 在浏览器中运行测试)
class LoginTest extends SeleniumClearTestCase
{
public function testAdminLogin()
{
self::adminLogin($this);
}
public function testLogout()
{
self::adminLogin($this);
self::logout($this);
}
public static function adminLogin($t)
{
self::login($t, 'john.smith@gmail.com', 'pAs$w0rd');
$t->assertEquals('John Smith', $t->getText('css=span.hidden-xs'));
}
// @source LoginTest.se
public static function login($t, $login, $pass)
{
$t->open('/');
$t->click("xpath=(//a[contains(text(),'Log In')])[2]");
$t->waitForPageToLoad('30000');
$t->type('name=email', $login);
$t->type('name=password', $pass);
$t->click("//button[@type='submit']");
$t->waitForPageToLoad('30000');
}
// @source LogoutTest.se
public static function logout($t)
{
$t->click('css=span.hidden-xs');
$t->click('link=Logout');
$t->waitForPageToLoad('30000');
$t->assertEquals('PANEL', $t->getText("xpath=(//a[contains(text(),'Panel')])[2]"));
}
}
好的,现在,我可以在其他测试中使用这个可重用的元素了 :) 例如:
class ChangeBlogTitleTest extends SeleniumClearTestCase
{
public function testAddBlogTitle()
{
self::addBlogTitle($this,'I like my boobies');
self::cleanAddBlogTitle();
}
public static function addBlogTitle($t,$title) {
LoginTest::adminLogin($t);
$t->click('link=ChangeTitle');
...
$t->type('name=blog-title', $title);
LoginTest::logout($t);
LoginTest::login($t, 'paris@gmail.com','hilton');
$t->screenshot(); // take some photos :)
$t->assertEquals($title, $t->getText('...'));
}
public static function cleanAddBlogTitle() {
$lastTitle = BlogTitlesHistory::orderBy('id')->first();
$lastTitle->delete();
}
- 通过这种方式,您可以构建测试的层次结构。
- 您可以保持每个测试用例完全独立的属性(如果您在每次测试后清理数据库)。
- 最重要的是,例如,如果将来登录方式发生变化,您只需修改 LoginTest 类,其他测试中不需要正确的登录部分(更新 LoginTest 后它们应该可以工作):)
当我运行测试时,我的脚本开始清理数据库广告。上面我使用了我的SeleniumClearTestCase 类(我在那里制作 screenshot() 和其他不错的功能)它是MigrationToSelenium2 的扩展(从 github,使用 seleniumIDE + ff 插件“Selenium IDE:PHP Formatters”将记录的测试移植到 Firefox 中)这是我的类 LaravelTestCase 的扩展(它是 Illuminate\Foundation\Testing\TestCase 的副本,但不扩展 PHPUnit_Framework_TestCase),它设置 laravel 以在我们想要在测试结束时清理数据库时访问 eloquent)这是 PHPUnit_Extensions_Selenium2TestCase 的扩展。为了设置 laravel eloquent,我还在 SeleniumClearTestCase 函数 createApplication 中(在 setUp 调用,我从 laral test/TestCase 中获取此函数)