10|TDD中的驱动(3):何为经典学派?何为伦敦学派?
徐昊
你好,我是徐昊。今天我们继续来讨论测试驱动开发中的驱动。
上节课我们讲了四种常用的重构手法,分别是提取方法、内联方法、引入参数和引入字段。并区分了用于高效修改代码的重构手法,和用于消除坏味道以改进架构设计的重构。还介绍了一种架构软件的方法:重构到模式。也就是通过重构将坏味道替换为模式,从而改进软件架构的方式。
重构到模式,或者说 TDD 红 / 绿 / 重构循环中的重构,是在完成功能的前提下以演进的方式进行设计。这是延迟性决策策略,也叫最晚尽责时刻(Last Responsible Moment,LRM)。也就是说,与其在信息不足的情况下做决定,不如延迟到信息更多,或是不得不做出决策的时机再决策。这种策略的重点在于,在保持决策有效性的前提下,尽可能地推迟决策时间。
如果架构愿景不清晰,那么“最晚尽责时刻”让我们不必花费时间进行空对空的讨论,可以尽早开始实现功能,再通过重构从可工作的软件(Working Software)中提取架构。这种方式也被称作 TDD 的经典学派(Classic School)或芝加哥学派(Chicago School)。
除了经典学派之外,还有一种 TDD 风格,被称作 TDD 的伦敦学派(London School)。如果架构愿景已经比较清晰了,那么我们就可以使用伦敦学派进行 TDD。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
TDD中的驱动包括经典学派和伦敦学派两种风格。经典学派强调通过重构进行演进式设计,延迟性决策,而伦敦学派更注重预先存在的设计,通过测试替身集中于功能上下文中的某个对象进行开发。两种风格并不冲突,而是在不同场合下使用。文章还介绍了伦敦学派的做法,以及两种风格的差异和相似之处。通过对TDD的驱动进行深入了解,读者能够明白TDD实际上是一种架构技术,能够帮助更好地将功能放置到不同的单元。下一节课将继续探讨测试驱动开发的全貌。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《徐昊 · TDD 项目实战 70 讲》,新⼈⾸单¥98
《徐昊 · TDD 项目实战 70 讲》,新⼈⾸单¥98
立即购买
登录 后留言
全部留言(11)
- 最新
- 精选
- 汗香我认为保证测试有效性有两点: 1、不能对待测方法的实现使用测试替身,可以对测试方法调用的外部组件使用测试替身 2、不能行为验证绑定到实现方法的内部 另外我有个问题,最后一个视频演示的是 Controller -> Dao 的场景,这种直接对 Dao 使用测试替身,这种方法毋庸置疑,但如果是多层构架,如 Controller -> Service -> Dao ,那么我们在测 Controller 时应该是对 Dao 使用测试替身还对 Service 使用测试替身
作者回复: 驱动controller的时候 double service 驱动service的时候 double dao
2022-04-174 - 枫中的刀剑对于伦敦学派,根据第5、6章节的内容,也是主要是通过状态校验来保证测试的有效性。但是有个疑惑点是对于伦敦学派,采用状态验证的方式只能保证单个sut的有效性,而对于更大的功能上下文的有效性是应该没法保证的,所以对于完整功能的有效性验证就只能通过更大的端到端测试来保证吗?
作者回复: 引入测试替身之后 可以验证更大范围
2022-03-30 - 姑射仙人在伦敦学派中,是如何保证测试的有效性的? 状态验证2022-05-212
- aoe测试入参:伦敦学派中通过“Mock 外层”返回了当前需要的数据,测试时隔离了对外层的依赖,降低了构造测试的难度。 功能验证:使用状态验证 伦敦学派通过“Mock 外层”返回了当前需要的数据,本层功能依然使用状态验证,所以可以保证测试的有效性。 08 09 10 学习笔记 http://wyyl1.com/post/19/06/2022-03-312
- Geek_32ff72最后的例子把repo mock了,但是controller->repo的正确性怎么保证呢?是否还需要一个完整的集成测试呢?2023-01-16归属地:广东
- 王艺辉伦敦学派初始将自己视作更大的功能上下文通过替身保证测试有效性;将注意力集中到功能上下文中的某个对象上之后,依然由芝加哥学派来保证测试有效性。2022-12-03归属地:浙江
- SochiLee古典学派到底是叫芝加哥学派还是底特律学派呀?《Mocks Aren't Stubs》中说古典学派叫底特律学派。2022-06-211
- zenk在伦敦学派中,是如何保证测试的有效性的? 架构愿景清晰,保证可以构造稳定的测试替身,进而保证测试的有效性。2022-05-07
- davix在伦敦学派中,是如何保证测试的有效性的? 我覺得是通過更高層的集成測試保證的。比如repository的測試要用真實數據庫2022-05-03
- wenming思考题我是这么理解的:只要构造 Stub 的时候不对 SUT 的结果产生影响,也就是说,Stub 的存在不会改变测试的效果,只是我们构建夹具(测试上下文)的形式或者说方法有区别,那么整个测试的有效性就能够得到保证2022-04-01
收起评论