infection 不是 composer 插件,而是通过 composer 安装的独立工具;能否运行取决于 php 环境、测试框架配置及 infection.json5 中源码与测试范围的精确设定。

Infection 不是 Composer 的插件,它只是通过 Composer 安装和调用;真正决定变异测试能否跑通的,是 PHP 运行环境、测试框架配置、以及 infection.json5 里对源码和测试范围的精确界定——不是装上就能用。
为什么 composer require --dev infection/infection 后运行没反应
常见错误现象:执行 ./vendor/bin/infection 后终端卡住、无输出、几秒后直接退出,看起来像“没运行”。
- 这不是失败,是 Infection 默认静默 fork 子进程跑 Mutation —— 它不打印日志、不显示进度条,新手容易误判为挂了
- 真出问题时,加
--log-verbosity=debug才能看到底层错误,比如Failed to create process就是 Windows 下pcntl扩展不可用的明确信号 - Linux/macOS 下也要确认当前用户对
vendor/和临时目录有写权限,否则 fork 失败也不报错 - 最快速验证方式:加
--filter=MyServiceTest限定单个测试类,5 秒内出结果,流程通了再放开全量
infection.json5 必须手动配准 PHPUnit 配置路径
别信文档里“自动识别测试框架”的说法——Infection 根本不会去猜 phpunit.xml 在哪。如果配置错,会报 Could not find PHPUnit configuration file,然后静默跳过所有测试。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"phpUnit": { "configDir": "." }中的.必须指向phpunit.xml(或phpunit.xml.dist)所在目录,不是项目根目录,也不是tests/ - 如果
phpunit.xml在tests/下,这里就得写"configDir": "tests" - 用
phpunit --configuration tests/phpunit.xml --list-tests先手动验证路径是否有效,再填进 Infection 配置 - CI 环境(如 GitHub Actions)中,
configDir路径要跟 runner 工作目录对齐,Ubuntu runner 默认工作目录是/home/runner/work/repo/repo
CI 中跑 Infection 必须显式启用 pcntl,且不能用 --dry-run
GitHub Actions 或 GitLab CI 默认不禁止 pcntl,但某些自建 runner 可能禁用;而 composer install --dry-run 会导致后续 Infection 因类未加载直接报 Class not found。
- 在 CI 步骤开头加
run: export PCNTL_ENABLED=1(Linux/macOS),Windows runner 直接放弃,Infection 不支持 - 确保使用 Ubuntu runner:
runs-on: ubuntu-latest,GitHub 的默认镜像已启用 pcntl -
composer install必须真实写入vendor/,--dry-run仅用于 diff 检查,不能出现在 Infection 前置步骤中 - 推荐加
--threads=4提速,但别超过 runner CPU 核数,否则反而拖慢
存活变异体不是 bug,而是测试盲点定位器
Infection 报告里的 “Survived” 不代表代码写错了,而是告诉你:“这段逻辑,你的测试用例没真正验证它是否按预期工作”。比如删掉一个 || $points > 100,测试仍通过,说明你漏测了状态组合分支。
- 别急着改源码,先看变异类型:
TrueValueRemoval、EqualityToGreaterThan这类提示非常具体 - 每个存活变异体都对应一个可写的测试用例,目标不是“杀光”,而是“理解为什么活下来”
- 变异分数低于 80% 时,优先挑
src/Domain/或src/Service/下核心逻辑的存活体,别在 DTO 或 config 文件上纠结 - 用
infection log查看详细日志,里面会标出哪个测试类、哪行代码、哪个变异器导致存活
最易被忽略的一点:Infection 不分析 require-dev 里工具自身的代码变更,但它极度敏感于你项目里 use 的那些类——哪怕只改了一行 vendor/some/package/src/Helper.php,只要被你代码引用,就可能让某个变异体意外存活。










