PHPUnit& Selenium - 更新到3.6.10版本后,似乎markTestSkipped和markTestIncomplete调用导致测试出错

时间:2012-02-27 14:54:15

标签: php selenium phpunit

在PHPUnit 3.6.4中,当我运行基于PHPUnit_Extensions_SeleniumTestCase的测试时,我使用

$this->markTestSkipped();

$this->markTestIncomplete();

我跳过了测试(S)或标记为不完整(I)。

但是在将PHPUnit更新到3.6.10(现在是最新版本)之后,这些函数似乎通过产生错误而不是跳过它来使测试失败。

更多示例,请参加此测试:

class ExampleTest extends PHPUnit_Extensions_SeleniumTestCase
{
    public function testMyCase()
    {
        $this->markTestIncomplete();
    }
}  

如果您没有运行Selenium服务器,它仍将运行测试并为您提供此输出:

PHPUnit 3.6.10 by Sebastian Bergmann.

E

Time: 0 seconds, Memory: 6.25Mb

There was 1 error:

1) ExampleTest::testMyCase
RuntimeException: 

/usr/bin/phpunit:46

FAILURES!
Tests: 1, Assertions: 0, Errors: 1

如果你有Selenium服务器运行,你的结果会略有不同,但你仍然会有错误。这仅适用于Selenium测试,扩展PHPUnit_Framework_TestCase的测试似乎没问题。要确认这一点,请将要扩展的类更改为PHPUnit_Framework_TestCase:

class ExampleTest extends PHPUnit_Framework_TestCase
{
    public function testMyCase()
    {
        $this->markTestIncomplete();
    }
}  

你将得到这个结果:

PHPUnit 3.6.10 by Sebastian Bergmann.

I

Time: 0 seconds, Memory: 5.25Mb

OK, but incomplete or skipped tests!
Tests: 1, Assertions: 0, Incomplete: 1.

所以我的问题是:这是PHPUnit 3.6.10中的一个错误吗?这是一个很酷的功能,我不知道,我做错了什么?

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,看起来这个问题与PHPUnit的核心无关,而是与PHPUnit Selenium扩展相关联。 A ticket has already been filed in their issue tracking system

我找到了引发错误的确切行,并在Extensions/SeleniumTestcase.php on line 1215中找到了它:

1213: // gain the screenshot path, lose the stack trace
1214: if ($this->captureScreenshotOnFailure) {
1215:    throw new PHPUnit_Framework_Error($buffer, $e->getCode(), $e->getFile(), $e->getLine(), $e->getTrace());
1216: }

如您所见,仅当$this->captureScreenshotOnFailure设置为true时才会出现此错误。所以我目前使用的解决方法是在我的Selenium测试的$this->captureScreenshotOnFailure=true方法中设置setUp(),并在每个标记为跳过的测试中设置我在调用skip方法之前手动禁用屏幕截图:

public function setUp() {
    [...]
    $this->captureScreenshotOnFailure = true;
}

/**
 * @test
 */
public function mySkippedTest() {
    $this->captureScreenshotOnFailure = false; 
    $this->markTestSkipped(); 
    [...]
}

这对我有用,因为它正确地标记了跳过的Selenium测试,但仍然保留了所有其他测试的屏幕截图功能。

但是,如果您的项目中有大量跳过的测试,这可能会有点乏味,我不能保证没有任何其他副作用,因为我不太熟悉PHPUnit的内部。在这种情况下,最好的解决方案可能是等待更新,直到phpunit-selenium的创建者修复它,因为它们似乎已经意识到这个问题。