查看原文
其他

案例综述 | Google和Facebook如何做质量保证

乔梁 汇编 持续交付2.0 2019-04-16


如果一个bug影响到一个小App的0.01%的用户群,那么它可能就不值得投入精力。如果它影响到谷歌和Facebook的0.01%,那就是成千上万的投诉,以及可能要处理的媒体丑闻。我们都知道那意味着什么。


测试覆盖率



关于代码覆盖率的欺骗之处在于,一旦您开始组合代码块并测试所有可能的路径和结果,即使是在中型项目上,你也会快速地进行接近无限数量的测试。

所以大型应用程序中代码的复杂性也决定了两点:一是自动化测试是必要的;二是你无法一个大型应用,达到100%的代码覆盖率。


谷歌代码的测试覆盖率

如果没有非常高的质量保证标准,谷歌的规模可能不会像今天这么大。幸运的是,谷歌在博客上写了很多关于他们的测试和质量保证的内容,所以我们可以洞察到一些他们所用的方法。


谷歌的办公室



上面两个图的数据来自于衡量谷歌代码覆盖率的文章。谷歌z_rich部门的Marko Ivankovi说明了不同的开发者或公司,对代码覆盖率指标的不同态度。明显就是两极分化的:

有些人认为这是一个非常有用的度量标准,并且应该对所有代码强制执行一定比例的覆盖率一些人认为它是一个有用的工具,可以识别需要更多测试的领域,但不一定相信覆盖的代码确实经过了很好的测试。还有人认为衡量覆盖率是积极有害的,因为它提供了一种错误的安全感。”

为了回答代码覆盖的重要性以及应该如何操作,Marko研究了在Google使用的两种类型测试的测试覆盖:每日构建和预提交构建。

每日构建会测试一天中的WIP代码,在走得快远之前及时提醒工程师,帮助他找到要修复的bug。预提交构建只聚焦于让提交更顺利的那些测试。


下面是谷歌用来标记代码是否被测试覆盖的内部工具截屏:



通过这种简单的工具实现,在10万次提交之后,Google将所有项目的代码覆盖率提高了10%。


同样需要注意的是,他们的质量控制过程的这一部分是纯粹的自动化测试。(稍后将详细介绍该过程的其余部分。



Facebook的办公室

Facebook的代码覆盖率

Facebook通过代码覆盖工具获得的数据来通知他们的自动化测试结果。根据一位前Facebook工程师的说法,代码覆盖率保持在最高水平,根据代码语言的不同,有几种不同的方法:

  • PHPUnit 毫无疑问,它被用于对PHP进行单元测试。这是Facebook架构的重要组成部分。测试可以由开发人员、专职测试人员或者软件本身触发运行。

  • 对于测试那些显示给用户的内容,Facebook工程师使用 Watir这个工具,测试包括手工和半自动化。

失败的测试会自动通知开发者,并被登记到开发者可以查看的数据库中。

Facebook也有大量的开发工程师,如果没有良好的测试文化和严格的代码覆盖指导方针,在6100万行代码上工作将开始导致严重的问题。

然而,关于Facebook的测试过程和对QA的态度,更有趣的事情之一是它接受自己产品可以有缺陷这一事实。

EvanPriestly,前Facebook工程师,说公司没有任何纯粹的质量控制角色,员工只负责为他们自己的代码编写测试。

 这是因为社交媒体并不是交易型产品。缺陷不会导致火箭在进入大气层后爆炸。

“通过减少对质量的投入,Facebook能够专注于其他事情,比如让公司成为一个有趣的工作场所,这样可以吸引和留住有才华的工程师。如果Facebook非常注重质量,它可能就没那么有趣了。[…]社交网络对人们来说并不重要。这很重要,它不是银行、航天飞机或核反应堆。不是桥,也不是车。它甚至不是电子邮件(至少在大多数情况下)或电话。这也给了Facebook更多的工作空间。”

测试文化


传统上,开发人员写代码,QC人员去测试它,QA保证整个流程是高效的和无漏洞的。然而,谷哥和Facebook显示并没有用传统方式构建其组织结构。

两个公司都强调个人的责任(Facebook甚至有办法让提交烂代码的工程师感到羞愧),将测试看成是文化的一部分,而不是一个跟在开发人员后面打扫垃圾的部门。




在谷歌对一个游戏相关API开发者(game-related API developer)的工作描述中,它具体要求是: “与产品工程团队工作,改进我们的产品,通过从开发者那里带来回API的反馈,reviewAPI的设计,测试新特性”,以及其它一些要求。

谷歌招聘工程师时,要求他不害怕做测试,这是整个招聘测试的起点。

Facebook也是一样。在工作描述中就让申请都知道,测试是自己工作的一部分。 如一个发布工程师(release engineer)要负责 “管理源代码管理系统, 自动化的构建和回归测试, 开发一些用于软件部署的构建和监控工具。

谷歌如何测试软件

在2011年的文章 ,InfoQ 说谷歌的测试部门相对于开发人员来说比较少,但运行的还不错,因为与Facebook一样,每个开发工程师负责他们自己代码的测试。 

谷歌通过创建测试文化达成这一点,而不是通过一个抽离且无链接的独立部门达成的。对于20亿行代码库(2 billion lines of code )来说,这个成就可以说是一个巨大的成功。

“质量是一个开发问题,不是测试问题。也就是说,我们能将测试实践嵌入到开发活动中,我们创建了一个流程,不只是增量开发,而且如果某个增量出现问题,那个增量可以单独回滚。我们不仅阻止了大量的客户问题,而且大量地减少那些用于提前发现召回类缺陷的测试人员。”

谷歌解释这个现象是因为产品团队负责质量,而不是测试人员。测试人员写自动化让开发人员用它们来做测试,不多也不少。

这样的好处是:

  • 开发人员和测试人员是平等的。

  • 多对一的开发测试比

  • 开发人员只要写代码,不用非要花太多时间做测试

一个知名的大公司有能力自己制造任何东西。谷歌使用自己的工具跟踪测试-谷歌测试用例管理器(Google Test Case Manager),以及自动化测试。

Facebook如何测试软件

Facebook通过聚焦于代码ownership 来保证每个人都自己全面负责他们的工作质量。

这并不是说,没有他们没有peer-reviewed, 而是:

“编写的每一行代码都由不同于原始作者的工程师进行审查。这有多种用途:最初的工程师有动机确保代码的高质量,审查员有一个新的想法,可能会发现缺陷或建议替代方案,而且,一般来说,有关编码实践和代码本身的知识在整个公司传播。”

因为Facebook有大量的beta testers(例如对新特性没有预期的用户群就是指暗部署 dark launched),这意味着它可以将新的构建部署到其用户基础的一小部分,并测试新功能的功能,而不会给其余部分带来太多麻烦。

这种无自有测试人员的做法,以及代码责任制,就得得到一种公司的工程环境,它带来的主要好处是:

  • 工程师可以快速地发布新特性,并不断迭代

  • 在99.999%的用户知道之前,缺陷就被修复了

  • 不需要专门的测试人员,通过强调代码质量得更好的公司文化

Facebook用于测试的工具包括PHPUnit, Watir, Boost, JUnit, and HipHop (internally developed software).

想要了解更多,请扫码参与4月20日下午,在北京举行的《持续交付2.0》研讨会~

本活动还有少量名额开放,机会有限,速速报名




我的新书《持续交付2.0》现在就可以在京东购买~

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存