PHPUnitSelenium测试用例的代码覆盖率


Code Coverage with PHPUnitSeleniumTestcase

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

<?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 是在驱动程序中创建的.php我看到 cookie 可用,但它的主机名设置为"本地主机"而不是我的应用程序名称。

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

我不明白的事情:

  1. protected $coverageScriptUrl = 'http://applicationname/phpunit_coverage.php';
  2. 如果 cookie 具有除应用程序以外的其他主机,则是否可以访问此 cookie

我看到这个问题在许多论坛上都在讨论,但有一个论坛给出了具体的答案

许多论坛建议使用 localhost 而不是 127.0.0.1 作为服务器名称。就我而言,它已经是本地主机。

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

谢谢拉武里

Selenium的集成或功能测试并不涵盖代码,因为它们涵盖了行为。此类测试的代码覆盖率报告不会生成任何有用的信息。单元测试将生成更有意义的代码覆盖率报告。测试是根据提供给Selenium和从Selenium提供的信息运行的,可以这么说,它并没有真正测试您的"代码"。

我认为 frosty 的答案可以更有力,但我是一个完全的菜鸟,同时拥有 PHPUnit 和 Selenium,我不完全确定我在说什么。 所以我会说出来,看看我是否得到纠正。

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

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

因此,前面的回答说这些测试的代码覆盖率报告

不会提供有用的信息,并且单元测试会生成更有意义的报告,我会一直说这些测试根本不可能测量代码覆盖率,所以你不应该在运行它们时要求代码覆盖率报告! 或者更确切地说,如果您确实为硒测试生成了代码覆盖率报告,并且报告显示即使运行了一行代码,那么您的设置也存在严重问题。