必须用php:8.1-cli-alpine等CLI镜像构建轻量测试环境,预装mbstring/pdo_sqlite等扩展,仅挂载代码目录、禁用runtime挂载,通过composer install --no-dev安装依赖,执行php vendor/bin/phpunit,测试库用SQLite内存模式确保CI稳定。

要用 Docker 为 ThinkPHP 6.0 搭建单元测试环境(尤其用于 CI 流水线),核心不是跑通框架,而是让 PHPUnit 在隔离、可复现、无副作用的容器里稳定执行测试用例,并输出可靠结果。重点在于环境轻量、依赖精准、路径干净、错误可见。
选对基础镜像:CLI 优先,别用 FPM
单元测试不需要 Web 服务或 FastCGI,所以必须用 php:8.1-cli-alpine 或 php:8.2-cli-alpine 这类 CLI 专用镜像。避免使用 php:8.1-fpm 或全栈镜像——它们自带 nginx/php-fpm 进程,徒增启动开销和干扰。
- Alpine 版本体积小、启动快,适合 CI 场景
- 确认镜像已预装
zip、mbstring、pdo_sqlite(测试常用)等扩展;缺的用docker-php-ext-install补 - 如需代码覆盖率,再加
pecl install xdebug并启用(CI 中建议关掉 Xdebug 的远程调试,只保留 coverage)
挂载方式要干净:只挂代码,不挂 runtime
CI 环境下,容器是“一次性的”,所有临时文件(日志、缓存、测试数据库)都应在容器内生成并销毁。不要把宿主机的 runtime/ 目录挂进去——它可能残留旧状态,干扰测试结果,甚至因权限问题导致 file_put_contents 静默失败。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 只挂载项目根目录(或仅
app/、tests/、think等必要部分)到容器内/app -
composer install应在构建阶段完成(利用缓存),或在容器启动时运行(通过docker-compose run --rm触发) - 测试命令统一走
php vendor/bin/phpunit,确保路径与 Composer 自动加载一致
配置 PHPUnit 和 ThinkPHP 兼容性
ThinkPHP 6.0 的测试支持依赖 topthink/think-orm 和 topthink/think-testing,但默认不内置 PHPUnit。需显式安装并配好 bootstrap。
立即学习“PHP免费学习笔记(深入)”;
- 在
composer.json的require-dev中加入:"phpunit/phpunit": "^9.6",<br>"topthink/think-testing": "^3.0"
- 创建
phpunit.xml,指定bootstrap="tests/bootstrap.php",并在该文件中引入 ThinkPHP 启动逻辑(如加载vendor/autoload.php+ 初始化App实例) - 测试数据库建议用 SQLite 内存模式(
:memory:),避免 CI 中连接外部 MySQL 的不稳定
CI 脚本示例:GitHub Actions / GitLab CI
一个典型的 CI 步骤只需三步:准备环境 → 安装依赖 → 执行测试。Docker Compose 不是必须项,单条 docker run 更轻量可控。
- GitHub Actions 示例片段:
- name: Run unit tests<br> run: docker run --rm -v $(pwd):/app -w /app php:8.1-cli-alpine sh -c "composer install --no-dev --no-scripts || true && composer require --dev phpunit/phpunit:^9.6 topthink/think-testing:^3.0 && vendor/bin/phpunit"
- 关键点:
• 使用--rm确保每次都是干净容器
•-w /app显式设置工作目录
• 先装依赖再跑测试,避免因 vendor 缺失报错


















