【问题标题】:PHPUnit reports different code coverage % for the same test when run in isolationPHPUnit 在单独运行时报告相同测试的不同代码覆盖率
【发布时间】:2012-02-24 07:25:24
【问题描述】:

首先,让我说我经历过Reaching 100% Code Coverage with PHPUnitSOHow to get 100% Code Coverage with PHPUnitSO。在任何一个帮助下,我都无法解决问题。

我的问题是,与运行整个测试套件时相比,PHPUnit 在单独运行时报告的同一测试的代码覆盖率不同。因此,当我使用 phpunit test/src/artax/UsesRequestTraitTest 仅运行有问题的特定测试时,我得到以下覆盖范围:

但是,如果我使用 phpunit 运行我的全套测试而不指定特定测试,我会收到相同文件的以下内容:

这是测试的源代码:

<?php

class UsesRequestTraitTest extends PHPUnit_Framework_TestCase
{
  public function testIsInitiallyEmpty()
  {
    $traitObj = $this->getObjectForTrait('artax\UsesRequestTrait');
    $this->assertAttributeEmpty('request', $traitObj);
    return $traitObj;
  }

  /**
   * @depends testIsInitiallyEmpty
   * @covers artax\UsesRequestTrait::setRequest
   * @covers artax\UsesRequestTrait::getRequest
   */
  public function testSetterAssignsRequestProperty($traitObj)
  {
    $r = new artax\blocks\http\HttpRequest();
    $traitObj->setRequest($r);
    $this->assertEquals($r, $traitObj->getRequest());
  }
}

如果你注意了,你会发现我正在测试一个 PHP5.4 特征。我正在使用 PHP5.4RC6 和最前沿的 2.2 xdebug 主干版本,因为 xdebug 的发布版本还不支持 PHP5.4。

有可能(很可能?)这是 xdebug 或 phpunit 中的一个错误,由于对新 PHP 版本的支持仍在不断发展,因此尚未解决,但我想在浪费相关方之前获得其他意见' 时间与不必要的错误报告。有谁知道可能导致此问题的原因或如何纠正它,以免我的极客强迫症不会让我因 100% 覆盖率的差距而发疯?

附:这是 60% 覆盖率版本的实际图形覆盖率报告。当测试单独运行时,如下所示的未覆盖的线为绿色(覆盖):

更新

我还尝试将特征方法的 @covers 注释添加到 use 特征的具体类的测试中,但这也无济于事......

【问题讨论】:

  • 覆盖范围是否仅针对该文件的最后一个独立测试?
  • @hakre 我不确定我明白你在问什么。对于它的价值,我对另一个相同的特征文件遇到相同的行为,除了它处理不同类型的对象(而不是$request)......真正奇怪的是还有两个其他特征文件在同一个格式与完整测试套件正确报告覆盖率的相同测试。我一遍又一遍地查看测试中的差异,这些差异会导致一个报告正确,而另一个则没有,但无济于事。
  • 如果您单独运行测试,我只是认为代码覆盖也是孤立的。当它被写入时,可能只有最后一个覆盖数据被写入 HTML(用相同的文件名覆盖以前的 HTML 转储)。我就是这个意思。
  • @hakre 我已经能够通过使用具体的测试类实现而不是新的getObjectForTrait 方法来解决这个问题,如果你有兴趣,我已经发布了一个描述修复的答案。

标签: php unit-testing phpunit xdebug


【解决方案1】:

这似乎是 PHPUnit 的新 getObjectForTrait 方法如何报告特征文件的代码覆盖率的问题。你可以read about getObjectForTrait over at Sebastian Bergmann's blog.

当我使用具体的实现类代替内置的getObjectForTrait 方法来测试特征时,错误消失了。因此,对上面发布的代码进行以下更改可以解决该问题:

<?php

class UsesRequestTraitTest extends PHPUnit_Framework_TestCase
{
  public function testIsInitiallyEmpty()
  {
    // trait code coverage not reported correctly using getObjectForTrait
    //$traitObj = $this->getObjectForTrait('artax\UsesRequestTrait');

    // use a concrete implementation instead (see bottom for class definition)
    $traitObj = new TraitImplementationClass();
    $this->assertAttributeEmpty('request', $traitObj);
    return $traitObj;
  }

  /**
   * @depends testIsInitiallyEmpty
   * @covers artax\UsesRequestTrait::setRequest
   * @covers artax\UsesRequestTrait::getRequest
   */
  public function testSetterAssignsRequestProperty($traitObj)
  {
    $r = new artax\blocks\http\HttpRequest();
    $traitObj->setRequest($r);
    $this->assertEquals($r, $traitObj->getRequest());
  }
}

// using this class to test instead of getObjectForTrait resolves the issue
class TraitImplementationClass
{
  use artax\UsesRequestTrait;
}

【讨论】:

  • 对于那些感兴趣的人,此修复适用于以下环境:PHP_CodeCoverage 1.1.1 使用 PHP 5.4.0RC6PHPUnit 3.6。 10
猜你喜欢
  • 2014-04-16
  • 2023-03-21
  • 2012-01-18
  • 2017-03-23
  • 2019-04-24
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 2014-09-01
相关资源
最近更新 更多