Как добавить непокрытые файлы в отчет по охвату кода PHPUnit приложения Yii

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

Покрытие кода генерируется 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> во <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> во <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 каталоге приложения, как описано в настройке тестовой среды в The Definitive Guide to Yii.

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

     cd $APPDIR/protected/tests/ phpunit 

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

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


    EDIT: Итак, для любопытства, полное решение выглядит так:

    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 и доволен этим. Удаление взлома возвращает всю эту ошибку.

    Related of "Как добавить непокрытые файлы в отчет по охвату кода PHPUnit приложения Yii"

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

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

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


    Что делать

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

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

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

    У меня нет реального понятия о том, почему эти ошибки появляются, но похоже, что это проблема с включенным путём? Рамки должны иметь способ разрешить это, я бы сказал.

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

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