徐昊 · TDD项目实战70讲--极客时间课程推荐/优惠
版权声明
本站非极客时间官网,与官方无任何关系。我们不提供课程下载或详细内容,仅作为课程分享和推荐平台。我们鼓励大家支持正版,尊重创作者的劳动成果,这样不仅能帮助创作者持续产出优质内容,也能让自己获得更好的学习体验。请通过官方渠道购买和学习课程,感谢您的理解与支持。
课程详情
你将获得:
- 洞见测试驱动开发的实质与全貌;
- 40+小时视频,演绎架构设计新思路;
- 3个开发框架,搞定TDD的落地难题;
- 靠谱程序员必备的任务分解基本功。
课程介绍
提起TDD,肯定会掀起一番互为对立的讨论。会TDD的人连声称赞叫好,认为TDD显著提高了编码效率,让自己工作起来更有安全感。而没实践过TDD的人,还在困惑这是不是天方夜谭,因为没法想象为什么需要这样的方式来开发:
- 为什么要开发人员来写测试?难道开发人员写了测试,测试人员就不用再测了嘛?
- 又要写测试,又要写生产代码,效率是不是太低了?
- 不写测试我也能写出可以工作的软件,那么写测试能给我带来什么好处呢?
然而TDD并不是关于“怎么写测试”“怎么消除测试人员”“怎么让开发人员多干一份活”的编码技巧。它是以测试为里程碑点的工程化研发过程。同时将软件流程中无时无处不在的低效测试手段,用可重复的、高效的自动化测试来代替,从而获得更高的工程效能。
这才是隐藏在TDD工程实践背后的核心逻辑。
TDD作为敏捷开发的重要基石,就像脚手架,为代码提供保护网。它的核心在于严格规定开发节奏,一次把需求理清,一次做对、消除返工,不用调试就能获得反馈。它最直接的收益,就是帮助你提高开发功能的效能。而最后节省出的时间,也将远远大于编写测试代码而产生的工作时间总和。
不过,学习TDD肯定需要花费一番力气,很多信服于TDD理念而自发实践的人也会被各种问题所困扰。而最佳的学习路径,就是跟一个真正会TDD的程序员一起写代码。
为此,我们特别邀请了Thoughtworks中国区CTO徐昊老师,来帮你搞定TDD的落地难题。他作为国内第一批TDD的践行者,是国内目前为数不多的熟练掌握TDD技能的大师级程序员。
他会先演示一个简单的例子,让你眼见为实,对TDD形成一个感性、直观的认识。同时,他也会对TDD抽丝剥茧,消除你对单元测试的疑惑,帮你认识到TDD中测试的实质与全貌。接下来的重点是,他会带着你在复杂场景下进行实战项目的练习,帮你吃透TDD实战中的细节。
需要特别说明的是,为了帮助你最大化学习效果,我们的内容交付形式会是这样的:以视频展示为主,以图文讲解为辅。其中每节课20+分钟的视频,老师会手把手带你编写测试、驱动开发。
在课程更新的过程中,我们还会开启“线上带练”的学习项目,由徐昊老师亲自带队,手把手教你怎么在实战中练习TDD。
课程设计
课程主体可分为两个部分。
第一部分:演示开发全过程,见识真正的TDD
首先,我们将从一个编码练习级别的小例子入手,展示使用TDD的方式来实现一个简单功能的开发全过程。让你眼见为实,对TDD形成一个感性、直观的认识。
并以此为引子,串联起TDD的所有相关知识点,为之后的实战练习打下基础。同时,你也会明确知道TDD作为工程方法的核心优势在哪里。如果你需要说服周围的同事、领导开始采用TDD方法,这将给你提供足够的弹药。
第二部分:实战细节全剖析,用TDD从头实现
然后,我们将进入实战项目环节。老师将以3个项目为例(IoC容器、RESTful框架、线段编辑器),展示如何使用TDD的方式从头来实现它们,实战的细节将一览无遗。
TDD有点像物理,定理写出来很简单,但需要在不同的场景下练习,才能应用得得心应手。所以,你会在这个部分看到3个实战项目,将会有40+小时的视频演示。由徐昊老师在不同的上下文中带着你反复练习,帮助你搞定TDD的落地难题。
课程目录
开篇词
- 开篇词|为什么TDD是当前最具工程效能的研发流程?
- 课前必读01|20年前的“老古董”技术,为什么还值得开个课?
- 课前必读02|程序员究竟是搞技术的,还是做工程的?
实战项目一|命令行参数解析
- 01|TDD演示(1):任务分解法与整体工作流程
- 02|TDD演示(2):识别坏味道与代码重构
- 03|TDD演示(3):按测试策略重组测试
- 04|TDD演示(4):实现对于列表参数的支持
- 05|TDD中的测试(1):状态验证为什么是主要的使用方式?
- 06|TDD中的测试(2):行为验证为什么应该尽量避免使用?
- 07|TDD中的测试(3):集成测试还是单元测试?
- 08|TDD中的驱动(1):驱动的极限是什么?
- 09|TDD中的驱动(2):重构发挥了什么作用?
- 10|TDD中的驱动(3):何为经典学派?何为伦敦学派?
- 11|作为工程化方法的TDD:更低的成本与更高的效能
实战项目二|RESTful开发框架:依赖注入容器
- 12|实战中的TDD:RESTful API的开发框架
- 13 |DI Container(1):如何实现基本的DI容器结构?
- 14|DI Container(2):如何通过Sad Path为容器增加功能?
- 15|DI Container(3):如何重构已有的代码?
- 16|DI Container(4):如何实现对循环依赖的处理?
- 17|DI Container(5):API接口该怎么设计?
- 18|DI Container(6):如何实现循环依赖的检查?
- 19|DI Container(7):如何实现Field Injection部分的功能?
- 20|DI Container(8):如何实现Method Injection部分的功能?
- 21|DI Container(9):怎样重构测试代码?
- 22|DI Container(10):怎样将大粒度的测试重构为等效的小粒度测试代码?
- 23|DI Container(11):如何对ContainerTest进行文档化改造?
- 24|DI Container(12):如何增补功能?
- 25|DI Container(13):任务上的遗漏该怎么处理?
- 26|DI Container(14):如何重构对Type类型判断的逻辑?
- 27|DI Container(15):如何封装类型判断逻辑?
- 28|DI Container(16):行为封装会对测试产生什么影响?
- 29|DI Container(17):如何重构ContextConfig内部的实现?
- 30|DI Container(18):如何增补依赖缺失和循环依赖的测试?
- 31|DI Container(19):Qualifier部分的功能要如何完成?
- 32|DI Container(20):如何对代码和测试进行重构?
- 33|DI Container(21):如何处理Singleton生命周期部分的功能?
- 34|DI Container(22):如何对Bind的逻辑进行重构?
- 35|DI Container(23):项目回顾与总结
TDD首发·代码评点
- 代码评点01|不同语言TDD的节奏有何不同?
- 代码评点02|什么是合适TDD的语言和IDE?
实战项目三|RESTful Web Services
- 36|实战中的TDD:RESTful Web Services
- 37|RESTful Web Services(1):明确架构愿景与架构组件间的交互
- 38|RESTful Web Services(2):根据Spike的结果,要如何调整架构愿景?
- 39|RESTful Web Services(3):明确架构愿景与调用栈顺序
- 40|RESTful Web Services(4):在当前架构愿景下,要如何分解任务?
- 41|RESTful Web Services(5):如何通过对数据测试的管理来凸显意图?
- 42|RESTful Web Services(6):如何处理JAX-RS定义的异常类?
- 43|RESTful Web Services(7):剩下两个Sad Path场景该如何处理?
- 44|RESTful Web Services(8):如何在现有代码的基础上构造测试?
- 45|RESTful Web Services(9):通过伦敦学派得到的测试风格是什么样的?
- 46|RESTful Web Services(10):伦敦学派与经典学派的测试节奏有何不同?
- 47|RESTful Web Services(11):如何通过Spike来验证架构愿景?
- 48|RESTful Web Services(12):如何调整接口和架构愿景?
- 49|RESTful Web Service(13):如何Spike Sub-Resource Locator?
- 50|RESTful Web Services(14):分解任务与Setup测试
- 51|RESTful Web Services(15):为什么选择在第一个测试之后就开始重构?
- 52|RESTful Web Services(16):重构手法之设计方法名的名称
- 53|RESTful Web Services(17):如何进行Spike的架构愿景细化?
- 54|RESTful Web Services(18):如何实现UriTemplate的主要功能?
- 55|RESTful Web Services(19):如何更有效地构造测试数据?
- 56|RESTful Web Services(20):为什么要通过测试的方法来驱动出代码结构?
- 57|RESTful Web Services(21):按照三角法,该如何增加新的测试案例?
- 58|RESTful Web Services(22):重构还是继续完成功能?
- 59|RESTful Web Services(23):如何构造测试数据?
- 60|RESTful Web Services(24):RootResource的测试要如何改造?
- 61 |RESTful Web Services(25):如何重构DefaultResourceRouter中的Result结构?
- 62|RESTful Web Services(26):如何继续划分ResourceLocator的任务?
- 63|RESTful Web Services(27):如何通过重构修改接口?
- 64|RESTful Web Services(28):如何重构Resource、SubResource等接口与实现?
- 67|RESTful Web Services(31):对于option的测试策略应该是怎样的?
- 68|RESTful Web Services(32):目前代码中的一个重大Bug是什么?
- 69|RESTful Web Services(33):如何拆分对于injection部分的需求?
- 65|RESTful Web Services(29):后续任务将要如何划分与实现?
- 66|RESTful Web Services(30):什么情况下应该使用行为验证?
- 70|RESTful Web Services(34):在当前代码结构下,要如何进行重构?
- 72|RESTful Web Services(36):在现有结构下,如何支持转换构造函数?
- 73|RESTful Web Services(37):再增加converter方法时,步骤有什么不同?
- 71|RESTful Web Services(35):如何将测试改为动态测试?
- 74|RESTful Web Services(38):如何提取方法调用部分?
- 75|RESTful Web Services(39):如何使用继承的方式来复用测试?
- 76|RESTful Web Services(40):如何开展有效的集成测试?
- 77|RESTful Web Services(41):对于资源的访问,我们需要补充哪些相关功能?
- 78|RESTful Web Services(42):项目总结与回顾
- 用户故事01|aoe:如果把《重构》这本书拍成电视剧
实战项目四|线段编辑器
- 79|线段编辑器:架构思路与任务拆分
- 80|Line Editor (2):如何重构生成与更新锚点控制点的逻辑?
结束语
- 期末测试|赴一场100分之约!
- 81|结束语:掌握TDD的那天,我才成为了可靠高效的职业程序员