ousaa / tp51-phpunit-setup
一键为 ThinkPHP 5.1 项目配置 PHPUnit 测试环境
Package info
gitlab.seastt.com/ousaa/php-packages/tp51-phpunit-setup.git
pkg:composer/ousaa/tp51-phpunit-setup
Requires
- php: >=7.4
Requires (Dev)
- phpunit/phpunit: ^9.6
This package is auto-updated.
Last update: 2026-05-19 14:04:23 UTC
README
一键为 ThinkPHP 5.1 项目配置 PHPUnit 测试环境。
将原本需要手动完成的五个步骤压缩为两条命令:
composer require --dev ousaa/tp51-phpunit-setup
./vendor/bin/tp51phpunit-setup
执行完毕后即可直接运行:
./vendor/bin/phpunit
要求
- PHP
^7.4 - ThinkPHP
5.1.x - Composer
安装与使用
第一步:安装包
composer require --dev ousaa/tp51-phpunit-setup
第二步:运行 setup 脚本
在项目根目录(composer.json 所在目录)执行:
./vendor/bin/tp51phpunit-setup
脚本会自动完成以下操作:
- 修改
composer.json:添加think\命名空间的 PSR-4 映射、tests\命名空间的 autoload-dev、以及phpunit/phpunit ^9.5的 require-dev 依赖 - 给
Loader.php打补丁:将thinkphp/library/think/Loader.php中的require autoload_static.php改为include_once,避免 phpunit 启动时报重复声明类的错误 - 复制测试基础文件:将
tests/目录(含bootstrap.php、TestApp.php、TestRequest.php、HttpTestCase.php及示例测试)复制到项目根目录 - 复制
phpunit.xml到项目根目录 - 执行
composer dump-autoload更新自动加载
第三步:安装 phpunit
composer update phpunit/phpunit
或:
composer install
第四步:运行测试
./vendor/bin/phpunit
幂等性
setup 脚本可以安全地重复执行,已存在的配置和文件会被跳过,不会覆盖或破坏已有内容。
生成的目录结构
项目根目录/
├── phpunit.xml ← 新增
├── tests/
│ ├── bootstrap.php ← 新增
│ ├── TestRequest.php ← 新增
│ ├── TestApp.php ← 新增
│ ├── HttpTestCase.php ← 新增
│ ├── Unit/
│ │ └── ExampleTest.php ← 示例,可删除
│ └── Feature/
│ └── ExampleHttpTest.php ← 示例,需按项目路由调整后验证
编写测试
Unit 测试(不启动框架)
<?php
namespace tests\Unit;
class MyServiceTest extends \PHPUnit\Framework\TestCase
{
public function testSomething()
{
$service = new \app\common\service\MyService();
$this->assertSame('expected', $service->doSomething('input'));
}
}
Feature 测试(模拟 HTTP 请求)
继承 tests\HttpTestCase,使用 request() 或 requestJson() 方法:
<?php
namespace tests\Feature;
use tests\HttpTestCase;
class MyApiTest extends HttpTestCase
{
public function testGetList()
{
$response = $this->requestJson('GET', '/api/v1/items?page=1');
$this->assertEquals(200, $response->getCode());
$data = json_decode($response->getContent(), true);
$this->assertSame(0, $data['error']);
}
public function testCreate()
{
$response = $this->request('POST', '/api/v1/items', ['name' => 'test']);
$this->assertEquals(200, $response->getCode());
}
public function testUpdate()
{
$response = $this->requestJson('PUT', '/api/v1/items/1', ['name' => 'updated']);
$this->assertEquals(200, $response->getCode());
}
}
| 方法 | Content-Type | body 编码 |
|---|---|---|
request('POST', ...) | 不设置 | 表单($_POST) |
requestJson('POST', ...) | application/json | JSON(php://input) |
requestJson('PUT', ...) | application/json | JSON(php://input) |
requestJson('GET', ...) | 不设置 | 无 |
注意事项
1. 运行目录
./vendor/bin/tp51phpunit-setup 必须在项目根目录执行,脚本通过 getcwd() 定位宿主项目。
2. Loader.php 版本
setup 脚本对 thinkphp/library/think/Loader.php 使用多行精确匹配进行补丁,若 ThinkPHP 版本不匹配导致找不到预期内容,脚本会打印错误并中止,请参考 steps.md 手动处理。
3. tests/ 目录已存在
若项目中已有 tests/ 目录,setup 会跳过复制,不会合并或覆盖已有文件。
4. 独立测试数据库
如需 Feature 测试使用独立数据库,在项目根目录创建 .env.test:
DB_HOST = 127.0.0.1
DB_DATABASE = your_project_test
DB_USERNAME = root
DB_PASSWORD = your_password
TestApp 会在启动时自动检测并加载 .env.test,覆盖 .env 中的数据库配置。建议将 .env.test 加入 .gitignore。
5. 不在本包范围内的事项
requestByUser/requestJsonByUser等项目特定认证方法需自行在HttpTestCase子类中添加.env.test不会自动创建,需手动配置- 不提供 Composer 插件,用户需显式运行 setup 命令
许可证
MIT