配置PHPUnit实现代码覆盖率时报错如何解决?
问题根因
你使用的PHPUnit 9.5版本的配置结构和旧版本(8.x及更早)不兼容,报错来自两个配置错误:
- 旧版本中独立的
<filter>标签在9.5版本已被废弃,所有覆盖率过滤规则必须整合到<coverage>标签内部,残留的独立<filter>节点会直接触发验证失败 - 9.5版本已经不支持在
<logging>节点下用<log type="coverage-xxx" />的写法配置覆盖率报告,所有覆盖率输出规则需要移到<coverage>标签的<report>子节点中
修正方案
直接替换你的phpunit.xml为以下内容即可:
<?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd" bootstrap="vendor/autoload.php" cacheResultFile=".phpunit.cache/test-results" executionOrder="depends,defects" forceCoversAnnotation="true" beStrictAboutCoversAnnotation="true" beStrictAboutOutputDuringTests="true" beStrictAboutTodoAnnotatedTests="true" failOnRisky="true" failOnWarning="true" verbose="true"> <testsuites> <testsuite name="default"> <directory>tests/driver</directory> </testsuite> </testsuites> <coverage cacheDirectory=".phpunit.cache/code-coverage" processUncoveredFiles="true"> <include> <directory suffix=".php">src</directory> </include> <!-- 覆盖率报告配置移到这里 --> <report> <html outputDirectory="./log/report" lowUpperBound="35" highLowerBound="70"/> <clover outputFile="./log/coverage.xml"/> <php outputFile="./log/coverage.serialized"/> <text outputFile="php://stdout" showUncoveredFiles="false"/> </report> </coverage> <logging> <!-- 只保留非覆盖率的日志配置 --> <testdoxHtml outputFile="./log/testdox.html"/> </logging> </phpunit>
额外检查项
- 确认本地安装的PHPUnit版本和配置中声明的9.5版本一致,版本不匹配也会触发配置验证失败
- 确认已经安装了代码覆盖率驱动(PCOV或Xdebug),无驱动时也会抛出过滤器配置错误的提示
- 建议把路径中的反斜杠统一换成正斜杠,避免Windows环境下的转义问题
内容的提问来源于stack exchange,提问作者Roman Lytar
相关产品推荐
相关产品推荐

