文档章节

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

杨武兵
 杨武兵
发布于 2013/06/06 08:53
字数 959
阅读 157
收藏 0
点赞 0
评论 0

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

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

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

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

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

  

© 著作权归作者所有

共有 人打赏支持
杨武兵

杨武兵

粉丝 234
博文 56
码字总数 123254
作品 1
昌平
架构师
[草稿]-TDD-测试驱动开发-领悟总结

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

Channely ⋅ 2014/08/15 ⋅ 0

Nginx源码分析系列4:Nginx里的双向链表

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

强子哥哥 ⋅ 2013/12/08 ⋅ 0

我的测试生活感悟1

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

科技小毛 ⋅ 2017/07/19 ⋅ 0

书评:测试驱动开发的艺术

读罢《测试驱动开发的艺术》,忽然想起中国传统文化中的“道器之辩”。《易经》曰:形而上者谓之道,形而下者谓之器。中国的传统文化常常是重道轻器,认为道本器末,即道是根本,其他一切是道...

wayfarer ⋅ 2011/02/11 ⋅ 0

爱默生的超验主义文学

爱默生(Ralph Waldo Emerson, 1803-1882)是19世纪最重要的美国作家之一。他提倡超验主义(Transcendentalism)。 所谓"超验主义",就是这样一种信仰,认为在人类的理性和经验之上有一种更高...

阮一峰 ⋅ 2006/11/12 ⋅ 0

多么痛的领悟:十三起惨痛宕机案例

多么痛的领悟:十三起惨痛宕机案例 运维派2018-01-031 阅读 案例宕机 社区有很多兄弟分享惨痛宕机案例,提醒大家需警惕,以下介绍几起,满满都是血的教训…… (以下案例来自社区多位会员 […...

运维派 ⋅ 01/03 ⋅ 0

TDD(测试驱动开发)学习二:创建第一个TDD程序

本节我们将学习一些测试驱动开发环境的搭建,测试驱动开发概念和流程。所涉及的内容全部会以截图的形式贴出来,如果你也感兴趣,可以一步一步的跟着来做,如果你有任何问题,可以进行留言,我...

Michaelyn ⋅ 2015/05/29 ⋅ 0

JDBC数据库--XDataBase

XDataBase(简称为XDB),一个为TDD而生的JDBC数据库。将数据存储于KV中,以便进行JUnit的重复测试。可通过简单的加载DML,DDL,实现一个支持事务,ACID特性,支持Oracle,MySQL内置函数,Fun...

woate ⋅ 2015/07/09 ⋅ 1

使用Cut快速构建C++程序的TDD环境

本文通过Bazel(Google Build Tool)构建工具,使用Cut(C++ Unified Test Framework)快速构建一个C++程序的TDD环境,以此阐述Cut在实际项目中的实际应用。 一般地,一个C++程序为了实施TDD,必...

_RayCloud_ ⋅ 2017/01/24 ⋅ 0

Test-Driven Development?别逗了

这篇文章来源于Peter Sergeant在Write More Test 博客上的《Test-Driven Development? Give me a break…》,在原文和Reddit 上有很大反响。这篇文章里的很多观点在《TDD并不是看上去的那么美...

红薯 ⋅ 2011/10/17 ⋅ 17

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 22分钟前 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 27分钟前 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 36分钟前 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 36分钟前 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 37分钟前 ⋅ 0

React Native & Weex 区别

JS引擎 Weex使用V8, React native使用JSCore JS开发框架 ( Js Framework ) Weex基于vue.js(2W+ star)。小巧轻量的前端开发框架,组件化,数据绑定,2.0引入virtual dom。 ReactNative使用...

东东笔记 ⋅ 45分钟前 ⋅ 1

UIkit 分页组件动态加载简单实现

1. 问题描述 使用过UIkit分页组件的都清楚,UIkit的分页不能动态刷新数据,也就是不能在点击下一页的时候,动态从后台加载数据,并且刷新页数以及该页数上的数据,下面是一个简单实现,没有做...

影狼 ⋅ 46分钟前 ⋅ 0

Mobx入门之三:Provider && inject

上一节中<App/>组件传递状态temperatures给children -- <TemperatureInput />,如果组建是一个tree, 那么属性的传递则会非常繁琐。redux使用Provider给子组件提供store, connect将子组件和s...

pengqinmm ⋅ 48分钟前 ⋅ 0

魔兽世界 7.0版本 S23/S24/S25全职业普通+精锐套

  死亡骑士   (联盟)   (部落)   (精锐)   恶魔猎手   (联盟)   (部落)   (精锐)   德鲁伊   (联盟)   (部落)   (精锐)   猎人   (联盟) ...

wangchen1999 ⋅ 55分钟前 ⋅ 0

maven顶级pom和子pom的版本号批量修改

当一个版本发布,新起一个版本时,我们只需要手动修改一下项目中pom.xml的版本号就可以了。但是如果这个maven项目有很多的子模块项目,那么一个个手动的去改就显得费时费力又繁琐了。还好,m...

ArlenXu ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部