PHP测试桩
外观
PHP测试桩[编辑 | 编辑源代码]
PHP测试桩(Test Stub)是单元测试中用于模拟依赖对象的虚拟组件,它按照预定义的行为响应调用,使开发者能隔离测试目标代码。测试桩常用于替代数据库连接、外部API等不可控依赖项。
核心概念[编辑 | 编辑源代码]
测试桩属于测试替身(Test Double)的范畴,主要特点包括:
- 提供固定响应(不包含逻辑)
- 不验证调用顺序(与Mock区别)
- 仅返回测试所需的预设值
数学表达为:
实现方式[编辑 | 编辑源代码]
基础手动实现[编辑 | 编辑源代码]
class PaymentServiceStub {
public function process($amount) {
return $amount < 1000; // 模拟只允许小额支付
}
}
// 测试用例
$stub = new PaymentServiceStub();
$result = $stub->process(500);
var_dump($result); // 输出: bool(true)
使用PHPUnit框架[编辑 | 编辑源代码]
PHPUnit提供getMockBuilder()
方法创建桩:
class OrderProcessorTest extends \PHPUnit\Framework\TestCase {
public function testProcessOrder() {
$paymentStub = $this->getMockBuilder(PaymentService::class)
->disableOriginalConstructor()
->onlyMethods(['process'])
->getMock();
$paymentStub->method('process')
->willReturn(true);
$processor = new OrderProcessor($paymentStub);
$this->assertTrue($processor->submitOrder(200));
}
}
典型应用场景[编辑 | 编辑源代码]
1. 外部服务模拟:支付网关返回成功/失败状态 2. 异常条件测试:模拟数据库连接超时 3. 性能测试:替代慢速服务加速测试
高级技巧[编辑 | 编辑源代码]
参数约束[编辑 | 编辑源代码]
$stub->method('calculate')
->with($this->greaterThan(0)) // 参数约束
->willReturnCallback(function($arg) {
return $arg * 0.1;
});
调用次数控制[编辑 | 编辑源代码]
$stub->expects($this->exactly(2))
->method('logError');
实际案例[编辑 | 编辑源代码]
电商订单系统测试:
class InventoryStub implements InventoryInterface {
private $items = [
'A001' => 5,
'B002' => 0
];
public function checkStock($itemId) {
return $this->items[$itemId] ?? 0;
}
}
// 测试缺货场景
$inventory = new InventoryStub();
$order = new Order(['B002' => 1]);
$this->assertFalse($order->canFulfill($inventory));
常见误区[编辑 | 编辑源代码]
- 过度使用:不应为所有依赖创建桩
- 行为验证:测试桩不应包含断言(属于Mock职责)
- 状态维护:避免在桩中存储复杂状态
最佳实践[编辑 | 编辑源代码]
1. 保持桩的代码简单性
2. 每个测试用例使用独立桩实例
3. 优先使用框架工具而非手动实现
4. 命名规范:*Stub
后缀
参见[编辑 | 编辑源代码]
通过系统化使用测试桩,开发者可以构建更可靠、执行更快速的测试套件,特别是在持续集成环境中体现其价值。