知名互联网公司和普通公司的软件在应用质量上存在较大差异。
小公司的App使用率很低,即便有问题,开发者也很少收到反馈;但google和facebook这种行业头部的产品则不同,即便是0.01%的影响,那也是一个巨大的量级,会遭到成千上万的投诉,并且有可能引发自媒体的关注和传播。
研究App质量,研究google和facebook再好不过了。
01
Code coverage: a quality control metric
代码覆盖率:一种质量控制标准
针对50%代码写覆盖率测试,那么覆盖就是50%。
包括:语句覆盖,分支覆盖 和 路径覆盖。
因此,100%分支覆盖率意味着100%语句覆盖率,而100%路径覆盖率意味着100%分支和语句覆盖率。
关于代码覆盖率的欺骗性在于,一旦开始组合代码块并测试所有可能的路径和结果,就可以迅速投入几乎无限数量的测试来运行,即使是在中型项目上。
大型应用程序中代码的复杂性解释了两件事:
- 为什么需要自动化测试;
- 为什么找不到100%代码覆盖率的大型应用程序。
02
Code Coverage at Google
在谷歌的代码覆盖率
如果没有极高的质量保证标准,Google的代码覆盖范围将远远超过今天。
幸运的是,Google博客大量介绍了他们的测试和质量保证方法,因此我们可以从他们的方法中涨姿势。
在一篇有关衡量Google代码覆盖率的文章中指出,为什么对代码覆盖率的度量,会在不同开发人员和公司之间产生两极分化:
“有人认为这是一个非常有用的指标,应该在所有代码上强制执行一定比例的覆盖率。有人认为这是用来补充某些测试内容的工具,但不完全相信所涵盖的代码确实经过了良好的测试。其他人则认为,度量覆盖范围是有害的,因为它提供了错误的安全感。”
为了回答代码覆盖率的重要性,以及如何采取行动,Marko在Google上测试了两种覆盖率的实现:每日覆盖和每次提交测试。
每日覆盖范围会测试当天的工作代码,并帮助工程师在错误暴露之前解决错误。每次提交测试仅关注能保证代码正常运行,以确保代码提交顺利进行。
这是用来展现错误行的屏幕截图:
通过这种简单的实现,Google将所有项目的代码覆盖率提高了10%。
还需要注意的是,他们的质量控制流程的这一部分是纯自动化测试的。(稍后将详细介绍该过程的其余部分。)
03
Code coverage at Facebook
在Facebook的代码覆盖率
Facebook通过代码覆盖率工具获得的数据,来确定其自动化测试的部分。
根据一位前Facebook工程师的说法,可以使用几种不同的方法,来最大限度地提高代码覆盖率,这些方法根据代码的语言而有所不同。
毫无疑问,PHPUnit用于对PHP进行单元测试。这是Facebook体系结构的重要组成部分。测试由开发人员,专门的测试人员以及软件本身运行。
为了将测试内容显示给最终用户,Facebook的工程师手动(人工操作并单击按钮)和半自动(模拟用户更快地单击所有按钮的机器)。
测试失败会自动通知开发人员,并记录到数据库中,开发人员可以访问。
Facebook有庞大的开发团队,并且在没有健全的测试文化和严格的代码准则的情况下处理61,000,000行代码(这些行几乎可以无限交互)可以开始引起严重的问题。
但是,关于Facebook的测试流程和对质量检查的态度,更有趣的事情之一是,他们接纳了自己的缺陷。
前Facebook工程师Evan Priestly表示,公司没有任何纯粹的QC角色,而员工应独自负责为自己的代码编写测试。
这是因为社交媒体不是必需的。错误不至于会导致太空火箭燃烧到大气中,也就是错误没有那么可怕。
通过减少对质量的关注,Facebook能够专注于其他事情,例如使公司成为一个有趣的工作场所,从而吸引并留住才华横溢的工程师。如果Facebook更关注质量,它可能会变得不太有趣。社交网络对人们并不是很关键。它不是银行,航天飞机或核反应堆。它不是桥梁或汽车。甚至不是电子邮件(至少在大多数情况下)或电话。这也使Facebook的工程师之间,有更多的合作空间,不会因问题纠缠不清。
04
How Google tests software
Google是如何测试软件的
在2011年的一篇文章中,InfoQ报告称Google的测试部门相对于开发人员来说相对较小,但是运作良好是因为像Facebook一样,每个工程师都应对自己的代码进行测试。 Google通过创建一种测试文化,而不是一个抽象的没有联系的测试部门来实现这一目标。
“质量是开发问题,而不是测试问题。在一定程度上,我们能够将测试实践嵌入到开发中,因此我们创建了一个超增量的过程,如果任何一个增量实在是太多漏洞,可以将错误回滚。我们不仅避免了很多客户问题,而且还大大减少了确保没有回滚类错误所需的测试人员数量。”
Google解释的方式是产品团队拥有质量,而不是测试人员。
测试人员编写允许开发人员进行测试的自动化程序,仅此而已。这样做的好处是:开发人员和测试人员处于平等地位。
- 多对一的开发测试比率;
- 开发人员只需编写代码,而不必花费太多时间进行测试。
正如您可能期望一家知名的公司可以构建任何事物,Google会使用自己的工具来跟踪测试,如 Google Test Case Manager。
05
How Facebook tests software
Facebook是如何测试软件的
Facebook专注于代码所有权,以确保每个开发人员都要对自己的工作质量负责。
这并不意味着它没有经过同行评审,但是:
“编写的每一行代码均由原始作者以外的另一位工程师审核。这具有多种目的:原始工程师有动力确保代码高质量,审阅者思想清新,可能会发现缺陷或提出替代建议,并且通常,有关编码实践和代码本身的知识遍及整个公司领域。”
由于Facebook有大量的beta测试人员(例如,会暗中推出新功能给毫无戒心的用户),这意味着它可以将新版本部署到其用户群的一小部分,并测试新功能,而不会给其他人造成麻烦。
再加上缺乏官方测试人员和代码所有权政策,将获得一个具有以下主要优势的开发环境:
- 工程师可以快速获得新功能并进行迭代;
- 可以在99.999%的用户群通知之前解决问题;
- 不需要专门的测试人员,不需要更好的公司文化来提高代码质量;
Facebook用于测试的工具包括PHPUnit,Watir,Boost,JUnit和HipHop(内部开发的软件)。