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

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

8
задан hijarian 14 February 2012 в 08:07
поделиться