根本原因是未加载 yii2 autoloader 或 vendor/autoload.php;需显式运行 composer install、指定 phpunit --bootstrap tests/bootstrap.php、配置 mysql services、设置 yii_env=test 等。

GitHub Actions 里跑 Yii2 测试总报 Class 'Yii' not found
根本原因是没装 Yii2 的 autoloader,或者 vendor/autoload.php 没被引入。GitHub Actions 默认不执行 composer install 后的自动脚本(比如生成 autoload),更不会自动加载 tests/bootstrap.php。
- 必须显式运行
composer install --no-interaction --prefer-dist,且确保composer.json中有"autoload-dev"配置(Yii2 标准模板默认已有) - PHPUnit 启动时要指定 bootstrap 文件:
phpunit --bootstrap tests/bootstrap.php,不能只写phpunit - 检查
tests/bootstrap.php是否包含require __DIR__ . '/../vendor/autoload.php';—— 很多老项目漏掉这行 - 如果用
codeception,得用codecept run unit而不是直接调 PHPUnit,否则 Yii2 的测试环境(如Yii::$app初始化)不会触发
数据库迁移在 CI 里失败:SQLSTATE[HY000] [2002] Connection refused
CI 环境没有预装 MySQL 服务,或容器未正确链接。GitHub Actions 默认只有 Ubuntu runner,不带 MySQL 进程,也不能靠本地 127.0.0.1:3306 连接。
- 必须用
services声明 MySQL 容器:mysql服务名、端口映射为3306,并设置MYSQL_ROOT_PASSWORD - Yii2 的
tests/config.php或codeception.yml中,数据库 host 必须写成mysql(即 service 名),不是localhost或127.0.0.1 - 迁移命令前加等待逻辑:用
wait-for-it.sh或简单循环nc -z mysql 3306,否则 migration 可能在 MySQL 完全就绪前就执行 - 避免在 CI 中执行
yii migrate/up—— 改用yii_test migrate/up --interactive=0并确保TEST_DB_DSN环境变量指向测试库
部署到生产环境时,assets 目录权限错乱或生成失败
GitHub Actions runner 是无状态 Linux 用户,没有写入 webroot 权限,且 yii asset 命令依赖 AssetManager 配置和文件系统权限。
- 部署前必须设好目标目录权限:
chown -R www-data:www-data /var/www/html/assets(假设用 Apache + www-data) -
yii asset不要在 CI 中直接运行 —— 改用yii asset/compress assets.php assets-prod.php生成压缩配置,再在部署后由 Web 服务器触发首次访问时自动发布 - 确认
assets/目录已加入.gitignore,但assets.php和assets-prod.php必须提交,否则线上无法定位资源路径 - 若用 Capistrano 或 rsync 部署,注意排除
runtime/和web/assets/,否则旧文件残留会导致 404 或缓存错乱
PHP 版本兼容性导致测试通过但线上报错
本地开发用 PHP 8.1,CI 用默认 ubuntu-latest(当前是 PHP 8.3),而生产环境是 PHP 7.4 —— Yii2 2.0.x 对 PHP 8+ 的严格类型提示容忍度低,尤其在 ActiveRecord 关系定义或控制器 action 参数上。
- CI workflow 中明确锁定 PHP 版本:
php-version: '7.4',别依赖系统默认 - 检查
composer.json的"require": {"php": ">=7.4.0"}是否与实际一致;Yii2 2.0.45+ 才完全支持 PHP 8.1+ - 禁用
opcache.enable_cli=1(CI 默认开启),它会让某些反射行为异常,比如ActiveRecord::attributes()返回空数组 - 测试中用
assertIsArray($model->getAttributes())替代assertTrue(is_array(...)),避免因 PHP 版本差异导致断言静默失败
最常被忽略的是 tests/bootstrap.php 里没设置 YII_ENV 为 test,导致日志组件初始化失败,进而让后续测试因异常捕获逻辑不同而表现不一致。











