在单独的进程中运行测试时,PHPUnit 无法生成代码覆盖率

Posted

技术标签:

【中文标题】在单独的进程中运行测试时,PHPUnit 无法生成代码覆盖率【英文标题】:PHPUnit can't generate code coverage when running tests in separate processes 【发布时间】:2021-10-03 02:20:03 【问题描述】:

我有一个问题,我在 Google 上找不到解决方案。 当我使用 phpUnit 和 Xdebug 运行单元测试时,我想做一个代码覆盖。

但是,当我这样做时,我得到了这个错误:

PHPUnit\Framework\Exception: Fatal error: Uncaught SebastianBergmann\CodeCoverage\NoCodeCoverageDriverAvailableException: No code coverage driver available in /Users/theobenoit/Desktop/Antipode.nosync/Sites/wp-framework-core/vendor/phpunit/php-code-coverage/src/Driver/Selector.php:53
   ├ Stack trace:
   ├ #0 Standard input code(43): SebastianBergmann\CodeCoverage\Driver\Selector->forLineCoverage(Object(SebastianBergmann\CodeCoverage\Filter))
   ├ #1 Standard input code(123): __phpunit_run_isolated_test()
   ├ #2 main
   ├   thrown in /Users/theobenoit/Desktop/Antipode.nosync/Sites/wp-framework-core/vendor/phpunit/php-code-coverage/src/Driver/Selector.php on line 53

我意识到这是因为在我的一些测试中,顶部有这个:

/**
 * @runTestsInSeparateProcesses
 * @preserveGlobalState disabled
 */

当我删除 @runTestsInSeparateProcesses 时,一切正常,但由于我模拟函数而出现问题。

如果有人遇到过这个问题。

【问题讨论】:

【参考方案1】:

这可能是因为使用runTestsInSeparateProcesses,PHPUnit 会为每个测试启动一个新的 PHP 进程。而且它似乎在没有加载 Xdebug 的情况下这样做。

为每个测试启动的 PHP 必须与您最初启动 PHPUnit 时使用的 PHP 相同。也许PATH中首先有一个不同的PHP二进制文件?

如果是这种情况,解决方法是确保“正确”的 PHP 在 PATH 中排在第一位。

【讨论】:

您好@Derick,感谢您的回答。是的,你可能是对的。可能是因为PHP不一样。当我运行 php -v 时,我有带有 xDebug 的 php,但是当我运行哪个 php 时,我得到了 php 的路径,而这个 php -v 没有 xDebug。 php:别名为 /Applications/MAMP/bin/php/php7.4.9/bin/php -c "/Library/Application Support/appsolute/MAMP PRO/conf/php7.4.9.ini" 顺便说一句,如果我只运行 ./vendor/bin/phpunit 我有“没有代码驱动程序”但如果我执行 php ./vendor/bin/phpunit 就可以了。它可能来自这里【参考方案2】:

我可以通过在没有映射时禁用强制中断来解决同样的问题,这是 IDE 中 xdebug-settings 下的一个设置。

见: https://intellij-support.jetbrains.com/hc/en-us/community/posts/360009770579-Docker-debug-problem-Remote-file-path-home-www-Standard-input-code-is-not-mapped-to-any-file-path-in-project-

【讨论】:

以上是关于在单独的进程中运行测试时,PHPUnit 无法生成代码覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

Laravel PHPUnit测试运行产生异常创建调度程序后无法设置默认工厂

无法为测试设置单独的数据库 - Laravel/Lumen

运行 PHPUnit 测试时无法加载 Xdebug

尝试放置单独的类和测试文件夹时,在测试期间找不到 PHPUnit 错误类

Cygwin和PHPUnit:无法打开输入文件:/ cygdrive / c / xampp / php / phpunit

使用 PHP7.2 和 7.1 运行的 phpunit 测试比使用 PHP7.0 运行时慢 3 倍