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

在团队中进行单元测试/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

IDC:全球有1850万程序猿 4成爱好者在写代码 PHP开发框架流行度排名:Laravel居首 2013年度最强AngularJS资源合集 研发周报:回顾2013、技术栈的选择、开源成趋势 TIOBE 2014年1月编程语言排行榜:Transact-SQL力挫Objective-C 夺得桂冠 IBM:这五个智能技术的发展,将会改变我们生活 一周消息树: 微软的2013,Surface的2014 Amazon CTO Werner Vogels:云和SaaS正在快速风靡全球 “人类先知”Isaac Asimov 50年前的科技预测大多应验了 2014年10大Web设计趋势 Google野心:App Indexing改写应用搜索格局 Cocos2d-x,老牌引擎的新进化 Kingdom Rush创始人专访:游戏与电影元素混搭 超实用的JavaScript技巧及最佳实践(下) 盖茨和鲍尔默或成挑选微软新CEO的最大阻碍 移动开发进阶:触发式邮件深入分析 King.com传奇再续!Farm Heroes Saga强势登陆iOS、Android 2013综述稿:Clojure这一年及大事件 亚马逊AWS vs.谷歌GCE,彪的是价格? 2014,混合云被广泛采用的一年 传微软拉拢厂商推双启动系统手机 用户可选Windows Phone或Android 为什么游戏领域总是“抄抄抄”! 物竞天择、百家争鸣——评OpenStack生态圈 CES 2014:Intel针对可穿戴技术发布多款产品 直击CES:Pebble推金属版智能手表Pebble Steel 为4K智能电视而生:高通推出骁龙802处理器 英特尔首席执行官阐述可穿戴设备新技术及Edison计算平台 设计师如何写出更棒的项目建议 微软以1亿美元收购Parature“知识库” 登陆CES:三星发布智能家庭平台Smart Home CES 2014:GPS供应商Garmin推健康腕带Vivofit J2ME中文显示问题,急!! ado.net 我发现JSP一个奇怪的问题???想要看看吗???进来呀!!! 昨晚2点多一个mm突然打电话找我聊天,各位觉得我有戏没? 哪里有完整的MINE解码组件 为什么我装完FreeBSD系统启动时Sendmail启动的特别慢,telnet时也很慢。 小弟初学JSP,想搞点源代码来学习学习。 难搞的MIDAS 局域网的问题,急死了, vb中继承及分辨率问题 ASP里有没有带下拉框的输入框? 象素数据和图象数据 公司的一个数据库被人del,现在想查查是谁什么时候做的? 为什么我的窗口无法操作 关于oracle数据库增量备份土土的一问。 ArrayList问题 请教:在CB6下面怎么用 TMediaPlayer 控件来录音? 南开的vb习题集!!! 请问:如何在servlet中获得当前时间和当前日期?菜鸟问题,请见谅。 为什么我的opendialog不能返回filename,而返回了一个 $符号 大家对购买tcl笔记本等国产笔记本有没有什么建议? 第一次用vfp,新手提问? 请问哪位大虾知道,Crystal 7.0如何记忆上次打印该报表的打印机 纸张大小 纸张方向 边界设定等 如何自动生成新页? 显示器问题!! [代码发布]使用 Lostinet.SqlScope 4.0 实现高效的SQL SERVER应用程序 关于Decode函数的问题 WIN2000下的关机问题?请高手们想想办法! 寻找一个叫dingke的朋友,我将把邮箱给你,但我不小心弄丢了你的联系信箱,请速与我联系 请问:Dialog中可以重载LButtonDown事件吗? 如何用pb实现远程关机!!求救! 高分请教:zip密码遗忘 如何显示一个word 格式的文档,分不够可以再加 怎么获取本机IP。 ★★★★★调查最好的旅游地点!!★★★★★ 高分请教:zip密码遗忘 OUTLOOK公佈網路資料夾的問題 为什么我作的程序都无法运行呢?帮帮忙,多谢多谢 "select * from db where dm='000001' and scbz<>1 order by fsrq desc"为何会出错? 大家对购买tcl笔记本等国产笔记本有没有什么建议? WAP2.0与之前的版本有何不同? SQL2000如何解决还原数据库时的错误 工作台上打开数据库对话框中服务器项中的记忆性值...? 挑战无处不在!!!!!!!!!!!!!!!!!!!!! 这个程序是什么意思啊?? 请教:xml 不支持无值属性,以下我该怎么办。急,在线等。100分恭候 jb整合resin出现的难题! 永远的秋天 为什么我的openoffice中打的汉字无法在页面上显示? 请解释下面的问题 怎样把字符窜(edit.Text)转化为十六进制数 哪里能下载3元一个5元两个叫卖声 唐朝与日本、天竺交往最具有影响的两位使者的名字?宋朝对外贸易兴盛,政府设置的对外贸易机构是什么?其 下列事例与化学有关的是利用生物技术研制新药物白色污染石油炼制合成纤维精致服装面料农药、化肥的生产现代建筑、交通、军事等领域中的各种新型材料 谁能帮我做下危险品从业单位安全标准化学品考核评价标准的文件 一道离子反应题目1.向硫酸铝铵溶液中滴加氢氧化钠溶液,毫无疑问,氢氧化钠先和三价铝反应,然后问题出来了当铝离子完全转化为氢氧化铝沉淀后,氢氧化钠先和铵根反应还是先和氢氧化铝反 谁能帮我把这写详细点? 电离平衡的问题,C(H+)相等的强酸和弱酸与锌反应,开始时,为什么速率相等?开始后,为什么弱酸的反应速率大于强酸?加水稀释至同等倍数,为什么强酸的C(H+)变化大? 蹇材望“乡曲人皆能言之”什么意思 what's that supposed to meansupposed 我国甘肃玉门关以西,葱岭以东,新疆天山一带古时候被称为西域.请问,西域正式归属于中国中央政府管辖是在哪个朝代? 甘肃省玉门市的海拔高度是多少? 伦敦股市股指29日上涨欧洲强风暴抵达俄罗斯西北地区环保税引发民众暴力抗争 法国政府宣布农业主产区生产积极性不高 农业干部“黎巴嫩拒绝叙利亚化学武器进入其领土伦敦股市《金融时报》100种股票平均王正伟访问巴基斯坦德国法兰克福股市DAX指数29日上涨厄瓜多尔欲向斯诺登提供政治避难粮食主产区财政紧张陷怪圈:产粮越多经英国将发行伊斯兰债券 吸引中东投资者常熟近千出口企业 受惠退税率上调中国队憾别亚洲杯四强江苏生命科技创新园开展产学研交流履行社会责任评选 十佳杰出企业家及典下猛药治治“马虎病”江苏省人大常委会公告泗阳地税加强大企业管理与服务工作盐城:行政审批改革发力准落地实南京8万套保障房建成互联网成“假冒伪劣”高发地铜山供电: 为返乡务工者排用电隐患
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘