文档章节

从一个案例深刻领悟TDD的真谛

杨武兵
 杨武兵
发布于 2013/06/06 08:53
字数 959
阅读 256
收藏 1

码上生花,ECharts 作品展示赛正式启动!>>>

  一直以来比较推崇在开发中进行全面的单元测试,我觉得单元测试的好处非常多。但是没有真正的用起TDD,在编写功能实现代码之前先编写测试代码,这样的习惯没有养成,意义也没有觉得非常大。因此TDD其实没有真正用起来。直到最近在实际工作中的一个案例让我更加深刻得领悟出TDD开发的真谛!

  案例:最近我们开发一个消息中心的服务,该服务要给数十个项目组提供接口,由于各项目组的进度和步调不一致,消息中心服务的项目先开始工作,定义好了接口之后,将接口公布出去,然后就开始实现接口功能,进行接口的单元测试及模拟集成测试。一段时间后,陆陆续续有些应用项目组开始工作,发现了接口定义的一些问题,这些问题有的是接口无法满足他们的需求;有的是有些字段没有;有的是感觉接口使用不方便;反正最终导致的结果是消息中心服务项目组的代码进行了多次返工和修改,浪费了很多时间,至今还没有彻底满足所有项目组的需求。

  后来我接收负责其中一个接口的实现,反思之前出现的问题的原因是什么?有什么办法可以解决或者减轻这种问题呢?我觉得最根本的原因是在设计和实现接口的时候,服务提供项目组没有让服务的用户参与进来一起进行设计,服务接口公布出去之后,由于服务用户没有真正去了解和使用,也无法提出问题,等真正开始使用的时候才发现一大堆问题。因为接口实现项目组由于知识和场景的完全认识,无法清楚所有使用方的使用场景,因此导致实现的东西与接口用户想要的东西存在差异的原因。

  最终我的解决办法是也许可以应用TDD的思想。让接口用户参与进来共同设计接口,将开发顺序反过来结果就完全不一样。我这次的开发方法是这样的:首先让接口使用项目组自己设计协议接口,我来看接口是否存在问题,然后我写程序实现思路,画程序的活动图,用这些东西与接口的用户沟通,经过协商没有问题后就这样定下来了。然后,接口使用项目组开始面向接口编程,当他们的代码写完了之后,我再开始写我这边的单元测试,接着写实现代码,最终进行集成测试。最终的结果证明这种开发方式几乎没有返工,开发出来的接口几乎没有任何问题。

  从这个案例表面看起来好像是接口实现方和接口使用方之间的关系,但是这个道理同样可以应用到软件开发者和软件用户之间的关系。只有用户最了解自己想要什么,让用户参与进来验证需求,能够最大程度的保障需求的正确性。因此TDD能够将软件开发方和软件用户对需求的理解尽可能保持一致,让用户得到他们想要的软件,他们在自己的使用场景下用起来非常顺手的软件。

  

© 著作权归作者所有

杨武兵

杨武兵

粉丝 289
博文 61
码字总数 123254
作品 1
昌平
架构师
私信 提问
加载中
请先登录后再评论。
为什么从前那些.NET开发者都不写单元测试呢?

楔子 四年前我虽然也写了很多年代码,由于公司虽然规模不小,却并非一家规范化的软件公司,因此在项目中严格意义上来说并没有架构设计、也不写单元测试,后来有幸加入了一家公司,这家公司虽...

osc_w9s1w4o0
2019/03/28
2
0
Nginx源码分析系列4:Nginx里的双向链表

花了半个小时看了买的书籍,原理已经掌握, 根据书上写了代码如下: typedef struct{u_char* str;ngxqueuet qEle;//位置任意int num;}TestNode; ngxintt compTestNode(const ngxqueuet a,con...

强子哥哥
2013/12/08
240
0
[草稿]-TDD-测试驱动开发-领悟总结

TDD : Test-Driven Development 测试驱动开发,即TDD,是敏捷开发一个重要的特点.而敏捷开发是一种将高效设计模式推广到了开发流程控制层面上结果.而TDD是敏捷概念的一种表现形式.(不善于讲广义...

Channely
2014/08/15
93
0
20165233 实验二 Java面向对象程序设计

20165233 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装、继承、多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步骤 一、单元测...

osc_wpln0ly9
2018/04/17
2
0
我的测试生活感悟1

真的是万事开头难,但我觉得更难的是,每天都坚持做同一件事情。在不被强迫的情况下(如:上班、吃饭、睡觉...),在可自由支配的时间里,现在我每天坚持做的貌似只有GoogleReader。希望我的测...

科技小毛
2017/07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringMVC异步请求

AsyncController @Controllerpublic class AsyncController { /** * 1. 控制器返回Callable * 2. Spring异步处理,将Callable提交到TaskExecutor,使用隔离的线城进行执行...

与你同行7Melody
32分钟前
5
0
在动态创建的元素上进行事件绑定? - Event binding on dynamically created elements?

问题: I have a bit of code where I am looping through all the select boxes on a page and binding a .hover event to them to do a bit of twiddling with their width on mouse on/of......

javail
33分钟前
13
0
js 使用canvas 旋转 图片

最左边是原始图片,中间是canvas内容,右边是将canvas内容导出到img标签中 canvas绘图时,确定图片的原始尺寸,不是显示的dom大小,需要创建元素后获得 如果使用dom大小的话,会在绘制时只能...

阿豪boy
45分钟前
16
0
Qt在Application中创建窗体

Qt的GUI编程中都会有一个自动生成的主MainWindow,如果要创建对话框或者其他类型的子窗体,最好能提前创建窗体,当需要时再调用即可。具体步骤建议如下: 1:使用Qt自带的设计师界面类,既包...

qwz185_堡垒
50分钟前
12
0
安卓开发实战,用HMS MLKit华为机器学习服务开发一个拍照翻译小程序

查看华为开发者联盟网站的机器学习服务业务介绍(https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/ml-introduction-4) 引子 想必有很多小伙伴喜欢外出旅游,能去海外...

HMS-Core
53分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部