• 2004-04-27

    单元测试的习惯

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/155572.html

    potian关于“单元测试”的话题,一呼百应。没人会在乎再多我一个吧!

    在我看来,单元测试只是一个习惯。
    如果谁胆敢站出来指责单元测试存在的必要性,恐怕只会遭来骂声无数。
    那为什么还有人拒绝着单元测试呢?
    习惯。

    习惯中单元测试不是程序员的事
    念书时最令我犯困的就是《软件工程》,而单元测试就是《软件工程》讲的东西,所以,单元测试一定属于那帮有闲心的专家才去研究的东西,跟我关系不大。就这样,单元测试就轻松的被划在程序员的基本技能之外。再说了,我们这里有专门的测试人员,我把测试的活都干了,他们岂不失业了,社会要有分工,不是吗?

    习惯中单元测试与XP联系在一起
    每每提及单元测试,听说过诸如“测试先行、测试驱动开发”之类名词的我们总是情不自禁的把它和XP划上一个等号。我们这里不兴这一套,约束我们的是CMM、ISO之类的东西,没有条件,你叫我如何XP?既然不可能XP了,单元测试也算了吧!

    习惯中单元测试不正经
    单元测试在最终运行的代码中不起任何作用,一点CPU时间都不占,让我花费时间编写这些最终不用的代码,还是省省吧!再说了,项目这么紧,上面的领导成天催我,只编写功能代码我都不敢保证按时完成,叫我编写单元测试,没时间。程序员的优点之一,就是懒惰,所以,我更不会去编写单元测试了。

    习惯中没有单元测试也很好
    我写程序也不是一天两天,这么多年都没有单元测试,我的日子也不错,工资一点都不低。一旦出了bug,我操起debugger就可以搞定,虽然有时候花得时间稍微长了一些。再说,即便你写单元测试就能保证没bug了,你信吗?《The Pragmatic Programmer》有云:“You Can't Write Perfect Software”。

    习惯中不知如何单元测试
    OK,我已经经历了太多关于单元测试的轰炸,我已经开始尝试在日常工作中编写单元测试。但是我该如何编写单元测试呢?这帮“广告人”都在宣传测试驱动开发,这到底是咋回事?我怎么能在编写代码之前编写测试呢?东西都没有,我测啥?

    习惯中有些单元测试编写起来困难重重
    你看,这个部分需要这个部分、这个部分和那个部分,我把它们合起来和把整个系统整合起来难度差不多,这叫单元测试吗?那些书上写的例子,都是简单的功能,一点都不实在。要访问外部文件怎么测?要访问数据库怎么测?要和外部实体通信怎么测?

    我怎么会想到这些?没什么好奇怪的,我以前就是这么想的。
    与其说是习惯,不如是一种误解。对于“不到黄河不死心”的程序员来说,没有什么比撞得头破血流更能刻骨铭心了。
    以前我也知道单元测试,也知道它的重要,但我对空穴来风不是很感兴趣。
    让我接受单元测试的是Martin Flower的《重构》,凭借单元测试保证代码重构的正确性,因为重构带来的优美让我顺便接受了单元测试。
    让我接受测试驱动开发的是Robert Martin的《敏捷软件开发》,书中的一个例子刚好点了我的死穴,和我遇到的问题一摸一样。

    其实,测试驱动开发是个很简单的过程,只要掌握了”红、绿、重构”的节奏可以说就掌握了测试驱动开发,只是这不同于之前那种直取要害的做法,想要把它融入自己的血液中还是需要做一些思维习惯上的改变。
    又是习惯!

    分享到:

    历史上的今天:

    非喜欢项目 2009-04-27
    引用地址:

    评论

  • 我们项目组的情况就是单元测试虽然覆盖率100%,但是压根不考虑边界覆盖,分支覆盖等,结果导致系统测试还是一堆问题。
    回复jhhuawei说:
    好问题!单元测试并不是银弹,并不是有了单元测试就解决所有的问题。你所说的问题,一方面是开发者对测试并没有很好的认识,换句话说,思维并不严谨,另一方面,单元测试很大程度上,决定于单元的稳定程度,本质上,这是一个设计问题。
    2009-08-09 13:04:25
  • 习惯有时候是谋杀一个人思维的可怕武器
  • 我不知道大家有没有注意到XP中的单元测试和传统意义上的单元测试有着本质的区别。实际上XP中的这个东西不应该叫做单元测试,偏偏来混淆视听。
    回复charon说:
    呵呵,charon的说法似乎是欲言又止,如果你可以谈谈自己的看法,说说你眼中的不同!
    2004-04-30 08:49:56
  • 我看关键的原因不在于是不是习惯,而在于单元测试到底是什么东西。

    现在有一种强烈的趋势把单元测试看作是一种不需要专业训练的简单技能,最终导致大部分所编写的测试用例实际上并不能显著提高软件可信性。

    单元测试很重要,但绝不是说有个这样的形式就算完了,否则只能越来越败坏单元测试的名声。
  • 为什么有人拒绝单元测试?程序员的习惯或者说惰性是一个原因,国内很多公司急功近利的做法也滋养了这样的程序员群体,这些公司的老板认为编写测时代码要付出额外的工作量,唉,他们应该记住这句话:优良的测试可以极大的提高开发效率。
    回复射覆请客说:
    你的想法不错,但只有见到真金白银,人们才会心动,说教多半是不管用的。
    2004-04-28 13:04:18