Phpunit 无法使用CodeCoverage和Composer重新声明类错误

Phpunit 无法使用CodeCoverage和Composer重新声明类错误,phpunit,code-coverage,autoload,composer-php,Phpunit,Code Coverage,Autoload,Composer Php,当使用Composer的autoload.php作为引导文件时,PHPUnit Code_覆盖率出现错误。我创建了自己的boostrap.php文件,只需单独包含每个文件,一切正常。我是不是偶然发现了一个作曲家的错误,还是我在什么地方出错了 //编辑:我正在使用最新(迄今为止)的所有版本:PHPUnit 3.7.12,Code_Coverage 1.2.7,Composer b51a4a7 Fatal error: Cannot redeclare class C3\CDN\EdgeCast i

当使用Composer的autoload.php作为引导文件时,PHPUnit Code_覆盖率出现错误。我创建了自己的boostrap.php文件,只需单独包含每个文件,一切正常。我是不是偶然发现了一个作曲家的错误,还是我在什么地方出错了

//编辑:我正在使用最新(迄今为止)的所有版本: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>

/测试/
src

项目中是否也安装了phpunit和composer?如果是这样,您可能希望删除引导,因为调用phpunit已经包含了它

我不知道你所说的“简单地单独包含每个文件”是什么意思。你的意思是如果你不使用自动加载器,而是手动添加东西,它会工作吗?那太奇怪了。使用自动加载器通常可以正常工作


如果所有其他操作都失败了,您是否可以尝试使用composer.json和几个类创建一个简单的复制案例,使其在运行phpunit时失败?

在处理步骤中为
processUncoveredFileFromWhitelist=“true”包含
其中PHPUnit包括
src
中没有覆盖范围信息的所有文件

我的猜测是,里面有些东西包含了一些东西。对于已经自动加载的类(iirc composer只使用
require
,而不是
require\u一次
(当然是正确的!)再次被包括在内),这也可能是一个问题

到目前为止,在所有出现此错误的情况下,都是因为代码中包含了if include/require语句。如果不是这样,并且可能是ofc,那么这是phpunit中的一个问题,但非常奇怪


始终有效的是设置
processUncoveredFileFromWhitelist=“false”
,该设置仍将列出所有文件,但不包括它们。未覆盖文件的覆盖率信息将略有不同,但差异很大。(然后巧妙地猜测可执行的行数,而不是从xdebug中获取)

问题在于我在项目中使用了名称空间。我的项目名称空间是
C3\CDN\EdgeCast
(注意EdgeCast中的大写字母“C”),但当我在测试文件中使用名称空间时,我意外地键入了
use C3\CDN\EdgeCast;
(注意EdgeCast中的小写字母“C”).名称的差异导致CodeCoverage或Composer(我不知道具体是哪个)认为该类没有被包含,因此试图再次包含它


这个故事的寓意是:始终仔细检查您的类和名称空间名称。

不,PHPUnit是单独安装在计算机上的。通过“简单地包含每个文件”,我的意思是我创建了一个bootstrap.php文件,其中包含以下内容,代码覆盖范围非常好。require“path/to/file1.php”;require“path/to/file2.php”;require“path/to/fileN.php”;是的,我将processUncovered切换为false,但是它根本没有正确的代码覆盖率,所以这不是一个选项。src目录中的额外需求是我的第一个想法,但我已经完全完成了,并且该代码中的任何地方都没有需求。有趣的是,它应该猜得非常正确(无论如何,这只适用于未覆盖的文件)。如果您有大量的示例,如果您有时间,我会对错误报告感兴趣:)我只是重新检查了它,是的,在这种情况下,它大量关闭,因为名称空间不正确(请参阅我自己对这个问题的回答)。同样的事情也发生在我身上,因为我的一个班名中有一个字母的情况不对。