Laravel用TestCase+refreshDatabase最顺;Symfony推荐KernelTestCase配轻量容器;自研架构须手动解耦依赖。phpunit须在项目根目录运行,bootstrap指向vendor/autoload.php。Eloquent测试应mockDB或抽Repository接口,避免连真实数据库。
PHP 主流架构(Laravel、Symfony、CodeIgniter 等)做单元测试,核心不是“能不能测”,而是“测什么”和“怎么让 phpunit 真正跑进你的业务逻辑里”。直接上结论:Laravel 用 TestCase + refreshDatabase 是最顺的路径;Symfony 推荐 KernelTestCase 配合轻量容器;纯 PHP 架构(如自研 MVC)必须手动解耦依赖,否则 new XxxService() 一写,测试就卡死。
phpunit.xml 配置常失效?常见现象是 phpunit 报错找不到 TestCase 类,或 vendor/autoload.php 加载失败。根本原因不是配置文件写错了,而是当前工作目录不对,或 composer install 没在项目根目录执行。
phpunit 必须从项目根目录运行,不能在 tests/ 下直接执行phpunit.xml 中的 bootstrap 路径要指向 vendor/autoload.php,不能写相对路径如 ./vendor/autoload.php
phpunit.xml.dist,需确认没被 .gitignore 忽略,且没被 IDE 自动重命名为 phpunit.xml 导致覆盖很多人一写模型测试就 DB::table('users')->insert(...),结果 CI 环境报错说 MySQL 连不上——这不是测试,这是集成测试。单元测试里,Eloquent 应该只验证逻辑,不碰真实连接。
RefreshDatabase trait(适合功能/集成级验证),但会清空并重建迁移,慢且依赖 DB 服务DB facade,例如 DB::shouldReceive('table')->once()->andReturn(...)(需 orchestra/testbench 或 Mockery)$repo = Mockery::mock(UserRepository::class)
KernelTestCase 启动太慢怎么办?KernelTestCase 会加载整个 Symfony kernel,启动耗时常超 1 秒,导致单测执行缓慢。这不是配置问题,是设计使然——它本就为功能测试而生。
TestCase(PHPUnit 原生类),完全绕过 kernelStaticWebTestCase 或手动构建轻量容器:$container = new ContainerBuilder(); $container->setParameter('kernel.debug', false);
setUp() 里重复调用 self::bootKernel(),它已在父类中执行一次这类框架往往在控制器里直接 new Model()、$this->load->model(),导致无法替换依赖。强行写测试只会不断 patch 全局状态,越写越脆。
new、static::、CI =& get_instance() 这类硬编码调用点$this->db 改为 public function __construct(\CI_DB $db)
Mockery::mock('CI_DB') 或 StubDb 类,控制返回值$_POST 或 $_SESSION,改用封装类如 RequestInterface,再注入 mock 实例class UserControllerTest extends TestCase
{
public function testStoreReturns422WhenEmailInvalid()
{
$request = Mockery::mock(RequestInterface::class);
$request->shouldReceive('getParsedBody')->andReturn(['email' => 'invalid']);
$validator = new EmailValidator();
$controller = new UserController($request, $validator);
$response = $controller->store();
$this->assertEquals(422, $response->getStatusCode());
}
}
最难的从来不是写
断言,而是让被测代码愿意被测——只要还存在 new、global、require_once 这类语句,测试就只能绕着走。重构比补测试更重要,也更急。
# mysql
# php
# laravel
# bootstrap
# git
# composer
# cad
# 编码
# 工具
# session
# symfony
# mvc
# 架构
# Static
# 封装
# 父类
# 构造函数
# xml
# 继承
# 接口
# class
# public
# function
# this
# table
# ide
# 数据库
# 重构
# 这类
# 单元测试
# 这不是
# 报错
# 这是
# 加载
# 找不到
# 很多人
# 能在
# 只会
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎么设置默认终端应用_Windows11开发者选项终端
Windows10系统怎么查看显卡型号_Win10 dxdiag显示选项卡
Win11怎么清理C盘下载文件夹_Win11清理下载文件夹技巧【教程】
Go语言中slice追加操作的底层共享机制详解
使用类变量定义字符串常量时的类型安全最佳实践
Python邮件系统自动化教程_批量发送解析与模板应用
Windows11怎么自定义任务栏_Windows11任务栏自定义教程【步骤】
php打包exe如何加密代码_防反编译保护方法【技巧】
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
c++ unordered_map怎么用 c++哈希表用法【教程】
Win10电脑C盘红了怎么清理_Windows10系统盘深度瘦身指南
php能跑在stm32上吗_php在stm32微控制器上的移植方法【介绍】
如何减少Golang内存碎片化_Golang内存分配与回收优化方法
如何使用Golang写入二进制文件_Golang io Write二进制写入示例
如何在 Go 中创建包含映射(map)的切片(slice)结构
如何使用Golang反射创建map对象_动态生成键值映射
如何在网页无标准表格标签时高效提取结构化数据
Windows10电脑怎么设置虚拟内存_Win10高级系统设置性能
Win11怎么开启智能存储_Windows11存储感知自动清理文件
Python对象生命周期管理_创建销毁说明【指导】
如何在 Go 结构体中正确初始化 map 字段
Win11怎么关闭自动更新 Win11永久关闭系统更新的有效方法【技巧】
如何在JavaScript中动态拼接PHP的base_url与jQuery变量
php串口通信波特率怎么选_根据硬件手册设置正确波特率【方法】
php怎么连接数据库_MySQL数据库连接的基础代码编写【说明】
Win11怎么设置虚拟内存最佳大小_Windows11性能选项自定义分页文件
Win11怎么设置按流量计费_Win11限制后台流量消耗【网络】
短链接怎么自定义还原php_修改解码规则适配需求【汇总】
如何在Golang中使用container/heap实现堆_Golang container/heap最小堆方法
Win11怎么激活Windows10_Win11激活Win10系统方法【步骤】
c++ stringstream用法详解_c++字符串与数字转换利器
Django密码修改后会话失效的解决方案
手机php怎么转mp4_手机端php文件转mp4app推荐【指南】
c++ namespace命名空间用法_c++避免命名冲突
如何使用Golang实现路由分组管理_Golang路由分组与权限控制方法
Win11怎么关闭定位服务 Win11禁止应用获取位置信息【隐私】
Windows10怎么卸载预装软件_Windows10预装软件卸载步骤【教程】
Go 中实现 Python urllib.quote() 功能的等效方法
php订单日志权限怎么设_php订单日志文件权限设置技巧【技巧】
静态属性修改会影响所有实例吗_php作用域操作符下静态存储【教程】
C++中引用和指针有什么区别?(代码说明)
Windows蓝屏错误0x0000002C怎么解决_系统IO异常排查方法
如何使用Golang template生成文本模板_动态生成HTML或文本
Win11怎么关闭透明效果_Windows11个性化颜色关闭透明
Python集合操作技巧_高效去重解析【教程】
LINUX如何查看文件类型_Linux中file命令的识别与应用
Python大型项目拆分策略_模块化解析【教程】
Win10怎样设置多显示器_Win10多显示器扩展设置【攻略】
Win10怎样卸载iTunes_Win10卸载iTunes步骤【步骤】
如何解决同一段404代码在不同主机上表现不一致的问题
2026-01-01
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。