大家好,我是码农小余,今天我们来讨论 TDD
。本文纯属个人实践后的感受,若有不确之处,欢迎大佬指导和交流!
细心的童鞋可能看出在小余前几篇文章中都有在实践 TDD
。比如 手摸手实现一个编译器(中)、通过一个“时髦”的例子学 Babel 插件 和 重构利器 jscodeshift,它们的共同点是都用了需求整理、拆解分析、写测试用例、编码这个流程——测试驱动开发(Test-Driven Development
,缩写 TDD
)。在进入正文之前,可以想想下面这个问题:
TDD
属于编程技术还是规范(意味着TDD
是一种重要的敏捷需求和敏捷设计技术)?——引自 「首席架构师看敏捷数据」核心实践:测试驱动开发(TDD)简介[1]
一个 TDD
环如下图所示:
简而言之,TDD
流程包括三个环节:
SOLID
原则和设计模式等);但在合适的时机(比如空闲时或者下个迭代功能开始之前)务必做重构,这个时间点因为有“绿码”保障,对重构自然也是信心十足。上述环节要想完美地运作,核心是要做好任务分解和模块拆分。
模块分解前提是需求分析。作为手里拿着大斧头的程序员 👨🏻💻,看问题一般只会从木头的角度出发(只会从代码实现的角度去思考)。看着交互稿上横坐标有密密麻麻数据的折线图 📈,就想着怎么配置 echarts
,怎么去更好地做到响应式显示,而不会考虑使用折线图的价值以及合理性。
简单地过一下需求讲解和交互评审,明白大体的编码逻辑后,不经过需求的剥茧抽丝过程,就匆匆忙忙地开始写测试用例。最后因为模块拆分地不合理,思路不清晰,脑子里更是一团乱麻,测试代码自然就写不下去,最终选择放弃 😔。
上面是小余在实践 TDD
时遇到的一些问题和困惑,但只要稍加强化以下几个点,你的 TDD
之旅定能顺畅许多:
TDD
,就不能怀疑它的价值。有人会因为测试无法捕捉所有的 bug
就不写测试,但却忽略了测试真正的价值是能够捕获大多数的 bug
。针对这个问题有一个最佳实践是每当你遇见一个bug,先写一个测试来清楚地复现它,这样能保证你出现过的 bug 不会在出现第二次。TDD
不可或缺的一环,它直接影响到产品的内部质量(外部质量理解成测试人员从外部对功能进行的测试质量,内部质量指代码质量)。“屎山⛰”不可一日而就,任何产品持续迭代而不做重构,终有惹人嫌,成为同事嘴中“垃圾代码”的一天。有了“绿码”保障,重构能够轻易执行,因为你不再需要手动地测试。什么时候做重构呢?⚠️ 看到“红码”时永远不许进行重构!测试用例中存在失败用例就不应该进行重构。这时应该先让“红码”变成“绿码”,之后再采用“小步慢走”的策略进行重构。《重构,改善既有代码的设计》常伴吾身,因为每进行一个功能开发,都会感叹以前写的代码就是一坨“屎”!在还没有被别人闻到“屎味”(坏味道)之前,及时铲除,你依旧是别人嘴中的“码圣”。bug
时的改动引发;TDD
能集中在接口设计而非实现上,还支持频繁地低成本重构,代码的组织、可调试性、可维护性、易读性就水到渠成了;TDD
,那这个情况就会发生在你实现业务中间,此时再去改业务逻辑,自然就晚了。只能在业务逻辑上补充各种判断,几百行的函数自然就炼成了。时时勤拂拭,勿使惹尘埃。尘埃如此,代码亦如此。TDD
的目标是能让你更有组织地完成需求和让代码不染上坏味道的方法论。
最后回到文章开头的问题“TDD
属于编程技术还是规范(意味着 TDD
是一种重要的敏捷需求和敏捷设计技术)?”小余作为一个前端开发人员,我的看法 TDD
是一种编程技术,它能让我更聚焦代码质量,需要花费更多的精力使用 SOLID 和设计模式去打磨写过的代码,这是当前 TDD
带给我的收益。但随着时间的推移和思维的转变,它会潜移默化地成为一种规范。你觉得呢?
[1]
「首席架构师看敏捷数据」核心实践:测试驱动开发(TDD)简介: https://cloud.tencent.com/developer/article/1502180?from=article.detail.1053754
[2]
行为驱动测试 BDD: https://en.wikipedia.org/wiki/Behavior-driven_development