(本文首发于InfoQ中文站:http://www.infoq.com/cn/news/2012/02/I-Hate-Unit-Test
)
说起单元测试的好处相信大家都能列举出不少,可是很多时候,开发人员面对自己产品的代码,想写单元测试却无从下手,久而久之,便会有人大喊:“我讨厌单元测试。”资深敏捷咨询师腾振宇
(Daniel Teng)在GTUG-TopGeek开发工程管理沙龙
就以此为题,结合最近的一个项目,和大家分享了他对单元测试的一些看法。
Daniel先介绍了下最近的一个项目,虽然不是遗留系统,但代码已经惨不忍睹,而且缺乏必要的测试保障,要修改代码可谓举步维艰。例如,一段代码和结对伙伴读了半小时没读懂,找来原作者看着注释又想了10分钟,终于才搞明白这段代码是做什么的。根据二八原则
,先找到那20%的点,修改它带来80%的价值。最直接的做法就是寻找代码库里最常被修改的文件,一般的文件只有几次修改,有的文件则被修改了几十次,每个人都在往复杂的代码里加入新的东西,但没有人往里面加测试,于是第一步就是为它增加测试。
很多开发者会说老项目就算了,如果新启动一个项目,我就会写单元测试了,Daniel认为这是一个“美好的梦想”,很多原因会打破它:
- 代码已经很烂了,又没办法下手了
- UI不好测
- 认为这是QA的工作
- 写的单元测试找不到Bug
- 代码的外部依赖太多
- 代码稍作修改,测试也要一并修改,太麻烦了
究其根本原因,是开发者根本不会写单元测试!满足什么标准的测试才是单元测试呢?根据《修改代码的艺术》
,需要访问数据库的测试不是
单元测试,需要访问网络的测试不是
单元测试,需要访问文件系统的测试不是
单元测试……
为了更方便地进行单元测试,业务代码应避免以下情况:
- 存在太多条件逻辑
- 构造函数中做的事情太多
- 存在太多全局状态
- 混杂了太多无关的逻辑
- 存在太多静态方法
- 存在过多外部依赖
例如,在代码中存在硬编码,或者是直接创建了一个数据库连接,这种做法都是比较危险的,因为在测试时没有办法“偷梁换柱”。
想要写好单元测试,学会重构是很重要的,重构的过程类似于清理厨房,虽然和做饭没太大关系,但可以让您下次做饭更方便,心情更好。可以重构的地方包括,在待测试类与其依赖之间增加一层Test Fixture;将创建逻辑与业务逻辑分开等等。重构可以采取以下策略:
- 编写测试代码建立基本的防护网。在单元测试和功能测试之间要有取舍,如果单元测试实施成本很高,可以先加功能测试。
- 通过增加中间层来打破依赖,不是为了去掉依赖,而是为了后续的修改以及测试的便利。
- 将第一步中编写的功能测试换成单元测试。
最后,Daniel还为大家提了一些建议:
- 项目里的破窗
要修好,别容忍别人加新的破窗,用测试将破窗保护起来。
- 当你离开一个地方的时候,要让它比你来的时候更整洁干净。(童子军军规)
- 不停地重构你的代码,每次走一小步。
随后有人提问,如何评估一个单元测试的质量,用代码行覆盖率是否可行。Daniel认为没必要去追求代码行覆盖率,真正要覆盖的是逻辑,而不是代码
行。通过结对编程可以减少低质量的单元测试,人都喜欢改变,但没人喜欢被改变,不要强求结对编程,让他看到好处,尝到甜头,吸引他来做结对编程,没有人喜
欢落后,比如50%的人在做结对了,剩下的人自然会想尝试。
当被问及单元测试是否是必须的时候,Daniel回答这并不是必要的,而是需要进行综合的衡量,比如你的竞争对手一周前推出了一个产品,你需要在一周内完成产品研发并上线,这时可以选择写或者不写单元测试,对于没有写过单元测试的人,一开始是需要上手的成本的。
如果您也对单元测试的话题感兴趣,不妨关注腾振宇的博客
和微博
,也可以观看会议视频
。
分享到:
相关推荐
简单介绍了振宇学院,主讲教师,及如何才能高薪就业。
(振宇软件)软件狗驱动 线束电检台安装研祥双核计算机wire程序所用驱动振宇
本讲座系统地阐述了xhtml网页结构创建中,最常用的信息收集标签-表单及其包含的各类输入标签的纯手工编码方法。最后通过一个案例,来全面演示了表单标签的实战应用。
新浪微博华振宇
从零开始,一步步地带着你设计职业生涯中的第一个最简单的网页。
描述 本文从社交媒体收集并处理了2012-...林振宇; 解吉波; 覃佐淼; 杨腾飞; 赵静. Evaluation data set for Hainan tourism scenic spots based on social media(V1). 2018. 2018-12-17. cstr:31253.11.sciencedb.714;
钱振宇的关于:电源线滤波的资料。介绍了:电源滤波中共模电感,共模电容的选择之类!
钱振宇大师的作品 EMC 课程 随堂课件, 介绍的非常详细
2013212122-匡振宇-英文2
大学生消费黄振宇.doc
Android笔记_基础_班振宇
暨 南 大 学本科生课程论文论文题目: 我要记账APP开发 学 院: 智能科学与工程学院 学 系: 计算机系 专 业: 信息安全 课程名称: 移动软件开发与安全
[Altium Designer 19(中文版) 电子设计速成实战宝典][郑振宇 等][电子课件]
2016年8月28日,第一届中国信息技术公益联盟峰会在深圳召开,这次峰会由腾讯志愿者协会、腾讯云、深圳市恩派非营利组织发展中心三方联合举办,现场三方宣布中国首个信息技术公益联盟成立,并向全社会发布《2016中国...
通过对网页源码的分析,来彻底了解网页的构成。
金工实习报告-材料学院高分子丙班肖振宇.doc
中学生元认知能力测试问卷的研究,庞超波,蒋振宇,元认知能力就是个体对自己的认知加工过程进行监控和调节的高级认知能力。本研究在文献梳理、理论分析的基础上,初步确立《中学生
个人认为选择符是css学习中一个难点。本讲座为大家详细讲解了这一知识点以及入门css的基础语法。
盒子模型与内外边距技术,对我们掌握标准化的div css布局技术至关重要。