Codeception 必须本地安装而非全局:composer require codeception/codeception --dev 是唯一推荐方式,否则模块类找不到、配置不生效、版本冲突;初始化后需检查 paths/tests 路径、PhpBrowser/WebDriver 的 URL 和 wd_host、Db 模块的 charset 与 host。

Codeception 不该用 Composer 全局安装,必须项目本地装 —— 否则测试套件无法正确加载模块、acceptance.suite.yml 里的 PhpBrowser 或 WebDriver 会报找不到类,而且不同项目依赖的 Codeception 版本冲突时根本没法并行开发。
为什么 composer require codeception/codeception --dev 是唯一推荐方式
本地安装才能让 codecept 命令读取到当前项目的 codeception.yml 和 suite 配置;全局安装的二进制文件会忽略项目级 autoloader,导致所有扩展(比如 codeception/module-rest)的类注册失败。
常见错误现象:PHP Fatal error: Class 'Codeception\Module\REST' not found,或运行 codecept run acceptance 时提示 Module WebDriver is not configured,哪怕你明明写了配置。
- 必须加
--dev:Codeception 只在开发/测试阶段需要,不该打进生产包 - 不要加
-g(global):全局安装后codecept init生成的路径默认指向全局 vendor,后续require模块全错位 - 如果已全局装过,先运行
composer global remove codeception/codeception再清理$HOME/.composer/vendor/bin/codecept
codecept init 后要立刻检查的三处配置
初始化只是骨架,很多关键项不会自动填对,尤其涉及路径和模块加载。不改就跑,十有八九在 acceptance 或 functional suite 卡住。
-
paths: tests必须是相对路径,比如tests,不能写成./tests或绝对路径 —— 否则codecept build生成的 Tester 类会引用错 namespace -
modules: enabled下的PhpBrowser要配url,且该 URL 必须能被 CLI 环境直接访问(别写http://localhost,改用http://127.0.0.1或 Docker 容器名) - 若用
WebDriver,确认wd_host指向的是 Selenium Server 或 ChromeDriver 的真实监听地址(例如http://selenium:4444/wd/hub),不是localhost:4444
集成测试里 Db 模块连不上 MySQL 的典型原因
不是密码错了,也不是端口不通 —— 大概率是 Db 模块默认用 PDO::MYSQL_ATTR_INIT_COMMAND 发了 SET NAMES utf8,但 MySQL 8 默认字符集是 utf8mb4,直接报 SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client。
- 解决方案:在
codeception.yml的Db配置里显式指定charset: utf8mb4 - 同时检查
dumper是否用了mysqldump:它默认也不支持utf8mb4,得加参数--default-character-set=utf8mb4 - 如果数据库在 Docker 里,
host别写localhost,写容器名(如mysql),否则 PHP CLI 根本连不到
最麻烦的其实是 acceptance 测试里前端 JS 报错不反馈到终端 —— 你得手动在 WebDriver 配置里打开 restart: false 和 log_js_errors: true,不然页面挂了只显示白屏,连错在哪都不知道。











