В настоящее время я пытаюсь получить отчет о покрытии кода для 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
:
..
../config/
../messages/
../tests/
../runtime/
/home/hijarian/systems/yii/framework/
./unit/models/
./unit/logic/
./unit/components/
У меня все тесты размещены в каталоге protected/tests
в каталоге приложения, как описано в Настройка тестовой среды в The Definitive Guide to Yii.
PHPUnit вызывается следующим образом:
cd $APPDIR/protected/tests/
phpunit
Само модульное тестирование проходит гладко, нарушается только покрытие кода.
Возможно, мне стоит настроить список exlude, чтобы исключить директории с классами Yii, но я несколько опасаюсь такого опыта, ведь там десятки папок, Yii - очень модульная система. Конечно, если это единственное решение...
EDIT: Итак, для любопытных, полное решение выглядит так:
phpunit.xml
YIIPATH/framework/zii/widgets/grid
../models/
../components/
Просто замените место YIIPATH на реальный путь к фреймворку Yii.
Это определенно как-то связано с CButtonColumn
, но пока я просто использую этот хак с includePath
и доволен. Удаление хака оживляет весь этот баг.