摘要 class 的 PHPUnit 代码覆盖率为 0%,即使它已经过明确测试

PHPUnit code coverage for abstract class at 0% even though it's clearly tested

在此处编写 PHP 包,使用 PhpUnit 4+ 进行 TDD。

为我的所有常规 classes 编写测试工作正常,并且它们包含在报告中。但是当我测试一个抽象class的模拟时,即使测试通过方法清楚地运行s(如果我未能实现它,或者如果我在那里放置一些断点,它就会失败),代码覆盖率为 0%。

如果您想试一试,我已将有问题的代码提取到一个存储库中 here。你需要做的就是克隆,composer install,还有运行 phpunit,都配置好了。

这是 运行 在一个 Vagrant 盒子上,所以这是一个与我的 PHP 版本或可用扩展没有特别关系的隔离环境,并且由 other people 测试, 同样,在他们的安装上,产生相同的结果。

正在测试的摘要 class 是 here, while its test can be seen here

任何关于我在这里可能做错了什么的提示都将不胜感激。

编辑:

好的,作为补充说明,请参阅下面对已接受答案的评论,以及 Jordi 的推文 here。基本上,出于性能原因,Composer 的自动加载器仅遵循其所在文件系统的大小写,因此最好在文件夹上使用与 class 名称中相同的大小写。如果您的命名空间是大写的,那么您的文件夹也应该是大写的。这仍然留下了一个问题,即为什么它实际上设法 read 和 运行 class' 方法,但没有将其标记为已覆盖,所以如果你对此有任何见解,请发表评论或更完整的答案,我会重新接受那个。

编辑 2:

来自 IRC 的 dstockto 的额外合理解释:

I believe the issue is because when phpunit is collecting the code coverage information, it's in PHP arrays. The keys are case sensitive and so even though you have covered that, the coverage was for a differently cased file which PHPunit doesn't match up to the files that were loaded

我已经开始工作了,覆盖率是 100%。 :-) 问题是这样的:

$ phpunit --verbose --bootstrap vendor/autoload.php
PHPUnit 4.4.2 by Sebastian Bergmann.

Configuration read from /home/ren/tmp/phpunit-oddity/phpunit.xml.dist

E

Time: 151 ms, Memory: 3.25Mb

There was 1 error:

1) Swader\Diffbot\Test\ApiTest::testSetTimeout
PHPUnit_Framework_MockObject_RuntimeException: Class "Swader\Diffbot\Abstracts\Api" does not exist.

调试表明真正的问题是您主机上的不区分大小写的文件系统。 Vagrant 运行 Linux。目录 abstractsAbstracts 不同。 Linux 上的 PhpUnit 无法找到它正在寻找的 class。