当测试尝试打开未加载的页面并且达到超时值时,测试不会停止或抛出异常。相反,它只是继续前进,就像页面加载成功一样。它在第一个返回false的断言时执行单击并停止。
我在PHPUnit 3.6.10的提交日志中找到了这个:https://github.com/sebastianbergmann/phpunit/commit/cb772b06e9bd97f478fff7a212e3a4f7fe96bc29
异常看起来仍然应该被捕获,但不幸的是异常似乎没有触发测试停止,所以我不知道该怎么做。
这是一个引发我所讨论的行为的示例测试:
<?php
class Example extends PHPUnit_Extensions_SeleniumTestCase
{
protected function setUp() {
$this->setBrowser('*firefox');
$this->setBrowserUrl('http://myserver/timeout.php');
$this->setTimeout(10);
$this->setWaitForPageToLoad(true);
}
public function testMyTestCase() {
// This should trigger an exception after timeout:
$this->openAndWait('/');
// Anything below this line SHOULD never be executed because of timeout:
$this->click('id=clicketyclickthiswontbeclicked');
$this->click('id=moreclicksthatwillnotbeclicked');
// This will fail the test, because timeout didn't stop it
$this->assertTextPresent('this text');
}
}
?>
以下PHP文件应触发超时。
timeout.php:
<?php
// Should trigger timeout
sleep(30);
// (...) Rest of the page
?>
我做错了什么或者这可能是个错误?
答案 0 :(得分:1)
我会在这里回答自己以防其他人有这个问题。作为解决方法,我重写了waitForPageToLoad
函数。它调用父函数并跟踪等待页面加载所花费的时间,以确定页面加载是否实际超时,如果发生则抛出异常。
以下是代码:
protected function waitForPageToLoad( $timeout=null ) {
if ( is_null( $timeout ) ) {
$timeout = 30000;
}
$start = time();
parent::waitForPageToLoad( $timeout );
$end = time();
if ( ($end - $start) >= ($timeout / 1000) ) {
throw new Exception( 'Timed out after '.$timeout.'ms.' );
}
}
这似乎是非常不必要的,但此刻,它对我有用,但我仍然想要一个不需要这样的黑客的答案。