TDD系列2-认识TDD

    上篇说到TDD(Test Drive Development -测试驱动开发)是单元测试的最佳实践之一,实际上TDD远超出单元测试的范畴,TDD是敏捷开发中的一项核心实践和技术,也是一种设计方法论。

TDD基本思想

    TDD基本思想是要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,有很高的灵活性和健壮性,能快速响应变化,并加速开发过程。
    TDD不仅是单纯的测试工作,测试工作保证代码质量仅仅是其中一部分,而是把需求分析,设计,质量控制量化的过程,是在开发过程中帮助客户和程序员去除模棱两可的需求。TDD首先考虑使用需求(对象、功能、过程、接口等),主要是编写测试用例框架对功能的过程和接口进行设计,而测试框架可以持续进行验证。其效果是以可执行的形式文档化你的需求,迫使你分清职责隔离依赖以驱动你的设计,编织安全网以便将Bug扼杀在在摇篮状态,防止其逃逸。可传统测试人员的活动是试图找到已经逃逸的Bug。这两种活动都是必要的,而且毫不冲突,互为补充。

TDD效果

1、目标先行
    每实现一个方法之前先考虑这个方法要达到的目标是什么,再编写这个目标的检测手段(单元测试),最终去实现这个方法,并通过之前设想和编写的检测手段去验证这个实现是否已经达到预期的目标。
    单元原本要做什么,而不是实际上做了什么。
    在开发过程中帮助客户和程序员去除模棱两可的需求。
2、代码整洁可用
    能通过所有的测试
    没有重复代码
    体现系统中全部设计理念
    包括尽量少的实体,包括类、方法、函数等
3、防倒转装置
    设想把编程看成是转动轮轴从水井提水的过程。如果水桶小,那么只需一个能自由转动的轮轴就可以了。如果水桶比较大而且装满了水,那么水还没提上来你就可能会很累了。你需要一个防倒转的装置,以保证每转一次可以休息一会儿。水桶越重,防倒转齿的间距应该越小。TDD就是这样的防倒转装置。
    从技术上来说,防倒转装置鼓励我们不断去优化重构代码,不用担心重构可能带来的脱离控制。

TDD基本方法

方法示意图

在这里插入图片描述
对于一个测试来说,目标是从不可运行的测试到可运行测试且测试正常,达成的方法就是构建代码。
重构是在单元测试的控制下进行的。

基本方法步骤

① 快速新增一个测试   
② 运行所有的测试(有时候只需要运行一个或一部分),发现新增的测试不能通过   
③ 做一些小小的改动,尽快地让测试程序可运行,为此可以在程序中使用一些不合情理的方法   
④ 运行所有的测试,并且全部通过   
⑤ 重构代码,以消除重复设计,优化设计结构。重构可以基于一个测试,基于一个单元或多个单元。

方法基本原则:

1‘、只有自动测试失败时,我们才重写代码
2、消除重复设计,优化设计结构

TDD好处

1、TDD根据客户需求编写测试用例,从使用者角度对功能的过程和接口进行了设计。
2、出于易测试和测试独立性的要求,将促使我们实现松耦合的设计。
3、将测试工作提到编码之前,并频繁地运行所有测试,可以尽量地避免和尽早地发现错误,极大地降低了后续测试及修复的成本,提高了代码的质量。在测试的保护下,不断重构代码,以消除重复设计。
4、TDD提供了持续的回归测试,使我们拥有重构的勇气。
5、TDD所产生的单元测试代码就是最完美的开发者文档,它们展示了所有的API该如何使用以及是如何运作的,而且它们与工作代码保持同步。
6、TDD可以减轻压力、降低忧虑、提高我们对代码的信心,这些都是快乐工作的重要前提。
7、TDD让团队提高了信任度,用户也真正学会了期待新的版本。
8、可快速交付:在任意一个开发节点都可以拿出一个可以使用,含少量bug并具一定功能的产品。

TDD挑战

1、TDD是一种敏捷开发方式,每个项目成员要学习它、认同它,具有克服它带来困难的准备和解决的信心。对没有敏捷实践经验的团队挑战特别大。
2、难以掌握落地的广度、深度和粒度,如强制全部TDD,很多部分用一个简单模块可以轻易写出,用TDD会导致需要写大量测试代码,程序员会非常抗拒的。
3‘、系统分析设计的粒度达不到单元测试的接口粒度,而接口不稳定带来的测试代码和代码双重变动。
4、大量桩模块带来的工作量和难度。
5、单元测试用例覆盖问题,需程序员不能只考虑常见或正常情况,还需考虑边界或异常情况。
6、单元测试数据问题:数据准备、数据一致性、数据清除等问题。
7、项目中途或维护阶段,如何引入TDD需要探索。
8、项目时间紧、工作量大时,使这些挑战变得更突出。

当然TDD更重要的是去实践,笔者进行的过程演练见"TDD过程实例-保龄球单局积分算法"。
想更系统学习TDD的同仁推荐阅读Kent Beck著的《Test-Driven Development By Example》,中文版《测试驱动开发》。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部