走进单元测试(1):为什么难以广泛应用?

这几天在北京参加Qcon,觉得Scrum和敏捷在这里提到的比较多,而单元测试作为敏捷方法的一个重要配套工具,了解和真正进入实施的却并不是很多。

 

这里并不想告诉你如何做单元测试,这样的文章园子里已经一搜一大把,我没有再写这种的必要。开这个系列,首先是因为我进入了公司的技术创新组,目前主要负责单元测试这块,以期记录自己的成长;二是希望借这个系列,能够为大家带来一些真实的单元测试用例的设计方法和在设计用例中遇到的问题,以及解决问题的方法。

 

在我6年的技术工作中,如果问我什么技术对我的影响最大,我会毫不犹豫的说是单元测试。我比大多数人幸运的地方就是我的第一份写代码的工作就是编写单元测试;没错,是单元测试,尽管不是TDD的实践。但至少为我理解TDD打下了一个坚实的基础。而6年来,我一直希望能够有一个地方可以真正的将这些东西用起来,现在来看暂时算是等到了希望。

 

我辗转过很多公司,也曾经提过很多次关于单元测试的问题。然而每每提及的时候会得到支持,但最终实施都不了了之。我一直在思索为什么?为什么一个明明觉得很好的东西大家都嘴上说好而就一直不肯去实践?下面是我认为的几个原因:

 

1、开发成本的高昂。单元测试会加重开发人员的负担,因为有了更多的代码需要编写。而这种成本的增加在小作坊是一个很重的负担,毕竟对于他们生存是第一要务。即使是在大公司,鉴于很多人没有这样的经验,因此培训和指导如何编写单元测试也是一块很大的成本。

 

2、时间上的紧迫。从一个软件项目的角度来看,尽管编码所占的时间并不多。但如果是一个小的软件作坊形式的公司,其生存的要点在于能够短平快的做完项目,实施单元测试会延长项目的交付时间。即使是在一个比较规范性的公司,由于客户或者内部需求的时间压力,也很多时候只能选择放弃采用这样的过程,毕竟满足客户需求才是项目的最终目标。

 

3、开发人员的素质。为什么会有这一条,是因为接触过很多人开发人员,他们仅仅把完成任务当做目标,他们希望的就是尽量以自己熟悉的方式来尽快完成任务,剩下的时间就可以做自己的事了。而这部分人恰恰却是推动过程中的最大阻力。如何说服他们,采取什么措施,后面的系列可能会有这方面的思考。

 

鉴于中国的软件公司多数还处于小作坊时代以及开发人员的素养还有待提高,我一直比较悲观的认为,就不说敏捷了,就是单元测试的普及,在中国还有很长的路要走。我也希望自己的这个系列,能够为这个事情的推动尽自己的绵薄之力!

posted @ 2010-04-25 08:31 阅读(2077) 评论(17) 编辑 收藏

在中国,从上到下的开发工作安排从来没这项,到开发了,你提出来了,谁还有时间去搞?我感觉不是大家刻意去拒绝,实在是在中国的公司里,没有空闲的工作时间,你难道指望大家加班做这个事情?
 回复 引用 查看   
#2楼2010-04-25 08:59 | 暮夏      
强烈支持,期待下面的系列。
 回复 引用 查看   
#3楼2010-04-25 10:06 | 型格小妖      
lz说的大实话
 回复 引用 查看   
#4楼2010-04-25 10:21 | killkill      
LZ 说得很好,单元测试很美好,但是,时间和成本方面导致它难以推广
 回复 引用 查看   
#5楼2010-04-25 11:40 | 深山老林      
期待下面的精彩文章。
 回复 引用 查看   
#6楼2010-04-25 11:55 | xiaochong4      
还有小公司的设计都是程序员即兴发挥,一般只有业务的要求。很难在做架构的时候就要求对哪些类,哪些方法测试。怎么编测试用例。
 回复 引用 查看   
#7楼2010-04-25 12:02 | 户籍民警      
想的很好,但公司规模达不到,项目人手也少,需求更是乱七八糟,咋做啊
 回复 引用 查看   
#8楼2010-04-25 12:19 | wade black      
我们这开发人员兼职单元测试人员
 回复 引用 查看   
#9楼2010-04-25 12:22 | 追萝驴      
期待LZ的后续。
归根结底,固然上面说的都是原因,但最根本的原因是没有能够充分自动化的自动测试引擎。整个开发阶段代码从无到有都在不停的变化,哪怕初期用工具生成测试代码,随着后期项目的不断推进,越来越多的测试代码确需要手动更新,将占用大量的无谓时间。
现在有很多好的工具能够辅助单元测试了,Mock框架就不用说,连自动生成对象并赋值的东东都有,只有上面那个随需而变的需求一直没有一个很好的解决方案,我一直在关注Spec Explorer这样的工具,觉得可能这样的工具才是答案。

 回复 引用 查看   
#10楼2010-04-25 16:37 |       
单元测试。很难。因为

1. 大部分项目是一次性使用,就像一次性筷子,出来了就结束了。基本没有后期维护。
所以不需要单元测试。

2. 大部分项目变动的很大,ver1到ver2,有可能50%的代码会变化,单元测试变成了费码。

这个问题和我们社会现象有关(国人劣根性?)为什么有三鹿、苏丹红、有毒筷子,就为什么单元测试推广不起来。

如果每个中国人能像外国人一样愚蠢,老老实实干本行,那么TDD会推广的很快的。

 回复 引用 查看   
#11楼2010-04-25 16:55 |       
单元测试。很难。因为

1. 大部分项目是一次性使用,就像一次性筷子,出来了就结束了。基本没有后期维护。
所以不需要单元测试。

2. 大部分项目变动的很大,ver1到ver2,有可能50%的代码会变化,单元测试变成了费码。

这个问题和我们社会现象有关(国人劣根性?)为什么有三鹿、苏丹红、有毒筷子,就为什么单元测试推广不起来。

如果每个中国人能像外国人一样愚蠢,老老实实干本行,那么TDD会推广的很快的。

 回复 引用 查看   
#12楼2010-04-25 16:57 |       
如果要推广TDD,只有一种方法。就是让TDD和现在我们一种经常操作、需要的东西结合。这样我们接受TDD就变得容易了。
 回复 引用 查看   
#13楼2010-04-25 21:11 | /aiq浪子飞龙      
支持楼主,推广单元测试!
 回复 引用 查看   
#14楼[楼主]2010-04-26 15:28 |       
引用辰:
2. 大部分项目变动的很大,ver1到ver2,有可能50%的代码会变化,单元测试变成了费码。

这个问题和我们社会现象有关(国人劣根性?)为什么有三鹿、苏丹红、有毒筷子,就为什么单元测试推广不起来。


如果你认为单元测试的代码变成了费码,那我能肯定你没理解单元测试,只是凭着自己的想象在臆断。这个问题我会在后面阐述。

另外针对最后一句,不要任何东西都扯上劣根性,站在经济层面上看三鹿、苏丹红等问题,你会得到另一个答案,因为资本的唯一目的就是获利,至于道德,那不过是人类强加的而已。


 回复 引用 查看   
#15楼2010-04-26 16:00 | banban      
期待后续的文章哈! :)
 回复 引用 查看   
#16楼2010-04-26 17:10 | 苍岚      
引用枫:
引用辰:
2. 大部分项目变动的很大,ver1到ver2,有可能50%的代码会变化,单元测试变成了费码。

这个问题和我们社会现象有关(国人劣根性?)为什么有三鹿、苏丹红、有毒筷子,就为什么单元测试推广不起来。


如果你认为单元测试的代码变成了费码,那我能肯定你没理解单元测试,只是凭着自己的想象在臆断。这个问题我会在后面阐述。

另外针对最后一句,不要任何东西都扯上劣根性,站在经济层面上看三鹿、苏丹红等问题,你会得到另一个答案,因为资本的唯一目的就是获利,至于道德,那不过是人类强加的而已。



纯顶

 回复 引用 查看   
#17楼2010-06-03 20:21 | richardzeng      
的确很多的公司不重视单元测试,导致在测试方面就想到GUI层面的自动化测试。最终导致自动化测试成为空谈。