联系

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

内容简介

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

为什么要开发人员来写测试?难道开发人员写了测试,测试人员就不用再测了嘛?

又要写测试,又要写生产代码,效率是不是太低了?

不写测试我也能写出可以工作的软件,那么写测试能给我带来什么好处呢?

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

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

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

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

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

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

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

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

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

资源目录

——/249-100109401-专栏课-徐昊 · TDD 项目实战 70 讲(67讲)/

01-开篇词

开篇词丨为什么TDD是当前最具工程效能的研发流程?

课前必读丨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:更低的成本与更高的效能

03-TDD首发·代码评点

代码评点01不同语言TDD的节奏有何不同? (1).ts 8.89M

代码评点01不同语言TDD的节奏有何不同? (2).ts 13.16M

代码评点01不同语言TDD的节奏有何不同? (3).ts 17.42M

代码评点01丨不同语言TDD的节奏有何不同?.html 2.70M

代码评点01丨不同语言TDD的节奏有何不同?.m4a 917.88kb

代码评点01丨不同语言TDD的节奏有何不同?.pdf 3.41M

代码评点02什么是合适TDD的语言和IDE? (1).ts 26.03M

代码评点02什么是合适TDD的语言和IDE? (2).ts 15.97M

代码评点02丨什么是合适TDD的语言和IDE?.html 1.37M

代码评点02丨什么是合适TDD的语言和IDE?.m4a 1.03M

代码评点02丨什么是合适TDD的语言和IDE?.pdf 1.90M

04-实战项目二丨RESTful开发框架:依赖注入容器

12丨实战中的TDD:RESTfulAPI的开发框架

13丨DIContainer(1):如何实现基本的DI容器结构?

14丨DIContainer(2):如何通过SadPath为容器增加功能?

15丨DIContainer(3):如何重构已有的代码?

16丨DIContainer(4):如何实现对循环依赖的处理?

17丨DIContainer(5):API接口该怎么设计?

18丨DIContainer(6):如何实现循环依赖的检查?

19丨DIContainer(7):如何实现FieldInjection部分的功能?

20丨DIContainer(8):如何实现MethodInjection部分的功能?

21丨DIContainer(9):怎样重构测试代码?

22丨DIContainer(10):怎样将大粒度的测试重构为等效的小粒度测试代码?

23丨DIContainer(11):如何对ContainerTest进行文档化改造?

24丨DIContainer(12):如何增补功能?

25丨DIContainer(13):任务上的遗漏该怎么处理?

26丨DIContainer(14):如何重构对Type类型判断的逻辑?

27丨DIContainer(15):如何封装类型判断逻辑?

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):项目回顾与总结

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?

50RESTful Web Services(14):分解任务与Setup测试

51RESTful Web Services(15):为什么选择在第一个测试之后就开始重构?

52RESTful Web Services(16):重构手法之设计方法名的名称

53RESTful Web Services(17):如何进行Spike的架构愿景细化?

54RESTful Web Services(18):如何实现UriTemplate的主要功能?

55RESTful Web Services(19):如何更有效地构造测试数据?

56RESTful Web Services(20):为什么要通过测试的方法来驱动出代码结构?

57RESTful Web Services(21):按照三角法,该如何增加新的测试案例?

58RESTful Web Services(22):重构还是继续完成功能?

59RESTful Web Services(23):如何构造测试数据?

60RESTful Web Services(24):RootResource的测试要如何改造?

61RESTful Web Services(25):如何重构DefaultResourceRouter中的Result结构?

62RESTful Web Services(26):如何继续划分ResourceLocator的任务?

63RESTful Web Services(27):如何通过重构修改接口?

64RESTful Web Services(28):如何重构Resource、SubResource等接口与实现?

65RESTful Web Services(29):后续任务将要如何划分与实现?

66RESTful Web Services(30):什么情况下应该使用行为验证?

67RESTful Web Services(31):对于option的测试策略应该是怎样的

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注