2012-05-31 62 views
12

我已经为PHP编写了Selenium测试用例。我希望在执行这些测试用例时获得代码覆盖率。我的测试用例:PHPUnitSeleniumTestcase的代码覆盖率

<?php 
class Example extends PHPUnit_Extensions_SeleniumTestCase 
{ 
    protected $coverageScriptUrl = 'http://applicationname/phpunit_coverage.php'; 

    protected function setUp() 
    { 
    $this->setBrowser("*firefox"); 
    $this->setBrowserUrl("http://applicationname"); 
    $this->setCollectCodeCoverageInformation(true); 
    $this->setTestId("10001"); 
    $this->setHost("applicationname"); 
    } 

    public function testMyTestCase() 
    { 
    $this->open("http://applicationame"); 
    $this->assertEquals("title", $this->getTitle()); 
    $this->type("id=ext-comp-1002", "testuser"); 
    $this->fireEvent("id=ext-comp-1002", "blur"); 
    $this->type("id=ext-comp-1003", "testpassword"); 
    $this->fireEvent("id=ext-comp-1003", "blur"); 
    $this->click("ext-gen45"); 
    $this->waitForPageToLoad("200000"); 
} 
} 
?> 

我已按照链接“http://www.phpunit.de/manual/current/en/selenium.html”

提到的步骤运行测试我后无法找到代码覆盖率。在phpunit_coverage.php中,它正在查找名为PHPUNIT_SELENIUM_TEST_ID的cookie。这个cookie是在Driver.php中创建的,我发现cookie可用,但它的主机名设置为“localhost”而不是我的应用程序名。

Cookie生存时间被设置为会话即意味着在测试用例执行后立即这个cookie将不再可用,当我尝试启动phpunit_coverage.php时,它无法找到cookie和信息,因此没有代码覆盖率出现。

事情我不明白:

  1. protected $coverageScriptUrl = 'http://applicationname/phpunit_coverage.php';
  2. 如果cookie具有比其他应用程序不同的主机可以在此浏览器来accessable

我已经看到了这个问题,正在讨论很多论坛,但有一个具体的答案

许多论坛建议使用localhost而不是127.0.0.1作为服务器名称。在我的情况下,它已经是localhost。

在这方面的任何建议将有所帮助。

感谢, Ravuri

+1

也许这个问题的答案可能会提供一些帮助:http://stackoverflow.com/questions/11270527/does-phpunit-selenium-code-coverage-work – Potherca

回答

2

集成或与硒的功能测试不覆盖码因为他们覆盖的行为。这种测试的代码覆盖率报告不会产生任何有用的信息。单元测试将生成更有意义的代码覆盖率报告。测试正在基于Selenium提供的信息运行,它并不真正测试您的“代码”。

1

我认为frosty的答案可能会变得更加强烈,但是我对PHPUnit和Selenium都是如此全面的noob,我不完全确定我在说什么。所以我会说,看看我是否得到纠正。

单元测试在PHPUnit的直接控制下执行您的应用程序代码。您向代码中的PHPUnit调用该方法,并调用Xdebug下的该方法来收集覆盖信息。我认为它使您的代码与PHPUnit在相同的地址空间中运行,尽管这可能不完全正确 - 是否有人知道它是否是?

通过在Selenium下运行的测试,您的代码根本不在PHPUnit的控制之下。代替您的代码中的方法,您为PHPUnit提供了一个URL,并安排将该URL提供给真实的Web浏览器。 Web浏览器本身不需要与PHPUnit在同一台主机上运行;即使这样,您的应用程序代码也会在URL指定的网络服务器上运行。 PHPUnit不是没有办法告诉Firefox告诉服务器处理请求,如果处理请求调用PHP,那么在Xdebug下运行该PHP代码并将跟踪输出与响应一起发回! PHPUnit只能看到您指定的URL和来自为请求提供服务的Web浏览器的输出。无法找出处理请求的网络服务器实际运行的代码。

那么,以前的答案说,这些测试的代码覆盖率报告将不会提供有用的信息,而单元测试将产生更多有意义的报告,我会一直走下去地说,这不是可能这些测试可以测量代码覆盖率,所以当您运行它们时,您不应该要求提供代码覆盖率报告!或者说,如果您为硒测试生成代码覆盖率报告,并且报告表示甚至只有一行代码运行,那么您的设置出现严重错误。

+0

我不知道我是否会用“在PHPUnit的控制下“,因为两种情况下的代码都由PHPUnit执行。至少在我看来,这种差异是因为存在单元测试来测试每个独立的代码单元;而Selenium类型测试则处理多个代码单元的集成。在这些情况下,代码覆盖并不能真正告诉你什么...... – frosty

+0

第二次尝试:对我来说,“执行方式”与单元测试一致,其中解释PHPUnit源代码的php解释器正在调用一个方法你的源代码。例如。 PHPUnit中的单元测试机制可以捕获正在测试的方法抛出的未处理的异常。但是在Selenium测试中,您的代码正在以其他方式运行,甚至不需要用PHP编写。通过selenium运行的测试无法捕获应用程序抛出的异常,他们只能看到异常可能对浏览器输出有什么影响。对我来说,这是非常不同的。 – sootsnoot

+0

我还没有在原始问题的附注中阅读@Potherca的链接。它不会改变我如何看待“在...的控制下”或“由...执行”。但它确实指出,如果您可以控制运行正在测试的代码的Web服务器,那么它*可以使它能够记录通过硒在该Web服务器上运行的测试的覆盖范围,以便它们包含在覆盖率报告中。我认为这太棒了!虽然我同意冷若冰霜,通过单元测试获得良好的覆盖率更有价值/有意义,但通过硒测试的覆盖率并不是毫无价值 - 我只是认为这是不可能的! – sootsnoot