В настоящее время я пытаюсь получить отчет о покрытии кода для приложения 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
и рад этому.Удаление хака оживляет всю эту ошибку.