Composer包需正确配置自动加载与测试引导:autoload仅含运行时源码,autoload-dev单独声明测试路径;tests/bootstrap.php须用dirname(__DIR__).'/vendor/autoload.php'安全引入。

Composer 包本身不运行测试,但你的包必须能被 phpunit 正确加载和执行 —— 关键在于自动加载配置、测试引导和最小依赖闭环。
composer.json 的 autoload 和 autoload-dev 必须分离
很多人把测试类路径塞进 autoload,导致生产环境也加载测试代码,既污染又可能引发意外副作用。
-
autoload只放真正运行时需要的源码路径(如"src/": ["src"]) -
autoload-dev单独声明测试相关路径(如"tests/": ["tests"]),这样composer install --no-dev时完全跳过测试类 - 如果测试中用到了源码里的类,确保
autoload-dev不依赖autoload的定义顺序 —— Composer 会合并两者,但路径冲突时以autoload为准,所以别在两个区块里重复映射同一命名空间
测试入口文件 tests/bootstrap.php 要手动 require vendor/autoload.php
PHPUnit 默认不读取 composer.json,它只认你给它的 bootstrap 文件。很多包直接写 require 'vendor/autoload.php',结果在别人项目里跑测试时路径错乱。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 正确写法是向上追溯到项目根目录:
require dirname(__DIR__) . '/vendor/autoload.php'; - 不要用
__DIR__ . '/../vendor/autoload.php'—— 这假设 tests 目录和 vendor 同级,但实际可能是嵌套在子模块或 symlink 环境下 - 如果包支持多 PHP 版本,可在 bootstrap 中加
if (version_compare(PHP_VERSION, '8.1', ' 做条件加载,避免低版本报语法错误
phpunit.xml 需显式指定 bootstrap 和 testdox 输出风格
默认 phpunit.xml.dist 往往缺关键配置,导致 IDE 或 CI 里测试找不到类,或失败信息难读。
-
bootstrap属性必须指向上面写的tests/bootstrap.php,不能省略 - 加上
convertErrorsToExceptions="true"和convertNoticesToExceptions="true",让 E_NOTICE 也中断执行 —— 否则某些未初始化变量在测试里静默失败 -
testdox="true"开启行为描述式输出,比如MyPackage::it_handles_null_input显示为 “handles null input”,比原始方法名更易定位问题场景 - 别在
<testsuites>里硬编码./tests,用directory="tests"+suffix="Test.php"更健壮
CI 中运行测试前必须执行 composer install --no-interaction --prefer-dist
本地能过不代表 CI 能过。常见断点:缺少 ext-mbstring、PHP 模块版本不一致、或 composer.lock 未提交。
- 始终先运行
composer install,而不是composer update—— 后者会改 lock 文件,破坏可复现性 - 加
--no-interaction防止卡在 license 提示;--prefer-dist加速下载(尤其 GitHub Actions) - 如果包有
require-dev依赖 PHPUnit,确认其版本与phpunit.xml中xmlns="https://schema.phpunit.de/9.3/"匹配,否则 XML 解析失败且报错极不明确 - 在 GitHub Actions 中,建议用
shivammathur/setup-php显式指定 PHP 版本和扩展,而不是依赖系统默认
最常被忽略的是:测试代码里调用 new \SomeClass() 时,如果这个类在 autoload-dev 里没声明命名空间映射,就会报 Class not found —— 错误不在测试逻辑,而在 autoload 配置漏了一行。

















