使用Composer的autoload.php作为引导程序文件时,我遇到了PHPUnit Code_Coverage的错误。我创建了自己的boostrap.php文件,只需单独包含每个文件,一切正常。我偶然发现了一个Composer错误,或者我在某个地方犯了错误?
//编辑:我正在使用所有内容的最新版本(迄今为止):PHPUnit 3.7.12,Code_Coverage 1.2.7,Composer b51a4a7
Fatal error: Cannot redeclare class C3\CDN\EdgeCast in /Users/kperrine/Projects/edgecast-custom-reports/src/C3/CDN/EdgeCast.php on line 11
Call Stack:
0.0017 641760 1. {main}() /Applications/MAMP/bin/php/php5.3.14/bin/phpunit:0
0.2232 1111312 2. PHPUnit_TextUI_Command::main() /Applications/MAMP/bin/php/php5.3.14/bin/phpunit:46
0.2232 1112040 3. PHPUnit_TextUI_Command->run() /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/TextUI/Command.php:129
0.3027 4636952 4. PHPUnit_TextUI_TestRunner->doRun() /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/TextUI/Command.php:176
21.5764 6604032 5. PHP_CodeCoverage_Report_HTML->process() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php:384
21.5764 6604240 6. PHP_CodeCoverage->getReport() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML.php:120
21.5768 6663512 7. PHP_CodeCoverage_Report_Factory->create() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php:158
21.5769 6663512 8. PHP_CodeCoverage->getData() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Factory.php:64
21.5769 6663512 9. PHP_CodeCoverage->addUncoveredFilesFromWhitelist() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php:190
21.5769 6664408 10. PHP_CodeCoverage->processUncoveredFileFromWhitelist() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php:535
21.5778 6757272 11. include_once('/Users/kperrine/Projects/edgecast-custom-reports/src/C3/CDN/EdgeCast.php') /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php:558
我的phpunit.xml是:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
>
<testsuites>
<testsuite name="C3 EdgeCast Tests">
<directory>./tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">src</directory>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="log/report" charset="UTF-8"
highlight="false" lowUpperBound="35" highLowerBound="70"/>
</logging>
</phpunit>
答案 0 :(得分:3)
问题在于我在项目中使用了名称空间。我的项目命名空间是C3\CDN\EdgeCast
(注意EdgeCast中的大写'C'),但是当我在测试文件中使用命名空间时,我不小心输入了use C3\CDN\Edgecast;
(请注意Edgecast中的小写'c')。名称的不同导致CodeCoverage或Composer(我不知道究竟是哪一个)认为该类没有包括在内,因此试图再次包含它。
故事的道德:始终仔细检查您的类和命名空间名称。
答案 1 :(得分:0)
phpunit是否也在项目中安装了作曲家?如果是这样,您可能想要删除引导程序,因为它已经通过调用phpunit包含在内。
我不确定你的意思是“单独包含每个文件”。你的意思是如果你不使用自动加载器但手动包含东西它有效吗?那会很奇怪。使用自动加载器通常可以正常工作。
如果所有其他方法都失败了,您是否可以尝试使用composer.json创建一个简单的重现案例,以及在运行phpunit时使其失败的几个类?
答案 2 :(得分:0)
包含是在processUncoveredFileFromWhitelist="true"
的处理步骤中进行的,其中PHPUnit包含src
中没有覆盖信息的所有文件。
我的猜测是,那里的东西包括一些东西。它也可能是已经自动加载的类的问题(iirc composer仅使用require
而不是require_once
(正确的!)再次包含。
到目前为止,弹出此错误的所有情况都是因为如果代码中包含include / require语句。如果情况并非如此,并且它可能,那么它在phpunit的某个地方是一个问题,但是很奇怪。
始终有效的是设置processUncoveredFileFromWhitelist="false"
,它仍将列出所有文件但不包括它们。未覆盖文件的覆盖范围信息会略有不同但很多。 (然后可以巧妙地猜测可执行的行数而不是从xdebug中获取)