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();
}
class StackTest extends PHPUnit_Framework_TestCase
{
public function test_1_Empty()
{
// ...
}
public function test_2_Push(array $stack)
{
// ...
}
public function test_3_Pop(array $stack)
{
//...
}
}
9条答案
按热度按时间kiz8lqtg1#
PHPUnit通过@depends注解支持测试依赖。
下面是文档中的一个示例,其中测试将以满足依赖项的顺序运行,每个依赖项测试都传递一个参数给下一个:
然而,需要注意的是,带有未解决依赖项的测试将不会执行(这是可取的,因为这会很快引起对失败测试的注意)。因此,在使用依赖项时要密切注意。
jgovgodb2#
也许你的测试中有设计问题。
通常,每个测试都不能依赖于任何其他测试,因此它们可以以任何顺序运行。
每个测试都需要示例化和销毁它运行所需的所有东西,这将是完美的方法,你永远不应该在测试之间共享对象和状态。
你能更具体地说明为什么N个测试需要相同的对象吗?
t3psigkw3#
正确的答案是为测试准备一个合适的配置文件。我也遇到了同样的问题,并通过使用必要的测试文件顺序创建testsuite来修复它:
nwlqm0z14#
如果你想让你的测试共享不同的helper对象和设置,你可以使用
setUp()
,tearDown()
来添加到sharedFixture
属性中。gcuhipw95#
PHPUnit允许使用'@depends'注解,该注解指定依赖测试用例,并允许在依赖测试用例之间传递参数。
ztigrdn86#
替代解决方案:使用static(!)函数来创建可重用的元素。例如(我使用selenium IDE来记录测试,并使用phpunit-selenium(github)在浏览器中运行测试)
好了,现在,我可以在其他测试中使用这个可重用的元素:)例如:
当我运行测试的时候,我的脚本在开始时会清理数据库。上面我使用了我的
SeleniumClearTestCase
类(我在那里做了screenshot()和其他很好的函数),它是MigrationToSelenium2
的扩展(从github,到使用seleniumIDE + ff插件“Selenium IDE:PHP Formatters”)是我的类LaravelTestCase的扩展(它是Illuminate\Foundation\Testing\TestCase的副本,但不是扩展PHPUnit_Framework_TestCase),当我们想要在测试结束时清理DB时,它设置laravel可以访问雄辩),这是PHPUnit_Extensions_Selenium2TestCase的扩展。为了设置laravel,我还在SeleniumClearTestCase中使用了createApplication函数(在setUp
处调用,我从laral test/TestCase中获取此函数)7fyelxc57#
在我看来,以下面的场景为例,我需要测试特定资源的创建和销毁。
最初我有两种方法,A。testCreateResource和B. testDestroyResource
a. testCreateResource
B. testDestroyResource
我认为这是一个坏主意,因为testDestroyResource依赖于testCreateResource。更好的做法是
a. testCreateResource
B. testDestroyResource
hts6caw38#
如果您的测试需要以特定的顺序运行,那么它们确实存在问题。每个测试都应该完全独立于其他测试:它可以帮助您进行缺陷定位,并允许您获得可重复的(因此是可调试的)结果。
请查看this site,了解有关如何以避免此类问题的方式对测试进行分析的大量想法/信息。
alen0pnh9#
我知道这是旧的,但值得一试。只需将数字添加到相应的方法中,它就应该根据您首选的执行顺序运行。