说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在团队中进行单元测试/TDD的12条经验

HTML文档下载 WORD文档下载 PDF文档下载
测试可以帮助项目团队找出代码中存在的问题,TDD方式更是将测试放在了开发工作的首位。那么在团队中该如何应用单元测试和TDD呢?开发者Paulo Ortins结合自身经历给出了本文中的12个经验教训。

测试可以帮助项目团队找出代码中存在的问题,TDD方式更是将测试放在了开发工作的首位。那么在团队中该如何应用单元测试和TDD呢?开发者Paulo Ortins结合自身经历给出了本文中的12个经验教训。文章翻译如下。

背景

两年前,我在一个Web项目开发组中,项目的目标是编写一个类似Excel的、用来计算产品/服务价格的Web应用程序。项目团队被分成3部分——开发团队、需求团队和QA团队。随着项目越做越大,而我们没有使用任何形式的自动化测试(QA团队使用手工测试),结果导致项目的测试时间比开发时间还要多。每进行一次小的改动,QA团队都要花费几个小时来做测试。

有一天,我参加了一个开发者会议,并与其他程序员谈到了这些问题。他们建议我去学习单元测试、验收测试和TDD(Test-Driven Development,测试驱动开发)。

我的经验总结

下面是我在学习集成测试/TDD过程中的一些经验教训,希望能够对大家有所帮助。

1.  不要第一次就在真实项目中尝试TDD

这可能会让你的项目很难进展。在采用TDD之前,你必须要了解TDD的工作流程以及如何去模拟对象(mock objects)、如何去模拟框架内部、如何组织测试等方面知识。因此,如果你的团队还没有准备好,就采用TDD可能会拖慢你的项目,从而错过最终交付期限。

2.  采用编程道场(CodingDojo)方式学习TDD

我们发现编程道场是对新进入团队的开发者培训TDD以及提升他们编程技能的最好的方式。

编程道场是一种帮助提高编程技能的训练方法。一般是在一个会议室里,有一台连接投影仪的电脑。每次道场还要有一个挑战题目。每次有两个人在电脑前结对编程来试图解决挑战的题目,并且由其他参加者提供建议。所有的参加者都要轮换到结对编程里进行演练。(来自维基百科)

3.  应用TDD之前尝试说服你的整个团队

没有什么比团队中存在“破坏者”角色更令人沮丧的了。如果团队中大部分人都在朝着TDD努力,而个别开发者所做的工作有可能毁掉这些努力,比如提交失败的测试代码等。我曾经就与这类人一起工作过。在团队开始TDD开发之前,一定要让所有人明白它的好处,并了解如何测试可以使软件减少bug、如何重构代码而不用担心破坏整个项目等等。

4.  写足够多的测试

构建一个测试套件,就等于构建了一个bug防护盾。当团队重构或改进软件时应该完全信任这个“盾”。如果这个盾有缺口,那么我们在更改代码时会增加引入未知bug的风险。不要强求测试套件覆盖100%的代码,这是不可能的,而且相当耗时,但是,覆盖大部分代码是完全可以实现的。一个好的准则就是测试所有可能会出现问题的地方。

5.  使用覆盖率工具

覆盖率工具将会报告测试套件的缺口。借助这些工具,可以很容易识别哪些代码没有测试。这些工具可以给我们一个直观的认识,比如蓝/绿着色线表示正在测试中的代码,红色着色线表示没有测试。如果你是一个.NET程序员,VisualStudio旗舰版会带有这个功能;如果你是一个Java程序员,你可以使用EclEmma。

6.  测试速度要快

当在构建软件时,我们永远都在追赶最后的交付期限。我们的测试应该帮助我们实现这一目标,而不是耗时和延迟。

如果写测试用例花费太长时间,在最后期限到来之前,团队可能不会再花时间写测试。如果在运行测试上花费太长时间,团队可能不会在每次更改代码后都运行它们。

7.  不要忽略失败的测试

如果你的团队对第1次失败的测试不在意,那么他们对第2、3、4次失败的测试也不会太在意。这种情况下,测试套件反馈的问题将会被忽略,测试也不会对软件质量有太大帮助。

8.  结对编程有助于团队应用TDD

当我们首次试图采用TDD时,或者最终交付期限临近时,我们可能会忘了写测试,而只顾写生产代码。结对编程可以阻止这种偷工减料的现象,强制团队成员编写测试。

9.  保持你的测试代码整洁

为了提高工作效率,我们的测试代码可能不会像生产代码一样整洁。由于软件发生改变时,测试代码也必须改变,测试代码也会越积越多,这样一来,会导致最终测试代码也很难维护。

10  测试应该有且只有一个失败的理由

这个理由就是发现bug。如果你的测试代码有大量的断言,你就需要小心。如果生产代码中的函数和类只有一个响应,那我们的测试代码也应该只测试这一个事件。通过这种方式,将很容易找出失败的测试,并弄清楚什么地方出问题了。

11.  编写单元测试将节省调试时间

通常在调试代码、寻找bug时会花费大量的时间,一旦你编写了单元测试,你将会在代码的每一块得到一个实时反馈,这将让你更容易找到bug,节省调试时间。

12.  持之以恒

应用TDD可以改变我们的心态。对于部分开发者而言,开始写测试很难,而在写生产代码之前写测试就更难了。重要的是,要持之以恒地写测试,一旦你的团队完全适应了这种方法,生产效率会成倍提升。

英文原文:12 Lessons I learned using unit tests/TDD

嵌入式专家Bruce Douglass经验谈 门票销售过半 从2014微信开发者大会购票者特征说起 当来自金星的Devs碰上火星的Ops——共话应用扩展 移动平台市场占有率:Android首次赶超iOS 豌豆荚范怀宇 I/O大会总结:Android无处不在 轻博客始祖Tumblr:哈希以支撑2.3万Blog请求/秒 《近匠》FIR.im:简单易用的内测分发工具 传苹果公司将于9月9日召开新一代iPhone发布会 近百家微信开发商参与征集评选活动 TOP10正浮出水面 Java程序猿,手游引擎怎么选? MDCC 2014优秀移动团队免费展位火热申请中 【微信讲师面对面】你在企业服务号开发中遇到的坑和难点 五个解决方案让MongoDB拥有RDBMS的鲁棒性事务 浅谈Apache Spark的6个发光点 安卓 “假ID” 签名漏洞,竟然骗过了支付宝和360 从Social到Big Data,移动App蚂蜂窝转型推新品 《近匠》nice曹大鹏,从男装导购到潮人社区的心路历程 DevOps扼杀的不是开发者,而是开发生产力! 利用Docker构建开发环境 Netflix公布Cassandra新性能:基于AWS的百万次写入每秒 一周消息树:谷歌Android遭遇“颠覆”危机 微软发布新应用Snipp3t,iOS平台首发且无Windows Phone版 TOP10优秀微信开发商随后揭晓 2014微信开发者大会开幕在即 8月12日:PC鼻祖IBM 5150迎来33周年 平板创作3D展现:蒙特利尔大学发明Hyve-3D设计系统 Quick Charge技术解析:关于手机快速充电的那些事儿 性能分析十八招,你用哪一招? 流程在企业内的作用及成熟度 Gartner:至2017年Chromebook销量将增2倍 后稀缺时代思考:机器横行下的人类夹缝求生 TIOBE 2014年8月编程语言排行榜:Swift跌出Top 20 谁有 file cutter v1.4的注册码? 有急用! 搞一个专业的VC程序员基地~~~~~~谁愿意加入????? 最新发现:原来C++Bilder的项目文件(.bpr)是XML格式的! 关于FAT32和NTSF的问题 如何用VC实现Email的发送? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了! 搞一个专业的VC程序员基地~~~~~~需要网页制作高手!! ADO 的用法 m_pRecordset->Fields->GetItem(index)->GetName() 关于CRichEditCtrl的问题之二,取的当前可见行数? 请问在哪里下载IMAIL SERVER???各位帮帮忙!!! 高手请回答,ADO和BDE到底有什么区别,你选择谁?为什么? 高分求教!!!!!!!!!!!!!!!!怎样得到局域网上所有的机器名?(普通WINDOWS网络,用VB?,好象用WNET API可以的) 如何安装com.ibm.bridge2java.*这个包阿? 有人吗???求救! 你也许也会遇到这样的问题? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题!!! 大虾看过来. 一个access表一万条记录,想转到Mysql下(Mysql在Linux下)用什么方法和什么语言来做好? rs.CursorLocation=aduseclient是什么东西? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题! 简单SQL,免费送分! 用ASP如何上传文件,可以用组件。 谁知道怎么改运行中的程序的托盘图标???我用SysTray.ocx不能改? 新手提问,简单题目,大量给分~~~~~~~~~~ 如何使用getdispatch(), 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题!! 关于在一个窗口中的多个数据窗口的问题 扔块砖头, 开个场子 。 ( yeti_lee ) 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了? To: baicolt(五岁的小新是我师傅) 有没有人用过Jcreator 如何在sql server 的查询分析器中用sql语句转到另一台机器上的数据库,同样了sql server的 是不是MSHFlexGrid的bug? 800分+工资管理原代码,如何解决ActiveReports打印图片的一个很难题;否则我快下岗了?? 这个错误类型是什么意思? 如何能够简单的得到昨天的日期? NetBios-SSN是什么? 怎样得到局屿网上所有的计算机名,我想给班里写个局屿网聊天程序,原想用DX8,但DX8好想建立的连接都是C/S模式的。如果能得到机器名就可以用WINSOCK写了(用VB写) 请问诸位有没有什么自动生成源码注释的工具,可以产生函数说明注释和类说明注释 数据库连接这种是什么错误? TStringList *p 定义为一个两维数组怎么做? 在VC++6.0下编程,有什么办法可以获得所有的窗口的句柄??? 如何纪录当前的ID 凡是繁体字的帖子是不是港台同胞发的? 在ASP中,怎样可以删除一个在硬盘上的的文件????? 有人知道下面情况怎么实现吗? JDBC插入2000个字符到Oracle字段中的问题 凡是繁体字的帖子是不是港台同胞发的?。 pb中的pfc类库如何调用? 如何得到当前WINDOWS的进程??以及线程??? DELPHI除了开发数据库以外,开发其他哪种类型的软件更好? 不锈钢管的计算公式按每米报价 一卷100克的无纺布大概多重 我知道一卷是200米,重量不知道有多重 在为灾区捐款捐物活动中,小明也捐了5元零花钱,虽说不多,但____.歇后语, 矩形钢管每米价怎么算已知一种矩形管价格是5300每吨 问每米价格是多少 100斤铁重还是100公斤(200斤)棉花重……纠结 小明和小刚都积攒了一些零用钱,他们所积攒钱数的比是7:4.在支援灾区的活动中,小明向灾区人民捐款了22元钱,小刚捐赠了10元钱,这时他们剩下的钱数相等.小明原有多少钱. 304不锈钢管价格去哪里查询价格啊? 怎样适当给小孩零花钱? 在向灾区捐款的活动中,小亮捐款了零花钱的25%,小东捐了零花钱的20%.小亮捐的零花钱一定比小东多吗?请通过计算来说明.谢谢各位大哥、大嫂、叔叔、阿姨、大哥、大姐……!设:小亮捐款 在比例尺是1:40000的地图上,两地相距5厘米,如果在比例尺是1:25000的地图上,两地间的距离是多少厘米 家长如何给孩子零花钱对这个的评价 一公斤铁和一公斤棉花哪个重 在比例尺1:40000的地图上量得两地的距离是6厘米,这两地中间的实际距离是多少米? 知道纸的吨价克数和重量怎么计算出令数列如:一吨50克正度防近视纸 4000元一吨 计算出有多少令 每令纸多少钱 要求有公式 我想通过密度算出有机玻璃的价位是多少 100000块日元等于多少人民币 克重 门幅 怎么算重量克重150克 门幅155cm 3000米布 怎么算出有几公斤重 一斤棉花和一公斤铁哪个重 100公斤铁和100斤棉花哪个重这是见证你们智商的时刻了 每卷收银纸的重量怎么算,知道克重,米数,和宽度 甲乙两数的差是90,甲数的6分之1与乙数的4分之1相等.甲数是? 不锈钢六角管重量计算公式? 1/2'' 和5/16'' 等于多少毫米?怎样换算的?请问怎么划算成毫米? 甲乙两数差是90,甲数的6分之1与乙数的4分之一相等,甲数是 ( ) 管子的换算公式从吨换算成每米的重量价钱? 在比例尺是1比8000000的地图上,量得A、B两地相距20cm.两列火车同时从A、B两地相对开出,甲车每小时行110km,乙车每小时行90km,几小时后相遇? 亚克力的成份用英文怎么写 甲、乙、丙三个小朋友积攒了一些零花钱,甲的存钱是乙的2倍,乙的存钱是丙的2倍,已知甲比丙多存60元.甲乙丙各积攒了多少元? 算布料时,如何把平方英寸算为平方码? 比例尺是1:600000地图上,量得俩地之间距离是10cm,甲乙两列火车同时从两地相对开出,3时相遇已知甲车的速度比乙车快九分之二.乙的速度是每小时多少千米 克重110克每平方米,门幅1.5米,数量900米,请问怎么换算多少公斤? 一个两位数,个位和十位辶和等于十,如果把两个数的个位和十位数字对调,得到的新两位数比原来的数大一十八,请问原来的两位数是多少,请问怎么算. 在比例尺1/6000000的地图上量的AB两地间的距离是10cm甲乙两列火车同时从AB两地相对开出,6时相遇,已知甲乙火车的速度比为11:9,两车相遇时,甲车行了多少千米 甲、乙、丙三人共有零花钱123元,已知甲和乙的钱数比是5:4,乙和丙的钱数比是6:7.甲乙丙各有多少零花钱 1亿等于1乘10的几次方 在比例尺是1:6000000的中国地图上,量得两地间为10厘米,甲乙两列火车同时从两地相对开出,6小时后相遇,已知甲乙两车速度比为11:9,两车相遇时各行多少千米? 在比例尺是500000分之1的地图上,量得甲乙两地间的距离是4厘米,如果将这段实际距离画在比例尺是2000000分之1的地图上,应画多少厘米?十分钟内. 甲乙丙三个小朋友,甲的钱数比乙多408元,甲的钱数是乙的4倍,乙的钱数是丙的2倍,丙有多少元钱? 多少尺等于一码 在一副比例尺是500000分之1的地图上,量得甲、乙两地相距3.2厘米,甲乙两地的实际距离是多少千米?用两种方急怎么做还有用2种方法来算 1+1为什么等于100000 2510亿等于2.51乘10的几次方? 李明和张月都积攒了一些零用钱,两人所积攒的钱数比是9:5,然后李明花了48元,张月花了20元.这样他们剩的钱数相等,李明赞了多少钱? 1加到100000等于几? 一码等于多少毫米 在比例尺是300000/1的地图上量得甲、乙两地相距12cm,如果画在比例尺是1:4000000的地图上,两地相距多少cm 无纺布克重怎么算出米数? 1兆等于10的几次方?是数学数字上的一兆,等于10的几次方?就是多少个零.那是一兆等于一千? 在一幅比例尺是1:300000的地图上量得甲,乙两地的距离是5.5厘米如果改成1:500000的地图上.甲乙两地距离是快 99999-100000在什么情况下等于1我怎么认为是在算错的情况下才等于1呢 一个十位数各数位的十次方之和等于它本身,这个十位数是?···ABCDEFGHIJ是一个十位数,且等于A的十次方+B的十次方+C的十次方+……+J的十次方,求这个十位数···如果感觉太烦不想算给留下方法 小红和小明都攒积了一些零用钱.他们所积攒的钱数比是5:3,在献爱心活动中,小红捐了26圆,小明捐了10圆,这时他们钱数相等,小红原有多少钱? 宽1.6米80克无纺布1公斤有多少平方米 标题:一斤铁和一公斤棉花 哪个重?别以为很容易.很多人会错. 知道镀锌钢管一吨的价钱,怎样转换成一米的价格,要具体的公式和解释 无纺布35克一米五宽 一公斤等于多少米1.55宽的无纺布。刚刚打错了 一公斤煤等于多少卡谢谢了, 不锈钢管 不锈钢管价格今日不锈钢管信息 不锈钢管价格.任何地方都可以的,给我看看 ,真的很全,全是最新的不锈钢信息 克重40 幅宽2.4米的无纺布1公斤等于多少码 在为灾区人民捐款物中,小明也捐出了自己的五元零花钱,虽说不多,但(歇后语)
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn