`
DigitalSonic
  • 浏览: 214633 次
社区版块
存档分类
最新评论

我讨厌单元测试:滕振宇谈如何进行单元测试

阅读更多

(本文首发于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回答这并不是必要的,而是需要进行综合的衡量,比如你的竞争对手一周前推出了一个产品,你需要在一周内完成产品研发并上线,这时可以选择写或者不写单元测试,对于没有写过单元测试的人,一开始是需要上手的成本的。

如果您也对单元测试的话题感兴趣,不妨关注腾振宇的博客微博 ,也可以观看会议视频

分享到:
评论

相关推荐

    郜振宇php职业培训系列讲座001:振宇学院与高薪就业.rar

    【振宇学院与高薪就业】是郜振宇php职业培训系列讲座的第一部分,这个讲座主要聚焦于PHP技术的学习和职业发展路径。郜振宇,作为主讲教师,以其丰富的行业经验和教学成果,旨在帮助学员深入理解PHP语言,并提供一条...

    新浪微博华振宇

    5. **社交媒体策略**:学习华振宇如何有效地利用微博进行信息传播和社交互动,可以帮助其他人优化自己的社交媒体策略。 6. **网络社区研究**:华振宇的微博账号及其互动情况可以作为一个案例,用于研究网络社区的...

    (振宇软件)软件狗驱动

    【振宇软件】软件狗驱动是一款专为线束电检台安装在研祥双核计算机上运行wire程序而设计的驱动程序。软件狗通常是一种硬件设备,用于保护软件免受非法复制和使用,它通过与计算机的USB接口连接,提供一种加密认证...

    郜振宇php职业培训系列讲座002:设计你职业生涯中的第一个网页.rar

    5. 开发工具:熟悉使用文本编辑器(如Visual Studio Code、Sublime Text等)编写代码,以及使用浏览器的开发者工具进行调试。 6. 测试与发布:学习如何预览网页(使用本地服务器如XAMPP),以及如何将网页上传到Web...

    郜振宇php职业培训系列讲座005:xhtml表单精讲与案例实战.rar

    在本讲座"郜振宇php职业培训系列讲座005:xhtml表单精讲与案例实战"中,我们深入探讨了XHTML(eXtensible Hypertext Markup Language)这一重要的网页制作技术,特别是它的核心元素——表单。XHTML是HTML的一个严格...

    钱振宇 EMC 静电放电 课程

    钱振宇大师在课程中还提到了相关的其他国际标准IEC801-2,这可能是一个笔误,因为IEC 801系列标准的正式名称应为IEC 61000-4-x系列,其中x代表了不同的测试类型,例如x=2代表静电放电,x=3代表电快速瞬变脉冲群测试...

    基于社交媒体的海南旅游景区评价数据集.zip

    描述 本文从社交媒体收集并处理了2012-...林振宇; 解吉波; 覃佐淼; 杨腾飞; 赵静. Evaluation data set for Hainan tourism scenic spots based on social media(V1). 2018. 2018-12-17. cstr:31253.11.sciencedb.714;

    2019051116冯振宇1

    这篇论文由学生冯振宇于2021~2022学年第一学期完成,旨在探讨并实现一个方便用户记录日常收支的移动端应用。 **1. 软件需求及功能分析** 在开发“我要记账”APP时,首要任务是对软件的需求进行深入理解。这包括识别...

    郜振宇php职业培训系列讲座011:css网页布局与7个案例.rar

    【CSS网页布局与7个案例】是郜振宇php职业培训系列讲座的第11讲,专注于探讨如何利用CSS(层叠样式表)进行高效、美观的网页布局设计。在这个讲座中,郜振宇老师将通过一系列实际的案例,帮助学习者深入理解CSS在...

    2013212122-匡振宇-英文2

    《考试成绩管理系统软件需求规格说明书》 本文档是针对“2013212122-匡振宇”项目——一个英文版的考试成绩管理系统软件的...在实际开发过程中,还需根据用户反馈和测试结果进行适时调整,确保软件的质量和适用性。

    郜振宇php职业培训系列讲座007:css基础语法与选择符详解.rar

    本讲座“郜振宇php职业培训系列讲座007:css基础语法与选择符详解”专注于CSS的基础知识,特别是选择符这一关键概念。 选择符是CSS中的核心元素,用于选取我们想要应用样式的HTML元素。理解并熟练运用选择符是精通...

    郜振宇php职业培训系列讲座004:1天搞定xhtml基础标签与编码规范.rar

    在本课程"郜振宇php职业培训系列讲座004:1天搞定xhtml基础标签与编码规范"中,郜振宇老师深入浅出地介绍了XHTML这一网页制作的重要语言,帮助初学者快速掌握其基本标签和编码规范。XHTML是XML与HTML的结合体,它...

    郜振宇php职业培训系列讲座003:网页源码分析.rar

    在本讲座中,“郜振宇php职业培训系列讲座003:网页源码分析”将带你深入理解网页的内部构造,通过源码分析这一实践性强的学习方式,让你真正掌握网页制作的核心技术。网页源码是网页的基础,它包含了HTML、CSS和...

    郜振宇php职业培训系列讲座006:玩转html中的框架应用.rar

    接着,讲师可能会讲解如何在框架内进行导航。`<noframes>`标签用于为不支持框架的浏览器提供备选内容。此外,可以通过`target`属性指定链接打开的位置,比如`target="_top"`会使得链接在父窗口中打开,覆盖所有框架...

    郜振宇php职业培训系列讲座009:div盒子模型与内外边距精讲.rar

    本讲座“郜振宇php职业培训系列讲座009:div盒子模型与内外边距精讲”着重讲解了两个核心的CSS概念:盒子模型和内外边距,这对于构建响应式、标准化的网页布局至关重要。 首先,让我们深入理解盒子模型。在Web设计...

    《敬畏生命》同步测试【部编人教版七年级道德与法治上册】.pdf

    12. **孔振宇的故事**:孔振宇的故事展示了即使在生命的最后阶段,仍能以积极态度对待生活,并愿意帮助他人,他的行为启发我们珍惜每一天,关心他人,传递生命的价值。 综上所述,敬畏生命是个人品德和社会伦理的...

    郜振宇php职业培训系列讲座008:css边框与背景设置详解与实战.rar

    本次郜振宇php职业培训系列讲座第008部分专门针对CSS中的边框与背景设置进行了深入的讲解和实战演示,帮助学习者更好地掌握这两项核心技能。 首先,让我们来了解CSS中的边框(Borders)。边框是元素四周的可见边缘...

Global site tag (gtag.js) - Google Analytics