什么是“打桩”?
今天第一次在某篇技术文章中看到这个词,感觉十分具有魔力,在好奇心的驱使想,于是有了这篇文章。
现实世界中的打桩
打桩,指把桩打进地里,使建筑物基础坚固。如果要在地面上搭建建筑物,地面要承受很大的压力,为了保证地面有足够的抵抗压力的强度,这个往往很难做到,所以就必须对承受建筑物的地面进行加固或者改善地面的承受方式,所以就想到在地基上打桩,让建筑物的大部分重量通过桩传到地面以下很深的位置,这个位置的地基通常比地面承受能力大得多。
桩代码(Stub)
想象一下,桩代码与打桩有联系吗?我认为这里存在一个很有趣的类比,因为打桩往往意味着替换与改变,而桩代码的存在,理所当然应该促使我们完成“打桩”这一动作。
桩代码也指伪代码,通常用于占位或替换部分暂未实现的功能,它模拟了某个过程中代码的执行结果,以此来避免代码逻辑由于某个未实现的功能受到阻塞,导致其它工序无法执行。
举一个例子:
function getBalanceFromBank() {
return 10000
}
function purchaseGoods(goods) {
const balance = getBalanceFromBank()
if (balance > goods.price) {
console.log('User can purchase')
}
}
在上述例子里,getBalanceFromBank 就属于一段桩代码,因为它并未作出任何实现,只是为了让整段 purchaseGoods 函数正常的编译与执行后面的逻辑,这里的打桩主要以占位为目的。
打桩测试的意义
在测试替身,打桩(Test Stub)也十分有戏份,我们通常会使用打桩的方式去替 换原有程序中难以在测试中进行模拟的函数片段,以此来达到两个测试目的:隔离与控制。 隔离即屏蔽组件依赖,如果 A 依赖 B,B 依赖 C,则我们只需要对 B 进行打桩,则可屏蔽掉 C 的依赖。而控制的意义就在于通过指定不同的返回值,以此来进入到不同的 Test Case。
总结
桩代码作为一种编程范式,我认为在以下的场景中值得推荐:
- 共同与他人开发一段代码功能时,通过占位的形式提前将功能函数进行占位与编排,避免相互的开发工作受到影响。
- 可以使用桩函数迅速搭建出程序骨架。
- 通过临时的解决方案进行标注,并在后期进行相应的打桩与增强。
理解了打桩三要素:隔离、占位与控制,不论在编写功能函数与测试代码时都能变得游刃有余。
当然,我十分建议大家在开发时减少使用“打桩”这个词,除非你和队友有共同的“打桩”爱好。