Composer 安装的 PHPUnit 二进制文件使用系统提供的 ResultPrinter 并失败

Posted

技术标签:

【中文标题】Composer 安装的 PHPUnit 二进制文件使用系统提供的 ResultPrinter 并失败【英文标题】:PHPUnit binary installed by Composer uses system provided ResultPrinter and fails 【发布时间】:2021-10-01 16:44:27 【问题描述】:

我有一个 Laravel 项目,它需要 phpUnit >= 9.5 并安装 PHPUnit 二进制文件作为 Composer 依赖项的一部分。另外,PHPUnit 是由 8.5.11 版本的系统安装的(我使用的是 Gentoo)。所以,我有

~/project-dir # /usr/bin/phpunit --version
PHPUnit 8.5.11 by Sebastian Bergmann and contributors.

~/project-dir # ./vendor/phpunit/phpunit/phpunit --version
PHPUnit 9.5.4 by Sebastian Bergmann and contributors.

符合PHP类PHPUnit\Util\Log\TeamCity和接口PHPUnit\TextUI\ResultPrinter存在两次:

/usr/share/php/PHPUnit/Util/Log/TeamCity.php
/usr/share/php/PHPUnit/TextUI/ResultPrinter.php

./vendor/phpunit/phpunit/src/Util/Log/TeamCity.php
./vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php

如果我尝试从我的 IDE 运行 PHPUnit,我会收到以下错误:

/usr/bin/php /var/www/localhost/lychee/vendor/phpunit/phpunit/phpunit --configuration /var/www/localhost/lychee/phpunit.xml --filter Tests\\Feature\\AlbumTest --test-suffix AlbumTest.php /var/www/localhost/lychee/tests/Feature --teamcity
Testing started at 13:05 ...
PHP Fatal error:  Class PHPUnit\Util\Log\TeamCity cannot extend from interface PHPUnit\TextUI\ResultPrinter in /usr/share/php/PHPUnit/Util/Log/TeamCity.php on line 378

问题很明显。 IDE 从 Composer 安装中调用较新版本的 PHPUnit,但随后 PHP 尝试加载系统提供的 ResultPrinter,而不是使用 Composer 安装的类。

我的 IDE 是 PhpStorm。

我该如何解决这个问题?

【问题讨论】:

如果已经使用了正确的 Composer 自动加载器......那么对我来说,到那时 PHP 似乎已经引用/知道了错误的 PHPUnit 类。试试看:PHPUnit 支持引导文件:查看该文件是否被执行(以及何时执行)。如果它执行得很好(这意味着还没有加载有问题的 PHPUnit 类),然后使用 get_declared_classes 并查看 PHP 是否知道这些 PHPUnit 类。如果不是——也许有另一个自动加载器或者它从 PHP 的 include_path 加载——如果是这样,请尝试从那里删除那个全局 PHPUnit 路径。 P.S. 完全卸载全局 PHPUnit 怎么样?没有全局安装没有版本冲突的问题。如果无法卸载——升级到与本项目相同的版本呢? 除了按照建议卸载之外,我的问题是如何/谁安装了全球版本以及需要什么。如果它正在使用中,它可能就像更新它一样简单。如果它不使用,删除它可能是明智的。这只是两个突出的选项,因此分享有关配置的更多详细信息可能会帮助您以直接的方式解决这个问题。 【参考方案1】:

您必须选择本地(相对于您的项目)PHPUnit... 在配置中查找路径并将其更改为您项目的 PHPUnit 可执行文件...

【讨论】:

这不是问题。您还可以从复制的命令行中看到,IDE 使用了正确的 PHPunit 可执行文件、正确的配置 XML 以及由 Composer 创建的正确的Autoloader.php 您使用的是哪个版本的 PHP ?我认为这可能是问题所在,因为其他一切看起来都是正确的。另外,尝试另一件事,而不是使用"phpunit/phpunit": "^9.0" 或类似的东西,尝试将版本修复为9.5 之前的任何版本,因为我看到它有一些问题,尝试"phpunit/phpunit": "~9.4" 甚至9.3 看看它是否已解决(不要做^9.3,而是~9.3)。

以上是关于Composer 安装的 PHPUnit 二进制文件使用系统提供的 ResultPrinter 并失败的主要内容,如果未能解决你的问题,请参考以下文章

通过 composer 安装多个版本的 PHPUnit

Composer & PHPUnit 安装记录

无法使用 composer 安装 phpunit 和 phpunit-selenium

不推荐使用 composer require-dev 安装 phpunit?

在 Ubuntu 上使用 composer 安装 PHPUnit 的好处?

Composer 无法更新或安装 PHPUnit/php-code-coverage