三月份,准备搞一个C/C++单元测试在线培训,草拟了一份课程提纲,发给一位老朋友(马工)征求意见,马工在一家研究院工作,领导一个近百人的开发团队,单元测试推广和实施都很有经验,给我的意见只有几句话:
  “删除开源框架部分,这个太昂贵,用的企业会越来越少,讲这个浪费听众的时间。我猜你花一大段时间来讲开源框架,目的仅仅是为了减少宣传商业工具的嫌疑,课程只要考虑听众的真正利益(学到有用的东西)行,何必考虑别的。”
  课程内容删除开源框架部分,这个我马上接受,因为当初加上这部分内容,原因正是马工所猜的。不过,用“太昂贵”来形容免费的开源框架,有些匪夷所思,我知道用开源框架做C/C++单元测试很难且成本很高,但从没想到“昂贵”这个词。在电话里和马工聊了半天,讨论了C/C++单元测试框架“太昂贵”的理由,整理如下。
  免费的反而“昂贵”,这很平常,比如企业要派一个人从成都到北京出差,可以坐飞机、坐火车、租汽车,也可以借一辆自行车骑过去,前几种都是要付钱的,骑自行车免费,毫无疑问,骑自行车是昂贵的,“昂贵”表现在:费钱(不算别的,工资很吓人)、费力(这种累死人的事谁愿意干?)、误事(这个不用解释吧?)。[点评:我个比喻我也用过,不过没那么透彻,真是有实践者所见略同]
  使用C/C++单元测试框架做单元测试,其结果跟骑自行车很像,也是费钱、费力、误事。
  费钱:工具可以免费,人才不能免费,相反,人才极昂贵,而且越来越昂贵。一个程序员,如果月薪1万,企业实际要支付的全部成本为1.5到2万,折算成每小时的成本,大概是100元,也是说,写1小时的测试代码,企业要付出100元,这是使用开源框架的成本,是不是比自动化工具昂贵得多?[反驳:用工资低的实习生或初级程序员来写测试代码,成本不降低了吗?答:那别做单元测试了,单元测试是程序员自己做的,要边开发边做,越是重要的程序员越要做(因为他写的代码也越重要),事后让别人做单元测试,那是毫无意义的,除非每个函数都有非常详细的文档,可是谁做得到?]
  费力:程序员为什么不愿“写”单元测试?请注意,是“写”单元测试,不是“做”单元测试。程序员不是不知道单元测试的好,而是不愿意写测试代码,因为太烦了。程序员不怕难,怕烦。创造往往很难,但却是程序员的爱,也是程序员的价值所在。测试代码既然用工具都可以生成,自然没有创造性,程序员怎么可能喜欢写呢?让程序员做自己很不喜欢做的事,这是很累人的,特别费力。
  误事:误事表现在三方面:
  一、花很多时间来写测试代码,延长了项目的周期,严重时可能失去市场机会。
  二、太费力,程序员可能消极应对,终做不下去,折腾很长时间,又回到原点。
  三、测试不充分,很多测试点,是手工编写代码难以达到的,举个简单的例子,要让malloc()在第一个用例返回NULL,其他用例正常申请内存,手工编写代码很难做到。用开源框架,完成代码覆盖都几乎不可能,而使用合适的商业工具,完成MCDC覆盖一点也不困难。