PHPUnit\Framework\TestCase与Tests\TestCase有什么区别?分别适用哪些场景?
我注意到示例测试中内置了以下两个测试类:
Feature Test =>use Tests\TestCase;
Unit Test =>PHPUnit\Framework\TestCase;
请问这两个类之间有什么区别?各自适合在哪些场景下使用?
两类测试基类的核心区别
Tests\TestCase 是 Laravel 对原生 PHPUnit 测试基类的扩展,本身就继承自 PHPUnit\Framework\TestCase,二者的核心差异如下:
- 框架加载逻辑:
Tests\TestCase运行时会自动初始化 Laravel 应用容器,支持直接调用app()、config()等框架助手函数,也能正常使用 Eloquent、路由、队列、缓存等所有 Laravel 组件;PHPUnit\Framework\TestCase是纯 PHPUnit 原生基类,不会加载 Laravel 框架,所有框架相关功能都无法直接调用。 - 内置测试工具:
Tests\TestCase封装了大量 Laravel 专属的测试便捷方法,比如模拟接口请求的get()/post()、数据库断言的assertDatabaseHas()、用户身份模拟的actingAs()等,这些能力原生 PHPUnit 基类都不提供。 - 运行速度:
PHPUnit\Framework\TestCase不需要加载框架,测试启动和运行速度更快;Tests\TestCase每次执行都要初始化 Laravel 应用,运行速度相对更慢。
各自适用场景
优先用 PHPUnit\Framework\TestCase 的场景
- 测试不依赖 Laravel 框架的纯业务逻辑,比如自定义工具类、纯数值计算逻辑、值对象、业务规则校验类等,只要测试对象可以直接实例化运行、不需要任何框架组件支持的都可以用。
- 追求测试执行效率,需要快速验证小粒度逻辑正确性的场景。
必须用 Tests\TestCase 的场景
- 功能测试:比如接口响应验证、页面路由测试、权限校验、表单提交逻辑等和框架能力强耦合的测试场景。
- 测试依赖 Laravel 组件的代码:比如 Eloquent 模型方法、队列任务、事件监听器、服务提供者、自定义验证规则、中间件等,这类代码脱离 Laravel 环境无法正常运行,必须用扩展后的基类。
- 集成测试:验证多模块、数据库、缓存等外部依赖协同工作的正确性的场景。
内容的提问来源于stack exchange,提问作者Maik Lowrey
相关产品推荐
相关产品推荐

