phpunit必须装在require-dev中,直接composer require会误入require导致--no-dev时命令消失;php 7.4–8.0用^9.6,8.1+用^10.5;需验证./vendor/bin/phpunit --version输出正确版本。

phpunit 必须装在 require-dev 里
直接 composer require phpunit/phpunit 会把它塞进 require,上线执行 composer install --no-dev 后,vendor/bin/phpunit 就彻底消失,CI 直接失败。正确做法只有一条:composer require --dev phpunit/phpunit:^10.5(PHP 8.1+)或 composer require --dev phpunit/phpunit:^9.6(PHP 7.4–8.0)。装完立刻验证:./vendor/bin/phpunit --version 能输出版本号且无 fatal error 才算过关。
pcov 是 PHP 8.2+ 的唯一可行覆盖率驱动
Xdebug 4 已移除行覆盖率支持,PHP 8.2 及以上必须用 pcov。别信“装了就行”,要三步全到位:
-
pecl install pcov或通过系统包管理器安装(如 Ubuntu 的apt install php-pcov) - 确认
php -m | grep pcov有输出;同时运行php -m | grep xdebug—— 两者不能共存,否则静默失效 - 在 php.ini 或
pcov.ini中显式启用:pcov.enabled=1且pcov.directory="src"(注意是源码根目录,不是include或vendor)
phpunit.xml.dist 必须含 coverage 配置且路径写死
只写 <coverage></coverage> 没用,php-code-coverage 不会自动扫描 src/。必须显式声明包含范围:
<coverage><include><directory suffix=".php">src/</directory></include></coverage>
多模块项目(如 modules/admin/src)还要先在 composer.json 的 autoload-dev.psr-4 里注册路径,再运行 composer dump-autoload,否则 <directory></directory> 写了也白写。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
避免用 processUncoveredFilesFromWhitelist="true" —— 它会让未执行的文件强行进报告,显示 0%,干扰真实判断。真要扫全量,改用 <whitelist processuncoveredfiles="true"></whitelist>(PHPUnit ≥9.3 已弃用 <whitelist></whitelist>,请用 <coverage><include></include></coverage> 替代)。
别用 composer exec 跑覆盖率命令
composer exec phpunit -- --coverage-html coverage/ 很容易因工作目录重置导致 bootstrap="vendor/autoload.php" 解析失败,测试全跳过,报告为空。最稳的方式是绕过 composer exec,直接运行:./vendor/bin/phpunit --coverage-html coverage/。
如果非要用 composer exec,得确保 phpunit.xml.dist 里 bootstrap 是绝对路径或能被正确解析的相对路径(比如 bootstrap="./vendor/autoload.php"),但不如直接调二进制省心。
覆盖率图表生成失败,90% 的问题出在扩展没真正加载或配置路径错位,剩下 10% 是 autoload 没刷新、composer exec 环境污染、或者 phpunit.xml.dist 放错了位置——它必须和 composer.json 同级,名字一个字符都不能差。










