Class 'MyPackageCalculator' not found 的根本原因是 Composer 未加载本地包,解决办法是配置 composer.json 的 autoload(如 "psr-4": { "MyPackage\": "src/" }),执行 composer dump-autoload,确认命名空间正确,并用 ./vendor/bin/phpunit 运行测试。

本地运行 PHPUnit 时找不到被测类
常见现象是 Class 'MyPackageCalculator' not found,哪怕类文件明明在 src/ 下。根本原因是 Composer 没加载你的包——你没把它当“已安装依赖”对待,而是直接跑测试脚本。
解决办法不是手动 require,而是让 Composer 知道这个包可被自动加载:
- 确保
composer.json中有正确"autoload"配置,例如:"psr-4": { "MyPackage\": "src/" } - 执行
composer dump-autoload(不是install或update)生成映射 - 确认测试文件里用了正确的命名空间,比如
use MyPackageCalculator; - 运行测试时用
./vendor/bin/phpunit,它会自动包含vendor/autoload.php
测试中需要读取环境变量或配置怎么办
PHPUnit 默认不读取 .env 或项目级配置,硬编码路径或值会让测试脆弱。Airflow DAG 测试里常遇到类似问题:DAG 依赖 Airflow Variable,但本地没启动服务。
推荐做法是用 PHPUnit 的 --bootstrap 参数提前注入模拟数据:
- 新建
tests/bootstrap.php,在里面调用putenv('APP_ENV=test')或$_SERVER['APP_ENV'] = 'test' - 若需模拟 Airflow Variables,可在 bootstrap 中 patch
airflow.models.Variable.get方法(用Mockery或phpunit-mock-objects) - 运行命令改为:
./vendor/bin/phpunit --bootstrap tests/bootstrap.php
注意:不要在测试方法里反复 setenv,PHP 的 putenv 不影响子进程,且 PHPUnit 可能复用进程。
composer require --dev 安装的 PHPUnit 版本不兼容
错误信息如 Declaration of PHPUnitFrameworkTestCase::setUp(): void must be compatible with PHPUnitFrameworkTestCase::setUp(),本质是 PHPUnit 主版本和 PHP 版本错配。
查清三者关系再动手:
- PHP 8.0+ → 推荐
phpunit/phpunit:^9.5或^10.0 - PHP 7.4 → 锁定
phpunit/phpunit:^8.5 - 项目若含
apache-airflow,注意cloud_composer_dag_test_utils==1.0.0要求apache-airflow[google] >= 2.0.0, ,它本身对 PHPUnit 无强约束,但别选太新的 PHPUnit 导致反射行为变化 - 执行
composer show phpunit/phpunit确认实际安装版本
为什么 phpunit.xml 里写 bootstrap="vendor/autoload.php" 还报错
因为这个路径是相对于当前工作目录(即运行 phpunit 命令的位置),不是相对于配置文件本身。很多人把 phpunit.xml 放在 tests/ 目录下,然后在该目录里执行命令,结果 vendor/autoload.php 找不到。
两个稳妥解法:
- 始终在项目根目录(有
composer.json和vendor/的地方)运行./vendor/bin/phpunit - 或在
phpunit.xml中用相对路径写死:→ 改为(如果配置文件在tests/下)
最易忽略的一点:CI 环境里可能没有 vendor/ 目录,必须先 composer install 再跑测试,否则 autoload.php 根本不存在。











