12

我已经为 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。这个 cookie 是在 Driver.php 中创建的,我看到 cookie 可用,但它的主机名设置为“localhost”,而不是我的应用程序名称。

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

我不明白的事情:

  1. protected $coverageScriptUrl = 'http://applicationname/phpunit_coverage.php';
  2. 如果 cookie 具有与应用程序不同的主机,则该 cookie 是否可以访问

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

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

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

谢谢, 拉武里

4

2 回答 2

2

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

于 2012-12-11T18:10:17.390 回答
1

我认为frosty 的答案可能会变得更强大,但我对 PHPUnit 和 Selenium 都是一个完全的菜鸟,所以我不完全确定我在说什么。所以我会说出来,看看我是否得到纠正。

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

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

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

于 2013-02-25T01:13:16.900 回答