PHPUnitSeleniumTestcase的代码覆盖率

时间:2012-05-31 14:59:04

标签: php selenium code-coverage

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

<?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和信息,因此不会出现代码覆盖率。< / p>

我不明白的事情:

  1. protected $coverageScriptUrl = 'http://applicationname/phpunit_coverage.php';
  2. 如果cookie具有不同于应用程序的主机,则可以访问此cookie
  3. 我已经看到很多论坛都在讨论这个问题,但其中一个给出了具体的答案

    许多论坛建议使用localhost代替127.0.0.1作为服务器名称。就我而言,它已经是localhost。

    这方面的任何建议都会有所帮助。

    谢谢, Ravuri

2 个答案:

答案 0 :(得分:2)

与Selenium的集成或功能测试不涉及代码,因为它们涵盖了行为。像这样的测试的代码覆盖率报告不会产生任何有用的信息。单元测试将生成更有意义的代码覆盖率报告。这些测试是根据Selenium提供的信息运行的,它并没有真正测试你的“代码”。

答案 1 :(得分:1)

我认为冷淡的答案可能会变得更强,但我对PHPUnit和Selenium这样的总菜鸟我并不完全确定我在说什么。所以我会说,看看我是否得到纠正。

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

在Selenium下运行测试时,您的代码根本不在PHPUnit的控制之下。您可以为PHPUnit提供一个URL,而不是代码中的方法,它会安排将该URL提供给真正的Web浏览器。 Web浏览器本身不需要在与PHPUnit相同的主机上运行;即使是这样,您测试的应用程序代码也会在URL指定的Web服务器上运行。是不是没有办法让PHPUnit告诉服务器处理一个请求,如果处理请求调用PHP,然后在Xdebug下运行该PHP代码并将响应发送回响应! PHPUnit只能看到您指定的URL以及为请求提供服务的Web浏览器的输出。它无法找出处理请求的Web服务器实际运行的代码。

所以前面的答案说这些测试的代码覆盖率报告不会提供有用的信息,并且单元测试会生成更有意义的报告,我会一直说它不是 可能 这些测试完全可以测量代码覆盖率,因此在运行时不应要求代码覆盖率报告!或者更确切地说,如果你确实为selenium测试生成了代码覆盖率报告,并且报告说甚至一行代码都运行了,那么你的设置就会出现严重问题。