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

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

VB制作VB安装程序问答(二) VB制作VB安装程序问答(一) VB制作帮助文件速成 重新验证 Win 95 用户口令 -VB资料 桌面的大小 -VB资料 字体改变事件 -VB资料 自定义组合热键 -VB资料 自动更换墙纸的小软件-VB资料 自动记录应用软件工作时间 -VB资料 自动卷动TextBox -VB资料 自动开始上次关机时关闭的应用 -VB资料 自动装入注册设置 -VB资料 自己编程模拟 MouseEnter,MouseExit 事件 -VB资料 走进VB6啃一块骨头 做成一个时间限制的测试版 -VB资料 PHP中利用jQuery实现SWF图像上传和裁剪 VB.NET或C#将DataSet快速导出到Excel中 HashSet的equals和hashCode重写问题 PendingIntent实现原理和代码 IntentService实现原理及内部代码 AsyncTask实现原理和内部代码 Neither user nor current process错误 ListView的右边滚动滑块启用方法 Live Wallpaper动态壁纸开发 控制软键盘显示和隐藏 设置Activity大小不再全屏原理 Android面试题,看看你基础如何? Android Canvas绘图抗锯齿解决方法 Android xliff和字符串资源 android.hardware.USB类介绍 Android开发经验谈之应用间数据共享 国外有没有类似http://bbs.51soft.com/的大的软件讨论站? 格式化字符串的问题 菜鸟 Combobox中如何设置默认值? 如果你是新手! [流氓兄:突然冒出很多新人。。。贴] 请转这里 菜鸟 一个有难度的问题 关于格式化字符串的问题。。。 MYSQL权限与mysql库里的所有表问题~!~!请指教! Installshield中怎样调用MSI文件,并能执行MSI文件 售书 鼠标指针的问题(菜鸟问) 向CList模板类的对象追加节点时出现异常,谁惹的祸??? 为什么我的VB运行时会清空剪贴板? 大侠求救!我的考试题!20分的!急急急急急急急急! 目前asp中使用的主要加密算法有哪些? 怎样设置tab! 关于vb的问题,谢谢大家了。 计算机操作者的食谱(想想大家每天都对着电脑,看看这个食谱吧,或许有好处,人还是要学会爱护自己) 如何将png文件格式转换成bmp文件格式,小弟急需这方面的资料,尤其是关于压缩方面的 关于在存储过程中调用链接服务器权限的问题 用vb打包程序打包后安装出错,运行不了? 我要独自去广州发展,请大家看看我的情况,给我一些帮助,如何在广州找工作? 求助!请问谁有源代码?(画一个线段、图形区域填充、图形区域截剪) 物价飞涨,福建省软考提价!!! 在数据表里,我保存了图片存放的路径,现在我想让他显示出来,怎么做啊?有几个方法啊,请指点 阿沐进来看看,你要的东西 VC++ ADO用SELECT FOR UPDATE锁定Oracle数据库的记录,为什么无效? 关于CGI连接关系数据库? 关于动态链接库一问,释放时的异常 阿沐进来看看2 怎样才能不添加OCX和DLL做出反色效果? 好奇怪的问题,大家帮忙来分析一下 阿沐进来看看3 !!再次求解,关于ADO!! 高分求解!高手请进!疑难杂诊? 在LINUX下,如何修改屏幕分辨率 请教如何将图片插入到sqlserver 7/2000里? 急急急!UDP的问题 有关ISA SERVER 昨晚做了个大梦,哈哈!! 疑问 JINI究竟是什么东东呀?去SUN看了半天也没能明白,谁能解释一下? vb.net的一个问题!!是关于在form1上写字的东西! 关于如何输入的问题*******vb高手请进***************(在线等候,我只有这么多分了) 简单的问题,textbox取不到值。 关于DIALOG对话框的继承问题 。 Response->SetCookieField()可以将用户登陆信息保存在cookie内,可是... 为什么我用AddString()无法为Combo Box添加上新项? 请问程序员中有多少是喜欢打《帝国时代》的,我是一个,请报名,谈谈感受。 文件读写:前一部分是文肩头,含几个概括性数据;后一部分是数量不定的大量整形数据。该怎么办?我想用块读写的方式,不知可否?解决了保 烟火的意义是什么? 节日的礼花是化学变化吗?霓虹灯呢? 去年冬天,学校的一根内直径 2 厘米的自来 水管被冻裂,导致大量水流失.水管内的水流速度为每秒8cm,如果一小时修不好,将会浪费多少升水? 锌粉和一些化学物质的水溶液能发生反应吗锌粉遇到水会生成氢气,那锌粉遇到酒精和水的混合溶液是不是也会先和水发生反应?和硫氰酸钠溶液呢?和稀硝酸是不是也能够直接生成氢气呢?反应 水压测试泵怎么用? 只管向前奔跑阅读答案 洗煤厂在洗选炼焦用煤时可以加无烟煤吗(为了降低灰份或挥发份)? 焰火表演是不是化学变化?霓虹灯表演呢?怎么区分. 穷人续写;西蒙的两个孩子长大以后知道了事情的真相,报答了渔夫和桑娜,从此过上了幸福的生活高手来垃圾滚 烟煤的灰份是多少? 下列色彩是由化学变化呈现出来的是 A雨后彩虹 B夜晚的霓虹灯 C节日的礼花 D彩色的图画 应该选C请好心人逐个选项讲解一下.谢谢了,很急,我就这儿不懂,九上化学好糊涂呀,谢谢了,急呀,好心 桑娜对渔夫说:咱们的邻居西蒙死了?”改为他人称转述句 真正的挤塑板的导热系数是多少? 下列景象伴随有化学变化的是 1.五光十色的烟火礼花 2.不断闪烁的霓虹灯 3.变化无穷的音乐喷泉 4.满屋飘香下列景象伴随有化学变化的是1.五光十色的烟火礼花 2.不断闪烁的霓虹灯 3.变化无 《穷人》想象:桑娜和渔夫收养西蒙的两个孩子后会发现什么?桑娜用头巾裹住睡着的孩子,把他们抱回家里.她的心跳得很厉害,她自己也不知道为什么要这样做,但是她觉得非这样做不可.回到家 作为外墙保温材料,挤塑板比聚苯板有哪些优点? 为什么霓虹灯是不同颜色的? 用尺子做一个证明响度与振幅有关的实验1.实验器材2. 地球是不是个原子或分子?或者是电子?我说的是比如说我们的宇宙在一个生物体内,银河系在这个生物的某个组织的某个细胞的里,是构成这个细胞结构的分子结构,或者原子结构或者其他 某同学用自来水制蒸馏水左边是一个带单孔橡皮塞的试管,中间是一根左端90°的导气管,右端插在另一个试管里,这个试管放在一个烧杯里?问 :该装置的玻璃导管较长,除导气外,其作用是?问: 空心菜的药用价值和营养价值? 地球大约有多少原子要数据,不要公式! 如何制出蒸馏水 请问蔬菜中空心菜和茄子有什么营养价值? 地球的原子数量有多少大概在多少数量级 制蒸馏水是什么变化 空心菜的营养成分是什么麻烦写出能量、水分、蛋白质、脂肪、糖类、胡萝卜素、维生素A、维生素B1、维生素B2、维生素C、维生素E、钙、铁、锌、磷、硒 原子为什么都是一样大?没有像地球一样大的原子吗?说错了,是核子 需要什么原料,具体步骤是什么, 一个人的奔跑 家因水压低,要安装水压泵,两层半(400平方).请介绍我家住楼顶的两层,水压一直不够,现在想安装水泵.但对这些没什么研究.最主要输出功率不知要多小.共400平方用.之前看了台湾华乐士水泵TQ400 空心菜什么营养 奔跑的雪糕阅读答案用简洁的语言概括中心事件2.文章以奔跑的雪糕为题目,有什么作用3.结合语境,品味句中加点词语的表达效果终于,在车站附近的一个超市里,父亲找到了一个装满雪糕、冰 如何用2字词语形容礼炮 如何用自来水制医用蒸馏水? 《穷人》桑娜和渔夫的性格 烟花用什么词语修饰最好.如题. 家里水压太小怎么办 《穷人》桑娜和渔夫是怎样的人 形容烟花味道的词语有哪些?要好的,不要说臭。 家里水压太低怎么办 穷人 桑娜和渔夫是什么样的人 描写礼花的诗句最好是直接描写的句子 空心菜怎么炒好吃 自来水水压不够该找哪个部门啊?我是济南的我住在闫千户小区 形容烟花美丽的词语有哪些? 清炒空心菜怎么做好吃?我是先放油,然后放大蒜,然后下空心菜,炒啊炒,干的话放点点水,结果出来的结果 不像饭店吃的那么绿,是有点发灰了.并且远不及饭店好吃. 穷人里渔夫,桑娜,西蒙分别有什么品质?秒之!行的话加悬赏 锌粉与氧化钙反应生成氢气吗? 只管向前奔跑 对题目有怎样的理解第二段写到:“贝基拉不知不觉地……他既羡慕又难过”根据对文中内容的理解,描写贝基拉此时的心理活动要求以第一人称完成一段60字的文字 自来水水压不够如何使用太阳能 空心菜的做法? 只管向前奔跑答案 刚刚水杯打碎,昨天才打碎一个杯子…请问这是什么兆头?刚刚放电脑睡觉的时候不小心吧水杯打碎,昨天刚刚打碎一个茶瓶, 阻燃膨胀聚苯板导热系数是多少 关于摩擦力做功的下列说法中正确的是A滑动摩擦力阻碍物体的相对A滑动摩擦力阻碍物体的相对运动,一定做负功b 静摩擦力和滑动摩擦力一定做负功c静摩擦力阻碍物体的相对运动趋势的作用, 大陆为什么昼夜温差大? 电子,银河系,地球,原子,太阳系,分子按从小到大顺序排列,该如何排? 白菜+青菜+空心菜=什么菜 先导式溢流阀中的先导是什么意思?为什么有的溢流阀有个调节压力的?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘