使用PHPUnitSeleniumTestcase进行代码覆盖率测试

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?

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

许多论坛建议将服务器名称从 127.0.0.1 更改为 localhost。在我的情况下,它已经是 localhost。

如果有任何建议,请告诉我。谢谢, Ravuri


1
也许这些问题的答案可以提供一些帮助:https://dev59.com/HmXWa4cB1Zd3GeqPOJTJ - Potherca
2个回答

2

使用Selenium进行的集成或功能测试并没有涵盖代码,而是涵盖了行为。这样的测试的代码覆盖率报告不会生成任何有用的信息。单元测试将生成更具含义的代码覆盖率报告。这些测试是基于提供给Selenium的信息运行的,它并没有真正地测试你的“代码”。


1
我认为frosty的答案可以更加强大,但是我对PHPUnit和Selenium都是一个完全的新手,所以我不完全确定自己在说什么。因此,我会说出来看看是否会被纠正。
单元测试是在PHPUnit的直接控制下运行应用程序代码的。您提供要调用的代码中的方法,并在Xdebug下调用该方法以收集覆盖信息。我认为这就像在PHPUnit的同一地址空间中运行您的代码,尽管这可能并不严格属实 - 有人知道吗?
使用Selenium运行的测试代码并不直接受PHPUnit控制。您将一个URL提供给PHPUnit,而它会安排将该URL提供给真实的Web浏览器。Web浏览器本身不必在与PHPUnit相同的主机上运行; 即使是这样,您正在测试的应用程序代码也是在由URL指定的Web服务器上运行的。PHPUnit无法告诉Firefox告诉处理请求的服务器,如果处理请求调用PHP,则在Xdebug下运行该PHP代码并将跟踪输出发送回响应! PHPUnit只能看到您指定的URL以及服务请求的Web浏览器的输出。它无法找出Web服务器处理请求实际运行了什么代码。
因此,在先前的答案中说,这些测试的代码覆盖率报告将不提供有用的信息,并且单元测试将生成更有意义的报告。我要说的是,这些测试根本不可能测量代码覆盖率,因此您不应该在运行它们时要求代码覆盖率报告!或者更确切地说,如果您为selenium测试生成代码覆盖率报告,并且报告说您的代码中甚至运行了一行,那么您的设置肯定有严重问题。

我不确定是否会使用PHPUnit的“控制下”这个术语,因为在这两种情况下,代码都是由PHPUnit执行的。至少在我看来,区别在于单元测试存在的目的是测试每个独立的代码单元,而Selenium类型的测试则涉及多个代码单元的集成。在这些情况下,代码覆盖率并不能告诉你什么... - frosty
第二次尝试:对我来说,“执行者”与单元测试一致,其中解释PHPUnit源代码的php解释器正在调用您源代码中的方法。例如,PHPUnit中的单元测试机制可以捕获被测试方法抛出的未处理异常。但是在Selenium测试中,您的代码是通过其他方式运行的,甚至不必用PHP编写。通过Selenium运行的测试无法捕获应用程序抛出的异常,它们只能看到异常可能对浏览器输出产生的影响。对我来说,这是非常不同的。 - sootsnoot
我没有阅读@Potherca在原问题的注释中提供的链接。这并不改变我对“受控于”或“由...执行”的看法。但它确实指出,如果您控制运行被测试代码的Web服务器,则可以通过Selenium使其记录在该Web服务器上运行的测试的覆盖率,以便将其包含在覆盖率报告中。我认为这很棒!虽然我同意frosty的观点,即通过单元测试获得良好的覆盖率更有价值/有意义,但通过Selenium测试获得的覆盖率并非毫无价值-我只是认为这是不可能的! - sootsnoot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接