敏捷开发 - 开发实践:测试驱动开发(TDD)

测试驱动开发(Test Driven Development, 简称TDD)是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。TDD的基本思路就是通过测试来推动整个开发的进行,但测试驱动开发并不只是单纯的测试工作,而是把需求分析,设计,质量控制量化的过程。TDD首先考虑使用需求(对象、功能、过程、接口等),主要是编写测试用例框架对功能的过程和接口进行设计,而测试框架可以持续进行验证。本主要介绍TDD的基础和实践案例,以及很多团队无法使用TDD方式开发的一些思考。

* 敏捷开发 - 开发实践:测试驱动开发(TDD)

* 什么是测试驱动开发(TDD)

* 如何进行TDD?

* 什么是ATDD?和TDD是什么关系?

* TDD实践案例

* 第一个需求:计算两个int类型的加法功能

* 第二个需求:如果两个int类型相加越界,则抛出异常而不是错误值

* 进一步理解

* TDD核心思想是什么?

* 为什么很多团队无法执行TDD?

* 有些场景并不适合TDD方式

* TDD对团队本身有一定的要求

* TDD是否已死?

* AMDD:通过敏捷模型拓展TDD?

* 迭代0:设想(Envisioning)

* 迭代建模(Iteration modeling)

* 模型风暴(Model storming)

* 测试驱动开发(TDD)

* 回顾(Reviews)

* TDD研究文献推荐?

* 参考文章

一、如何进行TDD?

在做TDD时,一个周期(红-绿-重构)如下:


然后重复这个周期。

什么是ATDD?和TDD是什么关系?

通常我们指的TDD是狭义的测试驱动开发,它是基于单元测试驱动开发,即UTDD(Unit Test Driven Development 单元测试驱动开发)。由于单元测试的编写是由开发者来进行的,所以UTDD侧重从开发者测试的角度驱动开发

由于软件开发生命周期中角色并不仅仅是开发测试者,还需要考虑业务用户(在敏捷中角色是Product Owner),所以我们将测试驱动放宽到PO的角色(满足PO可接受的测试驱动开发),这便是ATDD(Acceptance Test Driven Development 验收测试驱动开发), 所以ATDD侧重从业务角度进行测试驱动开发


本质上ATDD还是基于TDD的基础上进行的,并且可以表述如下的4D模型


二、TDD实践案例

通过一个实践案例向你展示如何进行单元测试驱动开发。@pdai

以写一个计算器应用为例,看如何用TDD思路去实现。


第一个需求:计算两个int类型的加法功能

写第一个测试用例(此时Calculator类是没有的)


通过IDEA工具自动创建Calculator类


创建类


自动创建方法


创建后的类和方法,完善该方法


进行单元测试


第二个需求:如果两个int类型相加越界,则抛出异常而不是错误值

添加测试用例,包含对抛出异常的检查;跑单元测试,出现错误;


重构原有add方法


重新跑单元测试,通过


进一步理解

我们通过几个问题进一步理解TDD。

TDD核心思想是什么?

从开发的角度谈谈TDD的核心思想,可以总结为如下几个要点。

更加关注测试的重要性,所以在开发功能代码之前,先编写单元测试用例代码。

敏捷的本质其实就是迭代,极限编程(XP)实践中的重要一环。迭代是期望逐步交付,减少一次性交付带来的弊端。

每一次迭代,通常涉及到冗余,有冗余就需要重构,重构是满足当前的代码符合代码结构的设计。以避免后续迭代(一次性重构)对当前代码结构的冲击。

为什么很多团队无法执行TDD?

软件开发领域常讲“没有银弹”,同样TDD也不是银弹;很多开发团队无法执行TDD, 我总结了几方面的内容:

有些场景并不适合TDD方式

总结而言,不符合迭代开发的或者无法进行对应的快速测试的场景不适合TDD方式开发。

  1. 无法迭代开发的

适合迭代的都是具体的需求实现,对于整体系统的设计是不适合迭代的,也不适合用用测试驱动开发。

因为后续的重构会对之前的代码逻辑有冲击,迭代将带来的持续冲击式重构,这种常见下的测试驱动开发对开发者而言是一种灾难。

比如复杂算法的实现,举个例子,你现在要开发一个傅里叶变化的模块,输入一些数据,得到傅里叶变换的结果。你花了一些时间,看懂了傅里叶变化的公式,对其实现也有把握,但是在写断言的时候就发现结果的验证太困难了,你可能需要借助matlab或者python来预先得到结果,然后复制结果到断言中。

数据驱动的算法也无法用TDD来开发,例如机器学习、深度学习。因为其结果与数据相关,当数据发生变化时,算法行为也会发生变化,这就没法写测试用例了。

  1. 无法快速测试的

测试驱动开发的另外一个必要条件是每次的迭代是可以被快速验证的,如果无法快速测试,那么就不适合。

  1. 存在交互边界的

比如硬件的开发,因为存在物理的边界。

TDD对团队本身有一定的要求

  1. 团队对质量管理的要求和认同

测试驱动开发只是一种敏捷开发方式,它是将测试提升到与开发同等重要的位置,以保证在敏捷的迭代开发中保持软件的质量。有些团队没有完善的软件开发质量体系和资源,没有将质量规范融入到整个开发流程中(也没有专人或团队来约束规范),甚至团队生存都存在问题,追求短平快更不会关注质量(@pdai: 想起一句经典台词:我都混到吃泡面了,我还在乎健康?);在这些情况下团队对质量管理缺乏认同,对开发测试的工作就变成了负担。

  1. 团队对需求和任务拆分的能力

测试驱动开发有一个很重要的前提条件是有相对可迭代开发的拆分需求,所以团队对需求的理解以及任务的开发能力极为重要,拆分任务时需要对任务的粒度和可持续性有较高要求;频繁需求的变更和拆分不到位,将让驱动测试开发陷入疲于奔命。

  1. 团队对重构的理解和能力

重构对于测试驱动开发是极为重要的,正如上面的例子看到的,在后续的用例需求开发时需要对前面的开发代码进行必要的重构,以满足当前的代码是满足相对最佳实践的;此时你可能会发现,增量写的用例需要对前面写代码大幅度的重构,而这些代码可能不是你写的,所以在团队没有对重构有统一的理解或者缺乏对重构的把控时,测试驱动开发可能会成为一种负担。

  1. 团队对协作的理解和能力

一个团队中是有很多角色的(产品负责人,PM,架构,开发,测试等),测试驱动开发不仅仅是开发者要做的事情,而需要其它角色的协作。举个简单的例子,如果在必要时候后续开发需要对之前代码进行重构,但是产品负责人或者PM无法认同,认为只是一个平行功能的开发,没有给到开发者足够的重构时间,这时便会错失好的重构时间点,对后续整体质量将埋下一个坑,而且这种技术债务有一天是要还的。

TDD是否已死?

在行业里最有名的是 Kent Beck、Martin Fowler、David关于Is TDD Dead在新窗口打开?的辩论。

pdai在这里添加这节内容是期望网站的读者明白:

  1. 无论采用何种方式开发,都是需要平衡项目,资源,团队等多种因素的;
  2. TDD过不过时都是主观的,但是它提供了一种敏捷开发的思路;作为开发而言,不断思考,不断实现自我的迭代永远不会过时。

三、AMDD:通过敏捷模型拓展TDD?

Agile Model Driven Development (AMDD)即敏捷模型驱动开发,TDD非常擅长详细的规范和验证,但是它不适合很大的问题,如总体设计、系统的使用或UI。AMDD解决了TDD没有解决的敏捷扩展问题, 因此,AMDD用于更大的问题。如下内容主要翻译自Scaling TDD via Agile Model Driven Development (AMDD)


在上图中,每个框代表一个开发活动。

设想(Envisioning)是预测/想象测试的TDD过程之一,将在项目的第一周进行。设想(Envisioning)的主要目标是确定系统范围和系统架构。高级需求和架构建模是为成功的设想(Envisioning)而进行的。这是一个过程,没有对软件/系统进行详细说明,而是探索软件/系统的需求,确定了项目的总体战略。

迭代0:设想(Envisioning)

有两个主要的部分:

迭代建模(Iteration modeling)

在这里,团队必须计划每个迭代将要完成的工作。

模型风暴(Model storming)

这也称为即时建模。

测试驱动开发(TDD)

回顾(Reviews)

四、TDD研究文献推荐?

有关TDD的有效性和成本已经有很多研究了。下表是个总结

作者/年份

重要发现

Siniaalto,2017

TDD不总是能提高开发效率,特别是在对TDD不熟悉的情况下。但是TDD所生产的代码具有更高的测试覆盖率。

Neil,2017

github上使用TDD开发的Java项目非常少,将TDD开发的项目与其他项目进行对比,并没有发现TDD开发的项目有明显的优势。

Wilson,2016

TDD能够生产更好质量的代码,但是开发效率不如TLD(开发完再测试)

Davide,2016

TDD声称的好处可能不是由于其独特的测试先行产生的。但类似于TDD所鼓励的细粒度稳步的增量式开发,可以改善开发质量

Nagappan, 2008

TDD消除缺陷是40% ~ 90%,其成本在开发初期多出15% ~ 35%

Sanchez,J.C,2007

TDD产生的缺陷密度低于行业标准。TDD或许能减少代码复杂度随着软件年限而增长的程度

Bhat,2006

TDD的使用可以让代码质量提升,初始成本增加至少15%

Siniaalto,2006

有些情况,TDD会大幅度提升效率,大概在2/13的情况下回减低生产效率(但会提升代码质量)

George,2003

TDD开发的代码质量更好(可以多通过18%或者更多的功能测试),且多用16%的开发时间。事后测试的代码测试不够充分

#参考文章

https://kentcdodds.com/blog/when-i-follow-tdd

https://blog.csdn.net/weiwei9363/article/details/117805722

https://www.guru99.com/test-driven-development.html

https://github.com/hxfirefox/blog/blob/master/TDD/TDD%E9%9A%8F%E6%83%B3%E5%BD%95.md

http://agiledon.github.io/blog/2013/12/25/thought-about-applying-tdd/

https://www.cxybb.com/article/zanfeng/119480625

https://martinfowler.com/articles/is-tdd-dead/

https://www.jianshu.com/p/b794d5491dd9

原文链接:https://pdai.tech/md/dev-spec/dev-agile/dev-pratice-tdd.html

你学废了吗

准备面试?工作遇到问题?想要积累知识?

快搜索:7TCoding


往期内容回顾:

1、【干货】不可不知的需求管理过程及相关模版

2、目标管理体系:OKR

3、【干货】不一样的团队管理框架:初识

4、华强版:我问你,你这接口保“熟”吗?

5、能量加油站:Git 操作,新手学习老手温故【附脑图】

6、云原生:Docker实战之Docker安装(最详细)

7、7TCoding年轻人应该知道的小秘密

8、两步走战略,教你如何创办一个好的企业

9、不可不知:商业运转规律的各类模型

10、如何在企业中从0-1建立PMO(项目管理办公室)

11、【干货】Scrum敏捷项目管理,看这一篇就足够了!

12、从数据思维到业务实战的模型框架

13、资深架构师如何确保高性能的架构

14、【干货】财务管理流程【研发、产品、项目建议都要了解】

15、PMO应该具备的一些能力(浅聊)

16、PM、程序员的撸猫(国产猫粮)指南

17、最全、最美、最精致的“刘润年度演讲2022进化的力量”(点击图片查看高清内容哦)

18、作为产品总监/PM你合格吗?不懂就来看,勇敢面对“元无知”

19、PM:市场需求文档(MRD)

20、monorepo让项目合作开放、透明,一篇扫盲

21、互联网行业常见的9大典型故障(现象、原因及经验教训)

22、【产品总监篇】年终总结这么写!

23、【通用篇】年终总结这么写!

24、【技术总监篇】年终总结这么写!

25、06:年轻人应该知道的小秘密-学会简化问题的方法

26、TOGAF架构框架基础的认知

27、【干货】市场管理流程【建议市场、研发、产品、项目都要了解】

28、【干货】这样的竞品分析实战案例你见过吗?

29、架构师的艺术及能力

30、企业绩效管理(高层中层基层)

31、谷歌工作十年中总结出的工程师十项必备软技能

32、高级项目管理师的十八般武艺(必备技能)

33、带你认识敏捷项目管理中不一样的用户故事

34、2023 年五大趋势:直面混乱,掌控变局

35、知识库系列:Zookeeper和Mybatis(持续更新)

36、知识库系列:Dubbo(附脑图-持续更新)

37、互联网知识库合集【详见脑图】

38、98家央企及下属409家上市企业全名单(2023版)建议收藏!

39、2022年全球程序员收入报告出炉:国内程序员人均56w年薪,谁平均了我?我拖后腿了

40、必备的100个思维模型:13个创新模型


更多精彩,请加入我们哦!

展开阅读全文

页面更新:2024-03-21

标签:敏捷   测试   干货   建模   模型   团队   需求   代码   功能   项目

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top