如何将未覆盖的文件添加到Yii应用程序的PHPUnit代码覆盖率报告中
我目前正在尝试获取基于
Yii framework的程序的代码覆盖率报告.
代码覆盖率由PHPUnit 3.6生成,我使用whitelist approach来源文件过滤. 问题是,当我设置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权威指南Test Environment Setup中所述. 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的hack并对此感到高兴.删除hack会使整个bug变得活跃起来.
为什么会这样:
PHPUnit将要求/包括白名单中的所有文件,如果你告诉它addNecoveredFilesFromWhitelist =“true”. 如果这些文件包含可执行代码,它将被执行,您将看到出现问题的结果. 该怎么办 >从白名单中排除包含可执行代码的所有文件 这有点麻烦,但它确实有效 >修复包含路径,以便include / require调用不会破坏任何内容 我没有真正的线索,为什么这些错误会弹出,但它似乎是一个包含路径问题?该框架应该有一种解决方法,我会说. > PHPUnit 3.7将提供“生成覆盖但不通过包含”模式,该模式查看文件并为您“猜测”可执行行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |