极客时间 徐昊 · TDD 项目实战 70 讲(49讲)

资源简介

提起 TDD,肯定会掀起一番互为对立的讨论。会 TDD 的人连声称赞叫好,认为 TDD 显著提高了编码效率,让自己工作起来更有安全感。而没实践过 TDD 的人,还在困惑这是不是天方夜谭,因为没法想象为什么需要这样的方式来开发:

  1. 为什么要开发人员来写测试?难道开发人员写了测试,测试人员就不用再测了嘛?
  2. 又要写测试,又要写生产代码,效率是不是太低了?
  3. 不写测试我也能写出可以工作的软件,那么写测试能给我带来什么好处呢?

然而 TDD 并不是关于“怎么写测试”“怎么消除测试人员”“怎么让开发人员多干一份活”的编码技巧。它是以测试为里程碑点的工程化研发过程。同时将软件流程中无时无处不在的低效测试手段,用可重复的、高效的自动化测试来代替,从而获得更高的工程效能。

这才是隐藏在 TDD 工程实践背后的核心逻辑。

TDD 作为敏捷开发的重要基石,就像脚手架,为代码提供保护网。它的核心在于严格规定开发节奏,一次把需求理清,一次做对、消除返工,不用调试就能获得反馈。它最直接的收益,就是帮助你提高开发功能的效能。而最后节省出的时间,也将远远大于编写测试代码而产生的工作时间总和。

不过,学习 TDD 肯定需要花费一番力气,很多信服于 TDD 理念而自发实践的人也会被各种问题所困扰。而最佳的学习路径,就是跟一个真正会 TDD 的程序员一起写代码

为此,我们特别邀请了 Thoughtworks 中国区 CTO 徐昊老师,来帮你搞定 TDD 的落地难题。他作为国内第一批 TDD 的践行者,是国内目前为数不多的熟练掌握 TDD 技能的大师级程序员。

他会先演示一个简单的例子,让你眼见为实,对 TDD 形成一个感性、直观的认识。同时,他也会对 TDD 抽丝剥茧,消除你对单元测试的疑惑,帮你认识到 TDD 中测试的实质与全貌。接下来的重点是,他会带着你在复杂场景下进行实战项目的练习,帮你吃透 TDD 实战中的细节。

需要特别说明的是,为了帮助你最大化学习效果,我们的内容交付形式会是这样的:以视频展示为主,以图文讲解为辅。其中每节课 20+ 分钟的视频,老师会手把手带你编写测试、驱动开发。

在课程更新的过程中,我们还会开启“线上带练”的学习项目,由徐昊老师亲自带队,手把手教你怎么在实战中练习 TDD。

《极客时间 徐昊 · TDD 项目实战 70 讲(49讲)》

资源目录

——/计算机教程/02极客时间/001-极客时间合集(更新至2022年8月10日)-shikey.com/249-100109401-专栏课-徐昊 · TDD 项目实战 70 讲(49讲)/
├──00-pdf  
|   ├──01丨TDD演示(1):任务分解法与整体工作流程.pdf  18.18M
|   ├──02丨TDD演示(2):识别坏味道与代码重构.pdf  12.08M
|   ├──03丨TDD演示(3):按测试策略重组测试.pdf  13.17M
|   ├──04丨TDD演示(4):实现对于列表参数的支持.pdf  14.58M
|   ├──05丨TDD中的测试(1):状态验证为什么是主要的使用方式?.pdf  12.19M
|   ├──06丨TDD中的测试(2):行为验证为什么应该尽量避免使用?.pdf  15.94M
|   ├──07丨TDD中的测试(3):集成测试还是单元测试?.pdf  10.33M
|   ├──08丨TDD中的驱动(1):驱动的极限是什么?.pdf  9.12M
|   ├──09丨TDD中的驱动(2):重构发挥了什么作用?.pdf  11.34M
|   ├──10丨TDD中的驱动(3):何为经典学派?何为伦敦学派?.pdf  7.77M
|   ├──11丨作为工程化方法的TDD:更低的成本与更高的效能.pdf  12.93M
|   ├──12丨实战中的TDD:RESTfulAPI的开发框架.pdf  8.88M
|   ├──13丨DIContainer(1):如何实现基本的DI容器结构?.pdf  10.10M
|   ├──14丨DIContainer(2):如何通过SadPath为容器增加功能?.pdf  11.52M
|   ├──15丨DIContainer(3):如何重构已有的代码?.pdf  11.86M
|   ├──16丨DIContainer(4):如何实现对循环依赖的处理?.pdf  9.08M
|   ├──17丨DIContainer(5):API接口该怎么设计?.pdf  8.09M
|   ├──18丨DIContainer(6):如何实现循环依赖的检查?.pdf  11.63M
|   ├──19丨DIContainer(7):如何实现FieldInjection部分的功能?.pdf  9.04M
|   ├──20丨DIContainer(8):如何实现MethodInjection部分的功能?.pdf  9.09M
|   ├──21丨DIContainer(9):怎样重构测试代码?.pdf  9.23M
|   ├──22丨DIContainer(10):怎样将大粒度的测试重构为等效的小粒度测试代码?.pdf  8.14M
|   ├──23丨DIContainer(11):如何对ContainerTest进行文档化改造?.pdf  8.55M
|   ├──24丨DIContainer(12):如何增补功能?.pdf  8.30M
|   ├──25丨DIContainer(13):任务上的遗漏该怎么处理?.pdf  8.22M
|   ├──26丨DIContainer(14):如何重构对Type类型判断的逻辑?.pdf  9.67M
|   ├──27丨DIContainer(15):如何封装类型判断逻辑?.pdf  9.01M
|   ├──28丨DIContainer(16):行为封装会对测试产生什么影响?.pdf  8.99M
|   ├──29丨DIContainer(17):如何重构ContextConfig内部的实现?.PDF  8.67M
|   ├──30丨DIContainer(18):如何增补依赖缺失和循环依赖的测试?.PDF  8.88M
|   ├──31丨DIContainer(19):Qualifier部分的功能要如何完成?.PDF  9.48M
|   ├──32丨DIContainer(20):如何对代码和测试进行重构?.PDF  9.19M
|   ├──33丨DIContainer(21):如何处理Singleton生命周期部分的功能?.PDF  9.39M
|   ├──34丨DIContainer(22):如何对Bind的逻辑进行重构?.PDF  9.11M
|   ├──35丨DIContainer(23):项目回顾与总结.pdf  11.03M
|   ├──36丨实战中的TDD:RESTfulWebServices.pdf  7.92M
|   ├──37丨RESTfulWebServices(1):明确架构愿景与架构组件间的交互.pdf  10.12M
|   ├──38丨RESTfulWebServices(2):根据Spike的结果,要如何调整架构愿景?.pdf  8.22M
|   ├──39丨RESTfulWebServices(3):明确架构愿景与调用栈顺序.pdf  9.03M
|   ├──40丨RESTfulWebServices(4):在当前架构愿景下,要如何分解任务?.pdf  10.69M
|   ├──41丨RESTfulWebServices(5):如何通过对数据测试的管理来凸显意图?.pdf  9.77M
|   ├──42丨RESTfulWebServices(6):如何处理JAX-RS定义的异常类?.pdf  9.52M
|   ├──43丨RESTfulWebServices(7):剩下两个SadPath场景该如何处理?.pdf  9.58M
|   ├──44丨RESTfulWebServices(8):如何在现有代码的基础上构造测试?.pdf  9.33M
|   ├──45丨RESTfulWebServices(9):通过伦敦学派得到的测试风格是什么样的?.pdf  9.43M
|   ├──46丨RESTfulWebServices(10):伦敦学派与经典学派的测试节奏有何不同?.pdf  10.17M
|   ├──47丨RESTfulWebServices(11):如何通过Spike来验证架构愿景?.pdf  7.52M
|   ├──48丨RESTfulWebServices(12):如何调整接口和架构愿景?.pdf  7.85M
|   ├──49丨RESTfulWebService(13):如何SpikeSub-ResourceLocator?.pdf  7.74M
|   ├──代码评点01丨不同语言TDD的节奏有何不同?.pdf  9.94M
|   ├──代码评点02丨什么是合适TDD的语言和IDE?.pdf  8.42M
|   ├──开篇词丨为什么TDD是当前最具工程效能的研发流程?.pdf  16.14M
|   └──课前必读丨20年前的“老古董”技术,为什么还值得开个课?.pdf  9.98M
├──01-开篇词  
|   ├──开篇词丨为什么TDD是当前最具工程效能的研发流程?.html  11.36M
|   ├──开篇词丨为什么TDD是当前最具工程效能的研发流程?.m4a  8.73M
|   ├──课前必读丨20年前的“老古董”技术,为什么还值得开个课?.html  2.55M
|   └──课前必读丨20年前的“老古董”技术,为什么还值得开个课?.m4a  7.15M
├──02-实战项目一:命令行参数解析  
|   ├──01丨TDD演示(1):任务分解法与整体工作流程.html  12.45M
|   ├──01丨TDD演示(1):任务分解法与整体工作流程.m4a  4.60M
|   ├──02丨TDD演示(2):识别坏味道与代码重构.html  6.31M
|   ├──02丨TDD演示(2):识别坏味道与代码重构.m4a  3.80M
|   ├──03丨TDD演示(3):按测试策略重组测试.html  10.09M
|   ├──03丨TDD演示(3):按测试策略重组测试.m4a  4.74M
|   ├──03丨TDD演示(3):按测试策略重组测试.mp4  18.29M
|   ├──04丨TDD演示(4):实现对于列表参数的支持(2).mp4  21.45M
|   ├──04丨TDD演示(4):实现对于列表参数的支持.html  8.94M
|   ├──04丨TDD演示(4):实现对于列表参数的支持.m4a  5.21M
|   ├──04丨TDD演示(4):实现对于列表参数的支持.mp4  14.32M
|   ├──05丨TDD中的测试(1):状态验证为什么是主要的使用方式?(2).mp4  11.37M
|   ├──05丨TDD中的测试(1):状态验证为什么是主要的使用方式?.html  9.75M
|   ├──05丨TDD中的测试(1):状态验证为什么是主要的使用方式?.m4a  5.66M
|   ├──05丨TDD中的测试(1):状态验证为什么是主要的使用方式?.mp4  22.15M
|   ├──06丨TDD中的测试(2):行为验证为什么应该尽量避免使用?(2).mp4  7.81M
|   ├──06丨TDD中的测试(2):行为验证为什么应该尽量避免使用?(3).mp4  7.93M
|   ├──06丨TDD中的测试(2):行为验证为什么应该尽量避免使用?.html  1.67M
|   ├──06丨TDD中的测试(2):行为验证为什么应该尽量避免使用?.m4a  6.96M
|   ├──06丨TDD中的测试(2):行为验证为什么应该尽量避免使用?.mp4  15.28M
|   ├──07丨TDD中的测试(3):集成测试还是单元测试?.html  2.58M
|   ├──07丨TDD中的测试(3):集成测试还是单元测试?.m4a  6.08M
|   ├──07丨TDD中的测试(3):集成测试还是单元测试?.mp4  39.94M
|   ├──08丨TDD中的驱动(1):驱动的极限是什么?(2).mp4  13.77M
|   ├──08丨TDD中的驱动(1):驱动的极限是什么?(3).mp4  19.10M
|   ├──08丨TDD中的驱动(1):驱动的极限是什么?.html  4.01M
|   ├──08丨TDD中的驱动(1):驱动的极限是什么?.m4a  5.27M
|   ├──08丨TDD中的驱动(1):驱动的极限是什么?.mp4  8.74M
|   ├──09丨TDD中的驱动(2):重构发挥了什么作用?.html  5.58M
|   ├──09丨TDD中的驱动(2):重构发挥了什么作用?.m4a  4.48M
|   ├──09丨TDD中的驱动(2):重构发挥了什么作用?.mp4  10.74M
|   ├──10丨TDD中的驱动(3):何为经典学派?何为伦敦学派?(2).mp4  27.70M
|   ├──10丨TDD中的驱动(3):何为经典学派?何为伦敦学派?.html  1.78M
|   ├──10丨TDD中的驱动(3):何为经典学派?何为伦敦学派?.m4a  3.98M
|   ├──10丨TDD中的驱动(3):何为经典学派?何为伦敦学派?.mp4  7.86M
|   ├──11丨作为工程化方法的TDD:更低的成本与更高的效能.html  7.29M
|   └──11丨作为工程化方法的TDD:更低的成本与更高的效能.m4a  6.54M
├──03-TDD首发·代码评点  
|   ├──代码评点01丨不同语言TDD的节奏有何不同?(2).mp4  7.34M
|   ├──代码评点01丨不同语言TDD的节奏有何不同?.html  2.70M
|   ├──代码评点01丨不同语言TDD的节奏有何不同?.m4a  917.88kb
|   ├──代码评点01丨不同语言TDD的节奏有何不同?.mp4  11.19M
|   ├──代码评点02丨什么是合适TDD的语言和IDE?.html  1.37M
|   ├──代码评点02丨什么是合适TDD的语言和IDE?.m4a  1.03M
|   └──代码评点02丨什么是合适TDD的语言和IDE?.mp4  22.45M
├──04-实战项目二丨RESTful开发框架:依赖注入容器  
|   ├──28丨DIContainer(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丨DIContainer(23):项目回顾与总结  
|   ├──12丨实战中的TDD:RESTfulAPI的开发框架(2).mp4  58.42M
|   ├──12丨实战中的TDD:RESTfulAPI的开发框架.html  2.23M
|   ├──12丨实战中的TDD:RESTfulAPI的开发框架.m4a  2.05M
|   ├──12丨实战中的TDD:RESTfulAPI的开发框架.mp4  12.53M
|   ├──13丨DIContainer(1):如何实现基本的DI容器结构?.html  3.63M
|   ├──13丨DIContainer(1):如何实现基本的DI容器结构?.m4a  1.64M
|   ├──13丨DIContainer(1):如何实现基本的DI容器结构?.mp4  46.50M
|   ├──14丨DIContainer(2):如何通过SadPath为容器增加功能?(2).mp4  43.18M
|   ├──14丨DIContainer(2):如何通过SadPath为容器增加功能?.html  4.57M
|   ├──14丨DIContainer(2):如何通过SadPath为容器增加功能?.m4a  888.16kb
|   ├──14丨DIContainer(2):如何通过SadPath为容器增加功能?.mp4  30.20M
|   ├──15丨DIContainer(3):如何重构已有的代码?.html  3.65M
|   ├──15丨DIContainer(3):如何重构已有的代码?.m4a  993.17kb
|   ├──15丨DIContainer(3):如何重构已有的代码?.mp4  15.20M
|   ├──16丨DIContainer(4):如何实现对循环依赖的处理?.html  4.18M
|   ├──16丨DIContainer(4):如何实现对循环依赖的处理?.m4a  1.45M
|   ├──16丨DIContainer(4):如何实现对循环依赖的处理?.mp4  88.78M
|   ├──17丨DIContainer(5):API接口该怎么设计?.html  3.35M
|   ├──17丨DIContainer(5):API接口该怎么设计?.m4a  1.22M
|   ├──17丨DIContainer(5):API接口该怎么设计?.mp4  64.15M
|   ├──18丨DIContainer(6):如何实现循环依赖的检查?.html  3.72M
|   ├──18丨DIContainer(6):如何实现循环依赖的检查?.m4a  1.48M
|   ├──18丨DIContainer(6):如何实现循环依赖的检查?.mp4  63.55M
|   ├──19丨DIContainer(7):如何实现FieldInjection部分的功能?.html  2.39M
|   ├──19丨DIContainer(7):如何实现FieldInjection部分的功能?.m4a  1.02M
|   ├──19丨DIContainer(7):如何实现FieldInjection部分的功能?.mp4  75.61M
|   ├──20丨DIContainer(8):如何实现MethodInjection部分的功能?.html  2.23M
|   ├──20丨DIContainer(8):如何实现MethodInjection部分的功能?.m4a  650.07kb
|   ├──20丨DIContainer(8):如何实现MethodInjection部分的功能?.mp4  85.71M
|   ├──21丨DIContainer(9):怎样重构测试代码?.html  2.50M
|   ├──21丨DIContainer(9):怎样重构测试代码?.m4a  1.14M
|   ├──21丨DIContainer(9):怎样重构测试代码?.mp4  108.64M
|   ├──22丨DIContainer(10):怎样将大粒度的测试重构为等效的小粒度测试代码?.html  1.70M
|   ├──22丨DIContainer(10):怎样将大粒度的测试重构为等效的小粒度测试代码?.m4a  1.00M
|   ├──22丨DIContainer(10):怎样将大粒度的测试重构为等效的小粒度测试代码?.mp4  92.54M
|   ├──23丨DI Container(11):如何对ContainerTest进行文档化改造?.mp4  114.14M
|   ├──23丨DIContainer(11):如何对ContainerTest进行文档化改造?.html  1.79M
|   ├──23丨DIContainer(11):如何对ContainerTest进行文档化改造?.m4a  878.34kb
|   ├──24丨DI Container(12):如何增补功能?.mp4  88.13M
|   ├──24丨DIContainer(12):如何增补功能?.html  1.78M
|   ├──24丨DIContainer(12):如何增补功能?.m4a  1.10M
|   ├──25丨DI Container(13):任务上的遗漏该怎么处理?.mp4  88.48M
|   ├──25丨DIContainer(13):任务上的遗漏该怎么处理?.html  2.03M
|   ├──25丨DIContainer(13):任务上的遗漏该怎么处理?.m4a  741.40kb
|   ├──26丨DI Container(14):如何重构对Type类型判断的逻辑?.mp4  78.32M
|   ├──26丨DIContainer(14):如何重构对Type类型判断的逻辑?.html  2.58M
|   ├──26丨DIContainer(14):如何重构对Type类型判断的逻辑?.m4a  1.04M
|   ├──27丨DI Container(15):如何封装类型判断逻辑?.mp4  120.11M
|   ├──27丨DIContainer(15):如何封装类型判断逻辑?.html  2.38M
|   └──27丨DIContainer(15):如何封装类型判断逻辑?.m4a  879.16kb
└──05-实战项目三|RESTfulWebServices  
|   ├──36丨实战中的TDD:RESTfulWebServices  
|   ├──37丨RESTfulWebServices(1):明确架构愿景与架构组件间的交互  
|   ├──38丨RESTfulWebServices(2):根据Spike的结果,要如何调整架构愿景?  
|   ├──39丨RESTfulWebServices(3):明确架构愿景与调用栈顺序  
|   ├──40丨RESTfulWebServices(4):在当前架构愿景下,要如何分解任务?  
|   ├──41丨RESTfulWebServices(5):如何通过对数据测试的管理来凸显意图?  
|   ├──42丨RESTfulWebServices(6):如何处理JAX-RS定义的异常类?  
|   ├──43丨RESTfulWebServices(7):剩下两个SadPath场景该如何处理?  
|   ├──44丨RESTfulWebServices(8):如何在现有代码的基础上构造测试?  
|   ├──45丨RESTfulWebServices(9):通过伦敦学派得到的测试风格是什么样的?  
|   ├──46丨RESTfulWebServices(10):伦敦学派与经典学派的测试节奏有何不同?  
|   ├──47丨RESTfulWebServices(11):如何通过Spike来验证架构愿景?  
|   ├──48丨RESTfulWebServices(12):如何调整接口和架构愿景?  
|   └──49丨RESTfulWebService(13):如何SpikeSub-ResourceLocator?  

资源下载

抱歉,只有登录并在本文发表评论才能阅读隐藏内容,切记不要恶意刷评论白嫖资源,评论前切记阅读用户规则,一旦进入黑名单,不可能再放出来。同时注意,暂停在线支付,请联系客服QQ267286513。
  1. Cydeer说道:

    TDD DDD,都来了

  2. jeffcheng1222说道:

    tdd学习学习一下1

  3. sailfishcc说道:

    学习下TDD

  4. td说道:

    学习一下

  5. applebeer说道:

    谢谢,学习了,哈哈

  6. 天涯明月说道:

    学学tdd到底咋做

  7. 3d_ghost说道:

    学习一下

  8. james说道:

    这个教程不错

  9. ntrickss说道:

    学习TDD的开发方式

  10. comeoncetime说道:

    感谢分享,学习一下

  11. 腾飞的大象说道:

    最近在学习TDD

  12. cwj3000说道:

    这个教程不错

  13. 月下黑说道:

    学习学习,更新完了吗

  14. Kea说道:

    这是好东西啊

  15. 漂泊者及其影子说道:

    tdd学习学习一下1

  16. 火爆说道:

    学习TDD

  17. son66sun说道:

    感谢

  18. yeah说道:

    谢谢分享

  19. huangliang1203说道:

    了解什么是TDD

    1. 贼秃驴说道:

      我服了

  20. leaf说道:

    了解什么是TDD

  21. benstiller说道:

    看看TDD :lol:

  22. Kirakilla说道:

    了解什么是TDD :redface:

  23. Weapon说道:

    发现自己的编码风格和水平很不成熟,了解下TDD看下有没有帮助

  24. kully说道:

    了解什么是TDD

  25. suibian123说道:

    谢谢分享

  26. 胡小硕说道:

    学习研发流程

  27. yohehe说道:

    学习学习

  28. chenrun说道:

    学习以下

  29. ronga说道:

    :razz: 下来学习学习

  30. qingboy说道:

    谢谢分享,test drive develop

  31. tonna说道:

    感谢分享

  32. Tony老师说道:

    了解什么是TDD

  33. 季夏三月说道:

    了解什么是TDD

    :lol: :lol:

  34. marcus说道:

    学习一下

  35. HovikHan说道:

    学习下tdd

  36. mili说道:

    学习下tdd

  37. mjiansun说道:

    为什么我的评论总是消失呢

  38. 章旭同学说道:

    学习学习吧

  39. aceleung说道:

    最近正好在尝试TDD的开发方式

  40. mjiansun说道:

    了解什么是TDD

发表回复