PHPUnit сообщает о разном покрытии кода% для одного и того же теста при запуске в изоляции - PullRequest
4 голосов
/ 01 февраля 2012

Во-первых, позвольте мне сказать, что я прошел через Достигнув 100% покрытия кода с помощью PHPUnit SO , а также Как получить 100 % Покрытия кода с помощью PHPUnit SO . Я не смог решить проблему с помощью либо.

Моя проблема заключается в том, что PHPUnit сообщает о различном проценте покрытия кода для того же теста, когда он выполняется изолированно, по сравнению с тем, когда запускается весь набор тестов. Поэтому, когда я запускаю только конкретный тест с использованием phpunit test/src/artax/UsesRequestTraitTest, я получаю следующее покрытие:

enter image description here

Однако, если я запускаю свой полный набор тестов с использованием phpunit без указания конкретного теста, я получаю следующее для того же файла:

enter image description here

Вот исходный код для теста:

<?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 и версию xdebug магистрали 2.2, потому что релизная версия xdebug еще не поддерживает PHP5.4.

Возможно (вероятно?), Что это ошибка в xdebug или phpunit, которая еще не устранена из-за все еще развивающейся поддержки новой версии PHP, но я хотел бы получить другие мнения, прежде чем тратить заинтересованные стороны время с ненужным сообщением об ошибке. Кто-нибудь знает, что может вызвать это или как это исправить, чтобы мой компьютерщик OCD не сводил меня с ума из-за этого разрыва при 100% покрытии?

P.S. Вот фактический графический отчет о покрытии для 60% -ной версии покрытия. Строки, показанные как непокрытые ниже, имеют зеленый цвет (закрашены), когда тест проводится изолированно:

enter image description here

UPDATE

Я также пытался добавить @covers аннотации для методов черты в тесты конкретных классов, которые use черта, но это тоже не помогло ...

1 Ответ

3 голосов
/ 01 февраля 2012

Похоже, это проблема с тем, как новый метод PHPUnit getObjectForTrait сообщает о покрытии кода для файла свойств.Вы можете прочитать о getObjectForTrait в блоге Себастьяна Бергмана.

Ошибка исчезает, когда я использую конкретный класс реализации для тестирования черты вместо встроенного метода 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;
}
...