Как добавить непокрытые файлы в отчет о покрытии кода PHPUnit приложения Yii - PullRequest
8 голосов
/ 05 февраля 2012

В настоящее время я пытаюсь получить отчет о покрытии кода для приложения PHP на основе Yii framework .

Покрытие кода генерируется PHPUnit 3.6 , и яЯ использую подход белого списка для фильтрации исходных файлов.

Проблема в том, что, когда я устанавливаю параметр addUncoveredFilesFromWhitelist="true", покрытие кода разрывается со следующей ошибкой:

Generating code coverage report, this may take a moment.PHP Warning:  include(CButtonColumn.php): failed to open stream: No such file or directory in /home/hijarian/systems/yii/framework/YiiBase.php on line 418
PHP Stack trace:
PHP   1. {main}() /usr/bin/phpunit:0
PHP   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:46
PHP   3. PHPUnit_TextUI_Command->run() /usr/share/php/PHPUnit/TextUI/Command.php:125
PHP   4. PHPUnit_TextUI_TestRunner->doRun() /usr/share/php/PHPUnit/TextUI/Command.php:187
PHP   5. PHP_CodeCoverage_Report_HTML->process() /usr/share/php/PHPUnit/TextUI/TestRunner.php:373
PHP   6. PHP_CodeCoverage->getReport() /usr/share/php/PHP/CodeCoverage/Report/HTML.php:133
PHP   7. PHP_CodeCoverage_Report_Factory->create() /usr/share/php/PHP/CodeCoverage.php:141
PHP   8. PHP_CodeCoverage->getData() /usr/share/php/PHP/CodeCoverage/Report/Factory.php:65
PHP   9. PHP_CodeCoverage->processUncoveredFilesFromWhitelist() /usr/share/php/PHP/CodeCoverage.php:173
PHP  10. include_once() /usr/share/php/PHP/CodeCoverage.php:516
PHP  11. YiiBase::autoload() /home/hijarian/systems/yii/framework/YiiBase.php:0

PHP Warning:  include(): Failed opening 'CButtonColumn.php' for inclusion (include_path='.:/home/hijarian/projects/lexgarant/webapp/protected/components:/home/hijarian/projects/lexgarant/webapp/protected/models:/usr/share/php:/usr/share/pear') in /home/hijarian/systems/yii/framework/YiiBase.php on line 418
PHP Stack trace:
PHP   1. {main}() /usr/bin/phpunit:0
PHP   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:46
PHP   3. PHPUnit_TextUI_Command->run() /usr/share/php/PHPUnit/TextUI/Command.php:125
PHP   4. PHPUnit_TextUI_TestRunner->doRun() /usr/share/php/PHPUnit/TextUI/Command.php:187
PHP   5. PHP_CodeCoverage_Report_HTML->process() /usr/share/php/PHPUnit/TextUI/TestRunner.php:373
PHP   6. PHP_CodeCoverage->getReport() /usr/share/php/PHP/CodeCoverage/Report/HTML.php:133
PHP   7. PHP_CodeCoverage_Report_Factory->create() /usr/share/php/PHP/CodeCoverage.php:141
PHP   8. PHP_CodeCoverage->getData() /usr/share/php/PHP/CodeCoverage/Report/Factory.php:65
PHP   9. PHP_CodeCoverage->processUncoveredFilesFromWhitelist() /usr/share/php/PHP/CodeCoverage.php:173
PHP  10. include_once() /usr/share/php/PHP/CodeCoverage.php:516
PHP  11. YiiBase::autoload() /home/hijarian/systems/yii/framework/YiiBase.php:0

PHP Fatal error:  Class 'CButtonColumn' not found in /home/hijarian/projects/lexgarant/webapp/protected/components/CLexgarantButtonColumn.php on line 4
PHP Stack trace:
PHP   1. {main}() /usr/bin/phpunit:0
PHP   2. PHPUnit_TextUI_Command::main() /usr/bin/phpunit:46
PHP   3. PHPUnit_TextUI_Command->run() /usr/share/php/PHPUnit/TextUI/Command.php:125
PHP   4. PHPUnit_TextUI_TestRunner->doRun() /usr/share/php/PHPUnit/TextUI/Command.php:187
PHP   5. PHP_CodeCoverage_Report_HTML->process() /usr/share/php/PHPUnit/TextUI/TestRunner.php:373
PHP   6. PHP_CodeCoverage->getReport() /usr/share/php/PHP/CodeCoverage/Report/HTML.php:133
PHP   7. PHP_CodeCoverage_Report_Factory->create() /usr/share/php/PHP/CodeCoverage.php:141
PHP   8. PHP_CodeCoverage->getData() /usr/share/php/PHP/CodeCoverage/Report/Factory.php:65
PHP   9. PHP_CodeCoverage->processUncoveredFilesFromWhitelist()     /usr/share/php/PHP/CodeCoverage.php:173
PHP  10. include_once() /usr/share/php/PHP/CodeCoverage.php:516

(Само по себе интересно, почему существует три почти идентичные ошибки вместо одной.) Когда addUncoveredFilesFromWhitelist="false" покрытие кода генерируется успешно, но, конечно, без файлов, не покрытых тестами.

ФайлыКаркас Yii помещен в каталог $HOME/systems/yii/.

Приложение, которое я пытаюсь охватить, помещено в $HOME/projects/$APPNAME/.

Вот мой phpunit.xml:

<phpunit bootstrap="bootstrap.php"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    stopOnFailure="false">

<filter>
<!-- DO NOT SET TO "true" CODE COVERAGE WILL BREAK -->
  <whitelist addUncoveredFilesFromWhitelist="false">
    <directory suffix=".php">..</directory>
    <exclude>
      <directory suffix=".php">../config/</directory>
      <directory suffix=".php">../messages/</directory>
      <directory suffix=".php">../tests/</directory>
      <directory suffix=".php">../runtime/</directory>
      <directory suffix=".php">/home/hijarian/systems/yii/framework/</directory>
    </exclude>
  </whitelist>
</filter>

<logging>
    <log type="coverage-html" 
        target="report/html" 
        title="Lexgarant Online"
        charset="UTF-8" 
        yui="true" 
        highlight="true"
        lowUpperBound="35" highLowerBound="70" />
</logging>

<testsuites>
    <testsuite name="All_Unit_Tests">
        <directory>./unit/models/</directory>
        <directory>./unit/logic/</directory>
        <directory>./unit/components/</directory>
    </testsuite>
</testsuites>

<selenium>
    <browser name="Firefox" browser="*firefox" />
</selenium>
</phpunit>

У меня есть все тесты, размещенные в каталоге protected/tests в каталоге приложения, как описано в Настройка среды тестирования в Подробном руководстве по Yii.

PHPUnit вызывается следующим образом:

cd $APPDIR/protected/tests/
phpunit

Само модульное тестирование проходит гладко, нарушается только покрытие кода.

Может быть, мне следует настроить список исключений, чтобы исключить каталоги с классами Yii, но я несколько боюсь этого, потому что есть десятки папок, Yii - высокомодульная система.Конечно, если это единственное решение ...


РЕДАКТИРОВАТЬ: Итак, для любопытства, полное решение выглядит следующим образом:

phpunit.xml

<php>
    <!--  HACK -->
    <includePath>YIIPATH/framework/zii/widgets/grid</includePath>
</php>

<filter>
  <whitelist addUncoveredFilesFromWhitelist="true">
    <directory suffix=".php">../models/</directory>
    <directory suffix=".php">../components/</directory>
    <!--  any other directories you want to check -->
  </whitelist>
</filter>

Просто замените заполнитель YIIPATH реальным путем к фреймворку Yii.

Это определенно как-то связано с CButtonColumn, но сейчас я просто использую этот хак с includePath и рад этому.Удаление хака оживляет всю эту ошибку.

Ответы [ 2 ]

9 голосов
/ 05 февраля 2012

Почему это происходит:

PHPUnit будет require / include всеми файлами в белом списке , если вы скажете, что это addUncoveredFilesFromWhitelist="true".

Если эти файлы содержат исполняемый код, он будет выполнен, и вы увидите результаты возникающих проблем.


Что делать

  • Исключить все файлы с исполняемым кодом избелый список

Это небольшая проблема, но она работает

  • Исправьте пути включения, чтобы вызовы include / require ничего не прерывали

Я не имею ни малейшего представления о том, ПОЧЕМУ эти ошибки появляются, но, похоже, это проблема пути включения?Фреймворк должен иметь способ разрешения, который я бы сказал.

  • PHPUnit 3.7 предложит режим «генерировать покрытие, но не через включение», который просматривает файлы и «угадывает» исполняемые строки длявы.
3 голосов
/ 05 февраля 2012

В самый белый и отчет о покрытии кода должны входить только те файлы, которые вы тестируете.Предполагая, что вы не пишете тесты для самого фреймворка Yii, удалите его из самого белого.Мы надеемся, что это не только решит проблему, но и будет быстрее создавать отчет на 1001 * намного .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...