By James Whittaker
在所有我被问及的问题中,最多的就是关于谷歌是如何测试的。尽管在博客中【google testing blog】中有过零碎的解释说明,但还是需要更多的系统阐述。虽然谷歌的技术路线在执行的过程中不断地进化,但公司的测试策略却从来没有变化过。谷歌现在是一家拥有搜索、应用、广告、移动、操作系统等产品的公司,我们在这些涉及到的产品领域里发挥着非常有意义的作用。当我们涉及到一些新的领域或者在旧领域里快速成长的时候,必须要求我们的测试也在同步的扩张和改进。在这个系列文章中提及的测试技术,多数是我们当前正在使用的,还有一些是希望以后在不久的将来可以用到。
首先先介绍一下组织结构,这一部分也可能会让你感到惊奇。其实在谷歌没有真正的测试部门,测试依托在各个产品领域部门里,我们称之为“工程生产力”【原文, Engineering Productivity】。工程生产力部门拥有数量不等的水平或者垂直的工程学科,测试是其中的大头。简单地说,工程生产力部门由以下几部分构成:
1. 一个工具产品团队【a product team】,负责内部和外部开源的促进生产力的工具开发与维护,这些工具会被公司范围内的各种工程师使用。这些工具包括代码分析工具、IDE、测试用例管理系统、自动化测试工具、Build系统、源码管理系统、代码审核调度系统、缺陷管理系统等等。 这些工具的都是为了提高工程师效率的,并且这些工具在策略上的目标多数是为了防止问题的发生,而不是发现问题本身。
2. 一个服务团队【a services team】,给产品部门【注:这里的产品部门团队是和工程生产力部门平级的,例如Search、Gamil、Chrome等产品部门】提供一些专业的建议,包括一系列工具、文档、测试、发布管理、培训等方面,这些专家建议涵盖可靠性、安全、国际化等,甚至包括产品团队面对的功能问题。所有的其他产品领域也都会得到这样的建议指导。
3. 嵌入式的工程师【Embedded engineers】,在需要的时候被产品部门高效地“借”去使用,这些工程师有些会和产品部门的团队坐在一起工作数年,另外一些当他们被需要的时候会被借调到其他的产品团队。谷歌鼓励所有他们的工程师更换产品团队,用以保持团队忙绿且不断有新面孔,并如实地不带有任何偏见与政治。测试人员也是这样,但是可以有节奏地选择更换产品团队的频率。我的下属里,有测试人员已经在Chrome团队工作了好几年,也有一些待了一年半后就换到了其他团队。对于测试经理来说,必须在团队的产品经验和新鲜度上做出很好的平衡。
所以这意味着测试同学向工程生产力部门的经理汇报,但是他们会把自己看成产品部门团队的一员,像搜索、邮箱、和Chrome部门。从组织架构上看,测试都是两个团队的一部分。测试和产品团队坐在一起,参与计划,一起吃饭,共享奖金,享受像全职的产品团队成员一样的待遇。这种单独的组织汇报关系的好处是可以给测试人员之间提供良好的共享信息的讨论机会,好的测试思路可以很容易的在工程生产力部门内部蔓延,无论公司内的哪条产品线,都可以很快地使用这些最好的测试技术。
测试人员的这种项目分离和汇报组织结构也有它的缺点,目前来看,最大的问题是测试人员被看做外部资源。产品部门团队不能对测试人员有太多的依赖,他们自己必须要合理地控制产品质量。是的,没错,在谷歌,是产品部门团队对产品质量负责,而不是测试人员。每个产品部门的开发人员都需要做测试工作,测试人员的任务是为产品部门团队搭建自动化测试基础设施和流程,测试人员让开发可以自给自足地、独立地做完成测试工作。
在这种模式下,我比较喜欢的是,开发和测试将有相同的地位。在质量方面,开发和测试成为了真正的伙伴,最大的质量重担交给本应属于的开发人员,开发的职责就是正确地实现产品功能。另外这样可以保持多对一的开发测试比率,开发人员在数量上远超测试人员,并且测试工作做的越多,开发测试比率就会越大。产品部门团队也会对这样的高开发测试比率而感到骄傲。
好,现在好像大家都是好朋友了,对吧? 相信你已经看到这种模式的一个问题,开发人员不能很好地驱动缺陷【Bug】的运转,开发不会测试。难道我要否认这一点么?不管怎样,我都不会否认,特别是去年在GTAC talk 【GTAC 2010: Turning Quality on its Head,linkhttp://www.youtube.com/watch?v=cqwXUTjcabs】上做了一个开发和测试对抗的游戏后。(友情提示:测试赢了游戏)【这里感觉翻译的不好,原文是: No amount of corporate kool-aid could get me to deny it, especially coming off my GTAC talk last year where I pretty much made a game of developer vs. tester (spoiler alert: the tester wins).】
在谷歌,解决这个问题的办法是将角色再细分,我们通过设立不同的测试角色来解决这两种不同的测试问题。在下一篇文章里,我将详细阐述这些测试角色和谷歌是怎样将测试问题分成两部分来分别解决的。
公直 2012/3/8
英文原文
http://googletesting.blogspot.com/2011/01/how-google-tests-software.html
Tuesday, January 25, 2011 9:08 AM
By James Whittaker
This is the first in a series of posts on this topic.
The one question I get more than any other is “How does Google test?” It’s been explained in bits and pieces on this blog but the explanation is due an update. The Google testing strategy has never changed but the tactical ways we execute it has evolved as the company has evolved. We’re now a search, apps, ads, mobile, operating system, and so on and so forth company. Each of these Focus Areas (as we call them) have to do things that make sense for their problem domain. As we add new FAs and grow the existing ones, our testing has to expand and improve. What I am documenting in this series of posts is a combination of what we are doing today and the direction we are trending toward in the foreseeable future.
Let’s begin with organizational structure and it’s one that might surprise you. There isn’t an actual testing organization at Google. Test exists within a Focus Area called Engineering Productivity. Eng Prod owns any number of horizontal and vertical engineering disciplines, Test is the biggest. In a nutshell, Eng Prod is made of:
1. A product team that produces internal and open source productivity tools that are consumed by all walks of engineers across the company. We build and maintain code analyzers, IDEs, test case management systems, automated testing tools, build systems, source control systems, code review schedulers, bug databases… The idea is to make the tools that make engineers more productive. Tools are a very large part of the strategic goal of prevention over detection.
2. A services team that provides expertise to Google product teams on a wide array of topics including tools, documentation, testing, release management, training and so forth. Our expertise covers reliability, security, internationalization, etc., as well as product-specific functional issues that Google product teams might face. Every other FA has access to Eng Prod expertise.
3. Embedded engineers that are effectively loaned out to Google product teams on an as-needed basis. Some of these engineers might sit with the same product teams for years, others cycle through teams wherever they are needed most. Google encourages all its engineers to change product teams often to stay fresh, engaged and objective. Testers are no different but the cadence of changing teams is left to the individual. I have testers on Chrome that have been there for several years and others who join for 18 months and cycle off. Keeping a healthy balance between product knowledge and fresh eyes is something a test manager has to pay close attention to.
So this means that testers report to Eng Prod managers but identify themselves with a product team, like Search, Gmail or Chrome. Organizationally they are part of both teams. They sit with the product teams, participate in their planning, go to lunch with them, share in ship bonuses and get treated like full members of the team. The benefit of the separate reporting structure is that it provides a forum for testers to share information. Good testing ideas migrate easily within Eng Prod giving all testers, no matter their product ties, access to the best technology within the company.
This separation of project and reporting structures has its challenges. By far the biggest is that testers are an external resource. Product teams can’t place too big a bet on them and must keep their quality house in order. Yes, that’s right: at Google it’s the product teams that own quality, not testers. Every developer is expected to do their own testing. The job of the tester is to make sure they have the automation infrastructure and enabling processes that support this self reliance. Testers enable developers to test.
What I like about this strategy is that it puts developers and testers on equal footing. It makes us true partners in quality and puts the biggest quality burden where it belongs: on the developers who are responsible for getting the product right. Another side effect is that it allows us a many-to-one dev-to-test ratio. Developers outnumber testers. The better they are at testing the more they outnumber us. Product teams should be proud of a high ratio!
Ok, now we’re all friends here right? You see the hole in this strategy I am sure. It’s big enough to drive a bug through. Developers can’t test! Well, who am I to deny that? No amount of corporate kool-aid could get me to deny it, especially coming off my GTAC talk last year where I pretty much made a game of developer vs. tester (spoiler alert: the tester wins).
Google’s answer is to split the role. We solve this problem by having two types of testing roles at Google to solve two very different testing problems. In my next post, I’ll talk about these roles and how we split the testing problem into two parts.
转载:http://sdet.org/?p=130
分享到:
相关推荐
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
<groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'com.google.guava', name: 'guava', ...
- **start**:集合中的第一个文档。 - **next**:集合中的下一个文档。 - **prev**:集合中的前一个文档。 - **contents**:文档目录。 - **index**:文档索引。 - **glossary**:文档中所用词汇的术语表或解释。 - ...
在Java编程语言中,Google翻译API提供了一个强大的工具,允许开发者将文本从一种语言翻译成另一种语言。"google翻译(post版)java源码"是指利用HTTP POST请求与Google翻译API进行交互的Java代码实现。本篇文章将深入...
1. **GFS(Google File System)**:这是Google在2003年发表的一篇论文,首次揭示了他们内部使用的分布式文件系统的工作原理。GFS设计用于处理海量数据,提供高可用性和容错性。它将大文件分割成小块,分布在多个...
在《学术英语1-6单元C篇翻译》中,我们深入探讨了这一现象及其背后的原因,以及企业和个人如何适应这一变革。 每隔十年,总有一种新技术平台出现,带来商业领域的重大变革。从大型计算机到个人电脑,再到互联网,每...
本篇将深入探讨如何利用Java实现多语言翻译。 首先,实现翻译功能的关键在于接入翻译API。常见的翻译API有Google Translate API、Microsoft Azure Translator Text API、IBM Watson Language Translator等。这些API...
在机器翻译中,准确的文本识别是第一步,上下文理解对于准确翻译至关重要。 "机器翻译与人工翻译浅析.pdf"可能会对比机器翻译和人工翻译的优缺点,探讨两者在不同场景下的适用性。机器翻译速度快,效率高,但往往...
本篇将详细介绍一个在Ubuntu下使用的划词翻译工具及其安装步骤。 该工具主要功能是进行单词和句子的实时翻译,支持汉译英和英译汉两种模式。它的工作原理是利用鼠标选择文本,然后调用内置的翻译引擎或者第三方翻译...
在本篇内容中,我们将会详细解读如何利用JavaScript(简称js)结合Google翻译API(即Google AIP)来实现一个PHP语言配置的翻译。具体到实际的应用场景,本例涉及到一个使用PHP编写的多语言系统。由于系统原始语言中...