PHPUnit 9升级至10后无代码覆盖率驱动时退出码为1的解决咨询
解决PHPUnit 10无覆盖率驱动时退出码为1的问题
针对你升级后遇到的行为变化,这里提供两种可行的解决方式:
1. 修改PHPUnit配置恢复旧警告行为
PHPUnit 10默认将failOnWarning设为true,这就是无覆盖率驱动时返回退出码1的原因。只需在phpunit.xml或phpunit.xml.dist配置文件中,将该参数设为false,就能回到PHPUnit 9仅警告、退出码为0的行为:
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.0/phpunit.xsd" bootstrap="vendor/autoload.php" failOnWarning="false"> <!-- 添加或修改这一行 --> <!-- 其他配置项 --> </phpunit>
2. 自动检测环境,无驱动时自动禁用覆盖率
如果不想修改全局配置,或者需要在特定环境下动态处理,可以通过脚本检测覆盖率驱动(Xdebug或PCOV)是否存在,不存在则自动添加--no-coverage参数执行PHPUnit。
Shell脚本示例
创建run-tests.sh脚本:
#!/bin/bash # 检查是否加载了Xdebug或PCOV扩展 if ! php -m | grep -q -E 'xdebug|pcov'; then phpunit --no-coverage "$@" else phpunit "$@" fi
给脚本添加执行权限后,用它替代直接调用phpunit即可。
PHP脚本示例
如果用PHP管理测试启动,可编写runner.php:
<?php $args = $_SERVER['argv']; array_shift($args); // 检查覆盖率驱动是否存在 $hasCoverageDriver = extension_loaded('xdebug') || extension_loaded('pcov'); $command = ['vendor/bin/phpunit']; if (!$hasCoverageDriver) { $command[] = '--no-coverage'; } $command = array_merge($command, $args); passthru(implode(' ', $command), $exitCode); exit($exitCode);
执行时直接调用php runner.php即可。
你已经将phpunit/phpcov升级至^9.0的操作是正确的,这不会影响上述两种解决方案的生效。
内容的提问来源于stack exchange,提问作者alistaircol
相关产品推荐
相关产品推荐

