PHPUnit Selenium代码覆盖率是否有效?

时间:2012-06-30 00:36:46

标签: selenium phpunit code-coverage

In the PHPUnit docs,它表示可以获取代码覆盖率数据:

  

PHPUnit_Extensions_SeleniumTestCase可以收集通过Selenium运行的测试的代码覆盖率信息:

     
      
  1. 将PHPUnit / Extensions / SeleniumTestCase / phpunit_coverage.php复制到您的网络服务器的文档根目录中。

  2.   
  3. 在您的网络服务器的php.ini配置文件中,分别将PHPUnit / Extensions / SeleniumTestCase / prepend.php和PHPUnit / Extensions / SeleniumTestCase / append.php配置为auto_prepend_file和auto_append_file。

  4.   
  5. 在扩展PHPUnit_Extensions_SeleniumTestCase的测试用例类中,使用   protected $ coverageScriptUrl ='http://host/phpunit_coverage.php';   配置phpunit_coverage.php脚本的URL。

  6.   

我无法输出任何覆盖信息。我能够通过正常的单元测试获得代码覆盖率信息。

对于在http://localhost/ts2_templates/运行的应用,我已将phpunit_coverage.php复制到http://localhost/phpunit_coverage.php

我已将以下内容添加到php.ini中:

auto_prepend_file = "/path/to/pear/share/pear/PHPUnit/Extensions/SeleniumTestCase/prepend.php"
auto_append_file = "/path/to/pear/share/pear/PHPUnit/Extensions/SeleniumTestCase/append.php"

...并确认他们正在使用die("yep it's me");进行调用。

最后,我在测试用例中添加了以下内容:

<?php

class WebTest extends PHPUnit_Extensions_Selenium2TestCase
{
    # added line below
    protected $coverageScriptUrl = 'http://localhost/phpunit_coverage.php';

    protected function setUp()
    {
        $this->setBrowser('firefox');
        $this->setBrowserUrl('http://localhost/ts2_templates');
    }

    public function testTitle()
    {
        $this->url('http://localhost/ts2_templates');
        $this->assertContains('test', $this->title());
    }
}

?>

以下是使用PHPStorm生成的代码覆盖率运行测试的命令:

/Applications/MAMP/bin/php5.3/bin/php -dxdebug.coverage_enable=1 /private/var/folders/pp/0t4y41f95j5313qm_f8b42fw0000gn/T/ide-phpunit.php --coverage-clover /path/to/coverage/ts2_templates$WebTest.coverage --no-configuration WebTest /Users/Ian/php/ts2_templates/tests/WebTest.php

继承覆盖XML文件的输出:

<?xml version="1.0" encoding="UTF-8"?>
<coverage generated="1341015508">
    <project timestamp="1341015508">
        <metrics files="0" loc="0" ncloc="0" classes="0" methods="0" coveredmethods="0" conditionals="0" coveredconditionals="0" statements="0" coveredstatements="0" elements="0" coveredelements="0"/>
    </project>
</coverage>

测试本身就过去了。

我已经验证代码中的任何地方都没有exit或die语句。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

绝对有效。我已经在symfony中设置了selenium测试,根据文档测量覆盖率。

我遇到的最大问题是,覆盖数据路径中的文件路径错误,因此无法将源与覆盖数据对齐。这是因为我在不同的地方执行了测试,因为服务器保留了文件。因此我调整了append.php来重写我的源文件所在位置的路径。

答案 1 :(得分:1)

我也有一些问题让事情发挥作用。 Samuel Goldstein的以下post in the YII forum帮助了我:

  

我最终将prepend.php和append.php移动到我项目的文档根目录中。

     

我还发现临时文件位置有所不同 - 我最初试图将它们保存到/tmp/并且PHP默默地失败了。当我将$GLOBALS['PHPUNIT_COVERAGE_DATA_DIRECTORY']更改为myroot/protected/runtime/tmp并在该目录上执行chmod 777时,它开始工作。

     

可能会让您感到沮丧的一件事是,通过Ajax运行的代码不会被标记为被覆盖。

     

这似乎是Selenium的一个已知问题。谷歌“github sebastianbergmann phpunit-selenium发布”并追查closed issue #22以获取更多信息。