为什么我们需要单元测试

程序猿的时间都花在哪儿了

程序猿是一种很神奇的生物,他们对于大自然的主要贡献是把垃圾食品和碳酸饮料转换为代码。那么这种生物每天的时间是如何度过的呢?如果你仔细观察,你会发现他们基本每天都会进行以下行为:看似莫名其妙的发呆、时不时的傻笑、以及与另一种叫做产品狗的生物撕逼。当然,他们偶尔也对着屏幕写一些多数人不能理解的英文符号,被称之为代码。
这可能在直觉上违反了很多人对于程序猿这种生物的印象,难道他们不是应该每天都在对着键盘狂敲不止么?其实还真不是,生产代码只是程序猿每天所花费时间的小部分,他们每天大多数时间可能用于思考为什么会有这么多奇怪的需求、理解这些奇怪的需求、以及为这些需求设计代码结构。当然,还有最最重要的,也是最花时间的,调试(debug)。
对于大多数程序来讲,改正错误通常是比较快的,但是找到错误在哪儿却通常都是噩梦一场。相信猿类们或者是与这种猿类一起生活过的其他生物们都会有这种经历——改错5分钟,找错2小时(甚至更长时间,比如通宵一晚上)。而且最头疼的是,当你修好了一个错误,总会有另一个错误出现,而且肯定要很久以后这只虫才会冒出来,那时又要重复一遍上述过程。

单元测试的意义

所以,有什么办法可以尽量让猿类避免陷入无穷无尽地找虫子的过程?单元测试是一种很好的手段。

单元测试是bug侦测器

良好的单元测试是强大的bug侦测器,能够大大缩减查找bug所需要的时间。因为修改了代码引入了新的bug,执行单元测试时会立刻出现错误。由于修改前的代码是可以正确运行的,那么错误就一定出在最近修改的这部分代码中,而刚刚修改的代码我们记忆犹新,并且分量也很小,所以很轻松就能找到错误。以前需要2小时才能找到的错误,现在只需要5分钟。

单元测试可以提高代码质量

这可能会让一些人困惑,测试与代码质量有什么关系呢?单元测试是你开发的功能的第一个用户。只有在使用代码时你才会发现代码的缺点。如果你的代码难以测试,那么它通常也难以使用。单元测试可以使你发现程序结构上问题,并在发布前优化。

单元测试可以提高开发速度

这又是一个听上去违反直觉的结论,但事实确实如此。难道编写更多的测试代码不会耗费时间么?当然会,但是编写测试所花费的时间绝对能得到超值的回报,不仅是在项目质量上,在进度上也是如此。频繁地进行单元测试可以让我们更早地发现问题所在,从而节省大量的调试时间,相比于花费一个晚上的睡眠时间找到一两个隐藏很深的bug,花费一点时间编写单元测试真是太值得了。而且从团队角度考虑,你提交的代码中的bug可能影响的并不只是你一个人,还会导致团队中的很多人都在一起找bug。什么,你说你写的程序从来没有bug?好吧,那我只好献上我的膝盖了(别扯了,是人写的程序就会有bug。什么,你说你不是人?那好吧...也许你真得是一只猿类)。

单元测试可以让我们自信地重构

如果没有单元测试,那么重构几乎是不可能完成的任务。因为你不知道你修改的哪行代码会导致整个项目不能运行。敏捷方法论的流行推动了迭代式开发的发展,而敏捷方法论的核心技术就是重构。因为敏捷方法更提倡垂直编写代码来生成一个有效的用例,而不是水平地编写代码来一层一层地提供服务。当你为一个独立的用例或者功能设计编写代码时,你的设计可能是符合这个特性的,但很可能就不符合下一个特性了。为了对所有特性都保持一致的设计,敏捷方法论提倡通过重构来根据需求调整代码。但是如何保证重构不损坏现有代码呢?答案就是单元测试。

少许测试就能获得惊人的收益

很多人都听过这么一句话:“任何测试都不能证明一个程序没有bug”。事实确实如此,但是这并不能成为不测试的理由,也并不能掩盖测试的优点。很多项目的截止日期比较紧,开发人员编写太多测试代码会影响项目的进度,但是少写胜过不写,对核心模块少许的单元测试就能获得惊人的收益。

避免过度测试

其实这不是单元测试的意义(或者说是优点?),而是很多新手同学会犯的错误。就像很多刚学设计模式的同学到处应用设计模式一样,很多刚学会单元测试的同学们喜欢追求100%的测试覆盖率。尽量多的测试当然不是坏事,但当测试数量达到一定程度后,继续增加测试带来的收益提升就会逐渐降低,如果试图编写太多的测试,你可能会因为工作量太大而气馁,并且会影响交付的进度。正确的做法是测试项目的核心模块和容易出错的边界情况。

所以我们需要单元测试

单元测试能让你尽早地发现bug,提升你的开发速度,提高你的代码质量,把你从无穷无尽的调试过程中解放出来,还能让你找到女朋友(因为你有更多的时间去约会)。总之,能让人过上更幸福的生活。那么还有什么理由不去写单元测试呢?

如何向领导推荐单元测试

其实我一直觉得推广单元测试的使用,甚至是强制规定代码的单元测试覆盖率应该是领导来推动的。因为编写单元测试是对项目有利无害的事情,公司的领导应该很喜欢这种对项目的质量和进度都有推进作用的行为。而且程序猿可以在写出难以理解、难以测试、饱含bug的代码库,然后拿了年终奖后拍拍屁股走人,但是项目后续还是需要有人维护的,腐败变质的代码总有一天会让团队付出惨痛的代价(就像击鼓传花,总会传到某个负责维护的人的时候项目的代码彻底不能维护了,于是这个人就背了所有人的锅)。不过如果你所在的公司或者部门没有写单元测试的习惯或规定,也不要紧,你可以向你的领导去推荐。
单元测试有这么多优点,通常来讲,开发经验更加丰富的领导很容易就能明白培养大家编写单元测试的习惯是多么有益(比如我向我的领导大力推荐单元测试时,我的领导就表示很支持,并向我投以了一个令人深思的微笑)。但如果你的领导是一个不懂装懂并且固执己见的老顽固,你可以面露微笑并向他竖起右手中指(千万别这么做!我是开玩笑的,这样很不礼貌,并且可能导致不可预料的后果。如果很不幸的,你已经这么做了,我也不会负责的)。你可以考虑离开这个部门或者这家公司,一个连单元测试都不写的技术团队,也不愿对技术人员和项目负责,并且领导还是个213,还是去刷刷题,准备迎接下一份工作吧。

如何编写单元测试

你以为我会在这里写一些单元测试的技巧?不不不,关于如何编写单元测试可以写一本书了(可能不止一本,我就知道很多关于单元测试和TDD方面的优秀书籍)。我的意思是,网上关于如何编写单元测试的博客已经足够多了(也许我以后也会写一篇),并且有那么多优秀的书籍,当我们了解了单元测试的优点以后,去学习如何编写单元测试就是很自然并且容易的事了。

参考

  1. 《重构 改善既有代码的设计》
  2. 《JUnit实战》(第二版)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,565评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,021评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,003评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,015评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,020评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,856评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,178评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,824评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,264评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,788评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,913评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,535评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,130评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,102评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,334评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,298评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,622评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,488评论 25 707
  • 先说项目开发过程中团队人员的分工协作。 一 人员安排 毕业至今的大部分项目都是独立完成,虽然也有和其他同事协作的时...
    SnowflakeCloud阅读 10,745评论 3 59
  • 目前移动广告盛行,各家各户都想着打造属于自己的移动广告平台,都想着成为国内移动广告行业的Admob和Mopub. ...
    举世混浊阅读 4,572评论 0 6
  • uwsgi配置文件格式 首先,uwsgi是可以完全不用配置文件,跟普通的shell命令一样,也可以正常使用,但是每...
    十三流阅读 3,118评论 0 0
  • 在我读小学的时候,学习成绩很差,最差的时候,数学曾经拿过0分,所以常常受到老师和家人的责备与不满。 也许是被骂多了...
    潇洒发哥阅读 427评论 3 5