所有的开发人员都会说单元测试很重要,很有必要。但实际落地的却很少。这个是一个诡异的现象。
在中国的互联网公司很难找到单元测试覆盖率到20%以上的情况。
很多西方企业都会写单元测试,每个人都知道这是非常基本的事情。但中国工程师们多数不编写单元测试!每项代码提交都指望 QA 部门的手动测试。
国内互联网企业近年来快速崛起,2018 年初 Mary Meeker 的年度互联网报告里面,Top 20 市值 / 估值的互联网公司中国占了一半。国内互联网企业更强调在业务模式上的创新。在软件开发流程上,要求迭代速度比不出问题更重要。如果出了问题,能尽快定位,快速修补,减少影响;用最快的迭代速度开发,再收集用户的反馈,来确定这个产品的功能要不要或怎么改;这种快速试错的模式下,在交付日期和新需求不断涌入的压力下不得不舍弃比较可能导致延期交付的“测试”环节。
中国企业的产品团队往往人员更多,也更倾向于依靠运营团队推动业务增长;这一点与美国被动加数据驱动的增长思路不太一样。中美科技企业之间的主要差异,是中国企业对人力的依赖性更高,这个优势也是中国企业得以迅速占领新市场的核心原因。
中国的 STEM(科学、技术、工程与数学)专业博士是美国的四倍,但技术岗位反而比美国更少,所以这里的竞争烈度要高于美国,大家把这种状况称为“内卷”。中国的同事们很怕自己失去技术优势并被社会的发展甩在身后,所以他们才能迸发出巨大的工作能量。
大家在追求“快速交付”的前提下,代码质量这件事情就推脱给了QA。这件事情的严重后果就是没有人对这个系统有足够的把握它会运行正常。
以单元测试来讲,在传统开发流程中,一般来说,QA 负责对程序进行黑盒测试,调用接口时传确定的参数,再校验接口响应值符合某种预期。而单元测试是一种[白盒测试]要求测试人员了解被测程序的构造,从而构造校验程序各个分支逻辑。显然,后者更具有挑战性,不可能像[黑盒测试]那样能依靠堆积人力的方式快速地完成工作,所以单元测试会导致交付变慢。为了加快发布周期,我们在实践中的分工也逐渐有了改变,开发人员专注于功能创建,而业务领导者则专注于交付,开发人员的测试工作就被忽略了。
开发和 QA 测试是一个长期受关注的经典话题。不同公司有不同的办法,在这一点上,中美软件开发团队的差异较大。Google 算是其中一个典型,其测试总监James Whittaker 于 2011 年曾表示 Google 没有一个“庞大”的测试部门,相反,部分测试工作委派给了开发人员。“测试和开发同时进行。编写一些代码,马上进行测试和构建。接着,编写更多的代码,继续测试。更好的是,在你编码的时候或者编码之前,就计划好你的测试。测试不是一个独立分开的过程,它是开发的一部分。质量不等同于测试;要想有高质量的产品,就要把开发和测试紧密捆绑在一起,直到不分彼此。质量来自开发,而不是测试。”
Google 认为,当将测试职责转移到开发人员身上时,开发人员将会写出更干净的代码,构建出缺陷更少、质量更高的软件。这一切都取决于公司如何组织,以便在不降低质量的情况下降低成本。
我也去问了腾讯/滴滴/阿里/字节的朋友,发现他们也不爱写单测,很多时候写单测就是为了通过编译,为了业务的覆盖率,能绕开就绕开了。