必须用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 静默失败。
- 只挂载项目根目录(或仅
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。
- 在
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 缺失报错
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











