
极客时间 - TDD 项目实战 70 讲 | 更新
来自 极客时间·免费领取学习资源
这份资料来自极客时间2026年的付费VIP课,内容以资料为主,对应《极客时间 - TDD 项目实战 70 讲 | 更新》。官网需要单独购买,有集上可以免费领取。
资源介绍:
课程主体可分为两个部分
- 第一部分:演示开发全过程,见识真正的 TDD
首先,我们将从一个编码练习级别的小例子入手,展示使用 TDD 的方式来实现一个简单功能的开发全过程。让你眼见为实,对 TDD 形成一个感性、直观的认识
并以此为引子,串联起 TDD 的所有相关知识点,为之后的实战练习打下基础。同时,你也会明确知道 TDD 作为工程方法的核心优势在哪里。如果你需要说服周围的同事、领导开始采用 TDD 方法,这将给你提供足够的弹药
- 第二部分:实战细节全剖析,用 TDD 从头实现
然后,我们将进入实战项目环节。老师将以 3 个技术框架为例(IoC 容器、RESTful 框架、SQL mapper 框架),展示如何使用 TDD 的方式从头来实现它们,实战的细节将一览无遗
TDD 有点像物理,定理写出来很简单,但需要在不同的场景下练习,才能应用得得心应手。所以,你会在这个部分看到 3 个实战项目,将会有 40+ 小时的视频演示。由徐昊老师在不同的上下文中带着你反复练习,帮助你搞定 TDD 的落地难题
课程目录
- – ├──01|TDD演示(1):任务分解法与整体工作流程.md 6.23kb
- – ├──01|TDD演示(1):任务分解法与整体工作流程
- – ├──02|TDD演示(2):识别坏味道与代码重构.md 7.54kb
- – ├──02|TDD演示(2):识别坏味道与代码重构
- – ├──03|TDD演示(3):按测试策略重组测试.md 6.99kb
- – ├──03|TDD演示(3):按测试策略重组测试
- – ├──04|TDD演示(4):实现对于列表参数的支持.md 6.57kb
- – ├──04|TDD演示(4):实现对于列表参数的支持
- – ├──05|TDD中的测试(1):状态验证为什么是主要的使用方式?.md 6.58kb
- – ├──05|TDD中的测试(1):状态验证为什么是主要的使用方式?
- – ├──06|TDD中的测试(2):行为验证为什么应该尽量避免使用?.md 7.42kb
- – ├──06|TDD中的测试(2):行为验证为什么应该尽量避免使用?
- – ├──07|TDD中的测试(3):集成测试还是单元测试?.md 8.17kb
- – ├──07|TDD中的测试(3):集成测试还是单元测试?
- – ├──08|TDD中的驱动(1):驱动的极限是什么?.md 7.96kb
- – ├──08|TDD中的驱动(1):驱动的极限是什么?
- – ├──09|TDD中的驱动(2):重构发挥了什么作用?.md 6.19kb
- – ├──09|TDD中的驱动(2):重构发挥了什么作用?
- – ├──10|TDD中的驱动(3):何为经典学派?何为伦敦学派?.md 6.06kb
- – ├──10|TDD中的驱动(3):何为经典学派?何为伦敦学派?
- – ├──11|作为工程化方法的TDD:更低的成本与更高的效能.md 9.80kb
- – ├──11|作为工程化方法的TDD:更低的成本与更高的效能
- – ├──12|实战中的TDD:RESTfulAPI的开发框架.md 3.09kb
- – ├──12|实战中的TDD:RESTfulAPI的开发框架
- – ├──13|DIContainer(1):如何实现基本的DI容器结构?.md 4.46kb
- – ├──13|DIContainer(1):如何实现基本的DI容器结构?
- – ├──14|DIContainer(2):如何通过SadPath为容器增加功能?.md 3.36kb
- – ├──14|DIContainer(2):如何通过SadPath为容器增加功能?
- – ├──15|DIContainer(3):如何重构已有的代码?.md 4.67kb
- – ├──15|DIContainer(3):如何重构已有的代码?
- – ├──16|DIContainer(4):如何实现对循环依赖的处理?.md 3.09kb
- – ├──16|DIContainer(4):如何实现对循环依赖的处理?
- – ├──17|DIContainer(5):API接口该怎么设计?.md 3.86kb
- – ├──17|DIContainer(5):API接口该怎么设计?
- – ├──18|DIContainer(6):如何实现循环依赖的检查?.md 5.13kb
- – ├──18|DIContainer(6):如何实现循环依赖的检查?
- – ├──19|DIContainer(7):如何实现FieldInjection部分的功能?.md 6.52kb
- – ├──19|DIContainer(7):如何实现FieldInjection部分的功能?
- – ├──20|DIContainer(8):如何实现MethodInjection部分的功能?.md 7.25kb
- – ├──20|DIContainer(8):如何实现MethodInjection部分的功能?
- – ├──21|DIContainer(9):怎样重构测试代码?.md 22.61kb
- – ├──21|DIContainer(9):怎样重构测试代码?
- – ├──22|DIContainer(10):怎样将大粒度的测试重构为等效的小粒度测试代码?.md 8.96kb
- – ├──22|DIContainer(10):怎样将大粒度的测试重构为等效的小粒度测试代码?
- – ├──23|DIContainer(11):如何对ContainerTest进行文档化改造?.md 16.12kb
- – ├──23|DIContainer(11):如何对ContainerTest进行文档化改造?
- – ├──24|DIContainer(12):如何增补功能?.md 9.13kb
- – ├──24|DIContainer(12):如何增补功能?
- – ├──25|DIContainer(13):任务上的遗漏该怎么处理?.md 9.92kb
- – ├──25|DIContainer(13):任务上的遗漏该怎么处理?
- – ├──26|DIContainer(14):如何重构对Type类型判断的逻辑?.md 11.83kb
- – ├──26|DIContainer(14):如何重构对Type类型判断的逻辑?
- – ├──27|DIContainer(15):如何封装类型判断逻辑?.md 11.49kb
- – ├──27|DIContainer(15):如何封装类型判断逻辑?
- – ├──28|DIContainer(16):行为封装会对测试产生什么影响?.md 11.72kb
- – ├──28|DIContainer(16):行为封装会对测试产生什么影响?
- – ├──29|DIContainer(17):如何重构ContextConfig内部的实现?.md 14.31kb
- – ├──29|DIContainer(17):如何重构ContextConfig内部的实现?
- – ├──30|DIContainer(18):如何增补依赖缺失和循环依赖的测试?.md 14.61kb
- – ├──30|DIContainer(18):如何增补依赖缺失和循环依赖的测试?
- – ├──31|DIContainer(19):Qualifier部分的功能要如何完成?.md 15.17kb
- – ├──31|DIContainer(19):Qualifier部分的功能要如何完成?
- – ├──32|DIContainer(20):如何对代码和测试进行重构?.md 15.95kb
- – ├──32|DIContainer(20):如何对代码和测试进行重构?
- – ├──33|DIContainer(21):如何处理Singleton生命周期部分的功能?.md 16.21kb
- – ├──33|DIContainer(21):如何处理Singleton生命周期部分的功能?
- – ├──34|DIContainer(22):如何对Bind的逻辑进行重构?.md 18.64kb
- – ├──34|DIContainer(22):如何对Bind的逻辑进行重构?
- – ├──35|DIContainer(23):项目回顾与总结.md 30.30kb
- – ├──35|DIContainer(23):项目回顾与总结
- – ├──36|实战中的TDD:RESTfulWebServices.md 4.10kb
- – ├──36|实战中的TDD:RESTfulWebServices
- – ├──37|RESTfulWebServices(1):明确架构愿景与架构组件间的交互.md 5.10kb
- – ├──37|RESTfulWebServices(1):明确架构愿景与架构组件间的交互
- – ├──38|RESTfulWebServices(2):根据Spike的结果,要如何调整架构愿景?.md 2.44kb
- – ├──38|RESTfulWebServices(2):根据Spike的结果,要如何调整架构愿景?
- – ├──39|RESTfulWebServices(3):明确架构愿景与调用栈顺序.md 3.07kb
- – ├──39|RESTfulWebServices(3):明确架构愿景与调用栈顺序
- – ├──40|RESTfulWebServices(4):在当前架构愿景下,要如何分解任务?.md 7.30kb
- – ├──40|RESTfulWebServices(4):在当前架构愿景下,要如何分解任务?
- – ├──41|RESTfulWebServices(5):如何通过对数据测试的管理来凸显意图?.md 3.25kb
- – ├──41|RESTfulWebServices(5):如何通过对数据测试的管理来凸显意图?
- – ├──42|RESTfulWebServices(6):如何处理JAX-RS定义的异常类?.md 3.69kb
- – ├──42|RESTfulWebServices(6):如何处理JAX-RS定义的异常类?
- – ├──43|RESTfulWebServices(7):剩下两个SadPath场景该如何处理?.md 4.11kb
- – ├──43|RESTfulWebServices(7):剩下两个SadPath场景该如何处理?
- – ├──44|RESTfulWebServices(8):如何在现有代码的基础上构造测试?.md 5.04kb
- – ├──44|RESTfulWebServices(8):如何在现有代码的基础上构造测试?
- – ├──45|RESTfulWebServices(9):通过伦敦学派得到的测试风格是什么样的?.md 18.19kb
- – ├──45|RESTfulWebServices(9):通过伦敦学派得到的测试风格是什么样的?
- – ├──46|RESTfulWebServices(10):伦敦学派与经典学派的测试节奏有何不同?.md 8.82kb
- – ├──46|RESTfulWebServices(10):伦敦学派与经典学派的测试节奏有何不同?
- – ├──47|RESTfulWebServices(11):如何通过Spike来验证架构愿景?.md 2.26kb
- – ├──47|RESTfulWebServices(11):如何通过Spike来验证架构愿景?
- – ├──48|RESTfulWebServices(12):如何调整接口和架构愿景?.md 1.72kb
- – ├──48|RESTfulWebServices(12):如何调整接口和架构愿景?
- – ├──49|RESTfulWebService(13):如何SpikeSub-ResourceLocator?.md 1.69kb
- – ├──49|RESTfulWebService(13):如何SpikeSub-ResourceLocator?
- – ├──50|RESTfulWebServices(14):分解任务与Setup测试.md 2.85kb
- – ├──50|RESTfulWebServices(14):分解任务与Setup测试
- – ├──51|RESTfulWebServices(15):为什么选择在第一个测试之后就开始重构?.md 2.28kb
- – ├──51|RESTfulWebServices(15):为什么选择在第一个测试之后就开始重构?
- – ├──52|RESTfulWebServices(16):重构手法之设计方法名的名称.md 2.44kb
- – ├──52|RESTfulWebServices(16):重构手法之设计方法名的名称
- – ├──53|RESTfulWebServices(17):如何进行Spike的架构愿景细化?.md 2.42kb
- – ├──53|RESTfulWebServices(17):如何进行Spike的架构愿景细化?
- – ├──54|RESTfulWebServices(18):如何实现UriTemplate的主要功能?.md 2.62kb
- – ├──54|RESTfulWebServices(18):如何实现UriTemplate的主要功能?
- – ├──55|RESTfulWebServices(19):如何更有效地构造测试数据?.md 3.95kb
- – ├──55|RESTfulWebServices(19):如何更有效地构造测试数据?
- – ├──56|RESTfulWebServices(20):为什么要通过测试的方法来驱动出代码结构?.md 2.12kb
- – ├──56|RESTfulWebServices(20):为什么要通过测试的方法来驱动出代码结构?
- – ├──57|RESTfulWebServices(21):按照三角法,该如何增加新的测试案例?.md 3.18kb
- – ├──57|RESTfulWebServices(21):按照三角法,该如何增加新的测试案例?
- – ├──58|RESTfulWebServices(22):重构还是继续完成功能?.md 4.09kb
- – ├──58|RESTfulWebServices(22):重构还是继续完成功能?
- – ├──59|RESTfulWebServices(23):如何构造测试数据?.md 4.34kb
- – ├──59|RESTfulWebServices(23):如何构造测试数据?
- – ├──60|RESTfulWebServices(24):RootResource的测试要如何改造?.md 5.40kb
- – ├──60|RESTfulWebServices(24):RootResource的测试要如何改造?
- – ├──61|RESTfulWebServices(25):如何重构DefaultResourceRouter中的Result结构?.md 9.84kb
- – ├──61|RESTfulWebServices(25):如何重构DefaultResourceRouter中的Result结构?
- – ├──62|RESTfulWebServices(26):如何继续划分ResourceLocator的任务?.md 8.27kb
- – ├──62|RESTfulWebServices(26):如何继续划分ResourceLocator的任务?
- – ├──63|RESTfulWebServices(27):如何通过重构修改接口?.md 8.88kb
- – ├──63|RESTfulWebServices(27):如何通过重构修改接口?
- – ├──64|RESTfulWebServices(28):如何重构Resource、SubResource等接口与实现?.md 10.01kb
- – ├──64|RESTfulWebServices(28):如何重构Resource、SubResource等接口与实现?
- – ├──65|RESTfulWebServices(29):后续任务将要如何划分与实现?.md 9.46kb
- – ├──65|RESTfulWebServices(29):后续任务将要如何划分与实现?
- – ├──66|RESTfulWebServices(30):什么情况下应该使用行为验证?.md 9.07kb
- – ├──66|RESTfulWebServices(30):什么情况下应该使用行为验证?
- – ├──67|RESTfulWebServices(31):对于option的测试策略应该是怎样的?.md 9.68kb
- – ├──67|RESTfulWebServices(31):对于option的测试策略应该是怎样的?
- – ├──68|RESTfulWebServices(32):目前代码中的一个重大Bug是什么?.md 10.95kb
- – ├──68|RESTfulWebServices(32):目前代码中的一个重大Bug是什么?
- – ├──69|RESTfulWebServices(33):如何拆分对于injection部分的需求?.md 11.40kb
- – ├──69|RESTfulWebServices(33):如何拆分对于injection部分的需求?
- – ├──70|RESTfulWebServices(34):在当前代码结构下,要如何进行重构?.md 12.37kb
- – ├──70|RESTfulWebServices(34):在当前代码结构下,要如何进行重构?
- – ├──71|RESTfulWebServices(35):如何将测试改为动态测试?.md 13.14kb
- – ├──71|RESTfulWebServices(35):如何将测试改为动态测试?
- – ├──72|RESTfulWebServices(36):在现有结构下,如何支持转换构造函数?.md 13.37kb
- – ├──72|RESTfulWebServices(36):在现有结构下,如何支持转换构造函数?
- – ├──73|RESTfulWebServices(37):再增加converter方法时,步骤有什么不同?.md 14.41kb
- – ├──73|RESTfulWebServices(37):再增加converter方法时,步骤有什么不同?
- – ├──74|RESTfulWebServices(38):如何提取方法调用部分?.md 15.29kb
- – ├──74|RESTfulWebServices(38):如何提取方法调用部分?
- – ├──75|RESTfulWebServices(39):如何使用继承的方式来复用测试?.md 11.18kb
- – ├──75|RESTfulWebServices(39):如何使用继承的方式来复用测试?
- – ├──76|RESTfulWebServices(40):如何开展有效的集成测试?.md 11.10kb
- – ├──76|RESTfulWebServices(40):如何开展有效的集成测试?
- – ├──77|RESTfulWebServices(41):对于资源的访问,我们需要补充哪些相关功能?.md 11.17kb
- – ├──77|RESTfulWebServices(41):对于资源的访问,我们需要补充哪些相关功能?
- – ├──78|RESTfulWebServices(42):项目总结与回顾.md 11.37kb
- – ├──78|RESTfulWebServices(42):项目总结与回顾
- – ├──79|线段编辑器:架构思路与任务拆分.md 2.18kb
- – ├──79|线段编辑器:架构思路与任务拆分
- – ├──80|LineEditor(2):如何重构生成与更新锚点控制点的逻辑?.md 2.28kb
- – ├──80|LineEditor(2):如何重构生成与更新锚点控制点的逻辑?
- – ├──81|结束语:掌握TDD的那天,我才成为了可靠高效的职业程序员.md 5.45kb
- – ├──81|结束语:掌握TDD的那天,我才成为了可靠高效的职业程序员
- – ├──代码评点01|不同语言TDD的节奏有何不同?.md 1.79kb
- – ├──代码评点01|不同语言TDD的节奏有何不同?
- – ├──代码评点02|什么是合适TDD的语言和IDE?.md 1.51kb
- – ├──代码评点02|什么是合适TDD的语言和IDE?
- – ├──开篇词|为什么TDD是当前最具工程效能的研发流程?.md 12.61kb
- – ├──开篇词|为什么TDD是当前最具工程效能的研发流程?
- – ├──课前必读01|20年前的“老古董”技术,为什么还值得开个课?.md 8.41kb
- – ├──课前必读01|20年前的“老古董”技术,为什么还值得开个课?
- – ├──课前必读02|程序员究竟是搞技术的,还是做工程的?.md 19.24kb
- – ├──课前必读02|程序员究竟是搞技术的,还是做工程的?
- – ├──期末测试|赴一场100分之约!.md 0.78kb
- – ├──期末测试|赴一场100分之约!
- – ├──用户故事01|aoe:如果把《重构》这本书拍成电视剧.md 11.53kb
- – ├──用户故事01|aoe:如果把《重构》这本书拍成电视剧
- – └──用户故事01|aoe:如果把《重构》这本书拍成电视剧
包含内容
- · – ├──01|TDD演示(1):任务分解法与整体工作流程
- · – ├──02|TDD演示(2):识别坏味道与代码重构
- · – ├──03|TDD演示(3):按测试策略重组测试
- · – ├──04|TDD演示(4):实现对于列表参数的支持
- · – ├──05|TDD中的测试(1):状态验证为什么是主要的使用方式?
- · – ├──06|TDD中的测试(2):行为验证为什么应该尽量避免使用?
- · – ├──07|TDD中的测试(3):集成测试还是单元测试?
- · – ├──08|TDD中的驱动(1):驱动的极限是什么?
贡献者
学习社区
1 人正在学习
阅读与知识交流
交流各类书籍与综合资料,分享阅读问题、笔记和延伸线索。提问时请带上资料名称。