ousaa/tp51-phpunit-setup

一键为 ThinkPHP 5.1 项目配置 PHPUnit 测试环境

Maintainers

Package info

gitlab.seastt.com/ousaa/php-packages/tp51-phpunit-setup.git

pkg:composer/ousaa/tp51-phpunit-setup

Statistics

Installs: 5

Dependents: 0

Suggesters: 0

v1.0.2 2026-05-19 14:03 UTC

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

脚本会自动完成以下操作:

  1. 修改 composer.json:添加 think\ 命名空间的 PSR-4 映射、tests\ 命名空间的 autoload-dev、以及 phpunit/phpunit ^9.5 的 require-dev 依赖
  2. Loader.php 打补丁:将 thinkphp/library/think/Loader.php 中的 require autoload_static.php 改为 include_once,避免 phpunit 启动时报重复声明类的错误
  3. 复制测试基础文件:将 tests/ 目录(含 bootstrap.phpTestApp.phpTestRequest.phpHttpTestCase.php 及示例测试)复制到项目根目录
  4. 复制 phpunit.xml 到项目根目录
  5. 执行 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-Typebody 编码
request('POST', ...)不设置表单($_POST
requestJson('POST', ...)application/jsonJSON(php://input
requestJson('PUT', ...)application/jsonJSON(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